Attribute VB_Name = "spCall"
'----------------------------------------------------------------------------
'
' (c) Copyright IBM Corp. 2007 All rights reserved.
' 
' The following sample of source code ("Sample") is owned by International 
' Business Machines Corporation or one of its subsidiaries ("IBM") and is 
' copyrighted and licensed, not sold. You may use, copy, modify, and 
' distribute the Sample in any form without payment to IBM, for the purpose of 
' assisting you in the development of your applications.
' 
' The Sample code is provided to you on an "AS IS" basis, without warranty of 
' any kind. IBM HEREBY EXPRESSLY DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR 
' IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
' MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Some jurisdictions do 
' not allow for the exclusion or limitation of implied warranties, so the above 
' limitations or exclusions may not apply to you. IBM shall not be liable for 
' any damages you suffer as a result of using, copying, modifying or 
' distributing the Sample, even if IBM has been advised of the possibility of 
' such damages.
'----------------------------------------------------------------------------
'
' SOURCE FILE NAME: spCall.bas
'
' SAMPLE: How to call stored procedures
'
'         This module calls the stored procedures in C, C++, CLI or JAVA.
'         Most of the stored procedures are written in C, C++, CLI and JAVA,
'         but some of them are only supported in one or more languages.
'
'         Before running this sample, you must create and catalog the
'         stored procedures in the spserver stored procedure library.
'         Versions of the spserver sample program are provided with
'         the C, C++, CLI, and Java samples. To create and catalog
'         the spserver sample in the language of your choice,
'         please follow the directions in the corresponding
'         README file.
'
' STORED PROCEDURES IN C/C++/CLI/JAVA:
'         OUT_LANGUAGE
'         IN_PARAMS
'         OUT_PARAM
'         INOUT_PARAM
'         ALL_DATA_TYPES
'         CLOB_EXTRACT
'         ONE_RESULT_SET
'         TWO_RESULT_SETS
'
' STORED PROCEDURES ONLY IN C/C++/CLI:
'         DB2SQL_EXAMPLE
'         DBINFO_EXAMPLE
'         MAIN_EXAMPLE
'
' STORED PROCEDURES ONLY IN JAVA:
'         DECIMAL_TYPE
'
' FORMS USED:
'         frmMain (Demo.frm)
'
'----------------------------------------------------------------------------
'
' For more information on the sample programs, see the README file.
'
' For information on building ADO applications with Visual Basic, 
' see the Developing ADO.NET and OLE DB Applications book.
'
' For information on using SQL statements, see the SQL Reference.
'
' For the latest information on programming, compiling, and running DB2
' applications, visit the DB2 Information Center:
'     http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.jsp
'----------------------------------------------------------------------------

Option Explicit

'This procedure calls the stored procedure OUT_LANGUAGE, which returns
'the language in which the stored procedure implemented.
Public Function CallSP_OUT_LANGUAGE(con As ADODB.Connection) As String

  'setup connection and datasource
  Dim cmd As New ADODB.Command
  Set cmd.ActiveConnection = con

  'setup stored procedure info to be called
  cmd.CommandText = "OUT_LANGUAGE"
  cmd.CommandType = adCmdStoredProc
'
' The following section of code is not required when using:
' cmd.Parameters.Refresh
' But it can make execution faster. It eliminates the need
' for ADO to fetch the parameter metrics from the server.
'
  'define parameter(s)
  Dim param As New ADODB.Parameter
  With param
    .Name = "LANGUAGE"
    .Type = adChar
    .Size = 8
    .Direction = adParamOutput
    cmd.Parameters.Append param
  End With
  Set param = Nothing

  'call the stored procedure
  cmd.Execute

  'return the result
  CallSP_OUT_LANGUAGE = cmd.Parameters("LANGUAGE").Value

  'release the object
  Set cmd = Nothing

End Function

'This procedure calls the stored procedure IN_PARAMS, which takes
'input parameters and modifies the salary of employees in the
'"STAFF" table
Public Function CallSP_IN_PARAMS(con As ADODB.Connection)

  'setup connection and datasource
  Dim cmd As New ADODB.Command
  Set cmd.ActiveConnection = con

  'setup stored procedure info to be called
  cmd.CommandText = "IN_PARAMS"
  cmd.CommandType = adCmdStoredProc

  'fill in parameter info from stored procedure
  cmd.Parameters.Refresh

  'set up the parameters
  cmd.Parameters("LOWSAL").Value = 15000
  cmd.Parameters("MEDSAL").Value = 20000
  cmd.Parameters("HIGHSAL").Value = 25000
  cmd.Parameters("DEPARTMENT").Value = "E11"

  'call the stored procedure
  cmd.Execute

  'release the object
  Set cmd = Nothing

End Function

'This procedure calls the stored procedure OUT_PARAM, which returns
'the median salary of employees in the "STAFF" table
Public Function CallSP_OUT_PARAM(con As ADODB.Connection) As Double

  'setup connection and datasource
  Dim cmd As New ADODB.Command
  Set cmd.ActiveConnection = con

  'setup stored procedure info to be called
  cmd.CommandText = "OUT_PARAM"
  cmd.CommandType = adCmdStoredProc

  'fill in parameter info from stored procedure
  cmd.Parameters.Refresh

  'call the stored procedure
  cmd.Execute

  'return the result
  CallSP_OUT_PARAM = cmd.Parameters("MEDIANSALARY").Value

  'release the object
  Set cmd = Nothing

End Function

'This procedure calls the stored procedure INOUT_PARAM, which takes
'a parameter as input and returns to the same parameter as output
'the median salary of employees whose salary is greater than the
'input parameter in the "STAFF" table
Public Function CallSP_INOUT_PARAM(con As ADODB.Connection, _
                                   ByVal dblMedian As Double) As Double

  'setup connection and datasource
  Dim cmd As New ADODB.Command
  Set cmd.ActiveConnection = con

  'setup stored procedure info to be called
  cmd.CommandText = "INOUT_PARAM"
  cmd.CommandType = adCmdStoredProc

  'fill in parameter info from stored procedure
  cmd.Parameters.Refresh

  'set up the parameters
  cmd.Parameters("MEDIANSALARY").Value = dblMedian

  'call the stored procedure
  cmd.Execute

  'return the result
  CallSP_INOUT_PARAM = cmd.Parameters("MEDIANSALARY").Value

  'release the object
  Set cmd = Nothing

End Function

'This procedure calls the stored procedure ALL_DATA_TYPES, which
'returns values in various data types
Public Function CallSP_ALL_DATA_TYPES(con As ADODB.Connection) _
  As Parameters

  'setup connection and datasource
  Dim cmd As New ADODB.Command
  Set cmd.ActiveConnection = con

  'setup stored procedure info to be called
  cmd.CommandText = "ALL_DATA_TYPES"
  cmd.CommandType = adCmdStoredProc

  'fill in parameter info from stored procedure
  cmd.Parameters.Refresh

  'set up the parameters
  cmd.Parameters("SMALL").Value = 32000
  cmd.Parameters("INTIN").Value = 2147483647
  cmd.Parameters("BIGIN").Value = 922337203685480#
  cmd.Parameters("REALIN").Value = 100000
  cmd.Parameters("DOUBLEIN").Value = 2500000

  'call the stored procedure
  cmd.Execute

  'return the result
  Set CallSP_ALL_DATA_TYPES = cmd.Parameters

  'release the object
  Set cmd = Nothing

End Function

'This procedure calls the stored procedure DECIMAL_TYPE, which
'returns a value in decimal data type
Public Function CallSP_DECIMAL_TYPE(con As ADODB.Connection) As Variant

  'setup connection and datasource
  Dim cmd As New ADODB.Command
  Set cmd.ActiveConnection = con

  'setup stored procedure info to be called
  cmd.CommandText = "DECIMAL_TYPE"
  cmd.CommandType = adCmdStoredProc

  'fill in parameter info from stored procedure
  cmd.Parameters.Refresh

  'set up the parameters
  cmd.Parameters("DECIMALIN").Value = 400000

  'call the stored procedure
  cmd.Execute

  'return the result
  CallSP_DECIMAL_TYPE = cmd.Parameters("DECIMALIN").Value

  'release the object
  Set cmd = Nothing

End Function

'This procedure calls the stored procedure CLOB_EXTRACT, which returns
'the department information portion of the resume of an employee
Public Function CallSP_CLOB_EXTRACT(con As ADODB.Connection) As String

  'setup connection and datasource
  Dim cmd As New ADODB.Command
  Set cmd.ActiveConnection = con

  'setup stored procedure info to be called
  cmd.CommandText = "CLOB_EXTRACT"
  cmd.CommandType = adCmdStoredProc

  'fill in parameter info from stored procedure
  cmd.Parameters.Refresh

  'set up the parameters
  cmd.Parameters("NUMBER").Value = "000140"  'employee ID

  'call the stored procedure
  cmd.Execute

  'return the result
  CallSP_CLOB_EXTRACT = cmd.Parameters("BUFFER").Value

  'release the object
  Set cmd = Nothing

End Function

'This procedure calls the stored procedure ONE_RESULT_SET and passes
'an IN parameter to the stored procedure.  It returns a recordset
'that contains all rows from the "STAFF" table where "SALARY" is
'greater than the value of the IN parameter.
Public Function CallSP_ONE_RESULT_SET(con As ADODB.Connection) _
  As ADODB.Recordset

  'setup connection and datasource
  Dim cmd As New ADODB.Command
  Set cmd.ActiveConnection = con

  'setup stored procedure info to be called
  cmd.CommandText = "ONE_RESULT_SET"
  cmd.CommandType = adCmdStoredProc

  'fill in parameter info from stored procedure
  cmd.Parameters.Refresh

  'set up the parameter value
  '(it can be any arbitrary value, 17645 is the median)
  cmd.Parameters("SALVALUE").Value = 17645

  'call the stored procedure and return a recordset
  Set CallSP_ONE_RESULT_SET = cmd.Execute

  'release the object
  Set cmd = Nothing

End Function

'This procedure calls the stored procedure TWO_RESULT_SETS and passes
'an IN parameter to the stored procedure.  It returns two recordsets,
'one contains all rows from the "STAFF" table where "SALARY" is
'greater than the value of the IN parameter, and the other one contains
'all rows from the "STAFF" table where "SALARY" is less than the value
'of the IN parameter.
Public Function CallSP_TWO_RESULT_SETS(con As ADODB.Connection) _
  As ADODB.Recordset

  'setup connection and datasource
  Dim cmd As New ADODB.Command
  Set cmd.ActiveConnection = con

  'setup stored procedure info to be called
  cmd.CommandText = "TWO_RESULT_SETS"
  cmd.CommandType = adCmdStoredProc

  'fill in parameter info from stored procedure
  cmd.Parameters.Refresh

  'set up the parameter value
  '(it can be any arbitrary value, 17645 is the median)
  cmd.Parameters("SALARY").Value = 17645

  'call the stored procedure and return a recordset
  Set CallSP_TWO_RESULT_SETS = cmd.Execute

  'release the object
  Set cmd = Nothing

End Function

'This procedure calls the stored procedure DB2SQL_EXAMPLE and passes
'a JOB as an IN parameter to the stored procedure.  It returns an
'average salary of the job as an OUT parameter by executing a SQL
'statement in the stored procedure.
Public Function CallSP_DB2SQL_EXAMPLE(con As ADODB.Connection, _
                                      strJob As String) As Double

  'setup connection and datasource
  Dim cmd As New ADODB.Command
  Set cmd.ActiveConnection = con

  'setup stored procedure info to be called
  cmd.CommandText = "DB2SQL_EXAMPLE"
  cmd.CommandType = adCmdStoredProc

  'fill in parameter info from stored procedure
  cmd.Parameters.Refresh

  'set up the parameter value
  cmd.Parameters("JOB").Value = strJob

  'call the stored procedure
  cmd.Execute

  'return the result
  CallSP_DB2SQL_EXAMPLE = cmd.Parameters("SALARY").Value

  'release the object
  Set cmd = Nothing

End Function

'This procedure calls the stored procedure DB2SQL_EXAMPLE and passes
'a JOB as an IN parameter to the stored procedure.  It returns a
'set of parameters containing informations of the table and the
'database.
Public Function CallSP_DBINFO_EXAMPLE(con As ADODB.Connection, _
                                      strJob As String) _
  As ADODB.Parameters

  'setup connection and datasource
  Dim cmd As New ADODB.Command
  Set cmd.ActiveConnection = con

  'setup stored procedure info to be called
  cmd.CommandText = "DBINFO_EXAMPLE"
  cmd.CommandType = adCmdStoredProc

  'fill in parameter info from stored procedure
  cmd.Parameters.Refresh

  'set up the parameter value
  cmd.Parameters("JOB").Value = strJob

  'call the stored procedure
  cmd.Execute

  'return the result
  Set CallSP_DBINFO_EXAMPLE = cmd.Parameters

  'release the object
  Set cmd = Nothing

End Function

'This procedure calls the stored procedure MAIN_EXAMPLE and passes
'a JOB as an IN parameter to the stored procedure.  It returns an
'average salary of the job as an OUT parameter by executing a SQL
'statement in the stored procedure.
Public Function CallSP_MAIN_EXAMPLE(con As ADODB.Connection, _
                                    strJob As String) As Double

  'setup connection and datasource
  Dim cmd As New ADODB.Command
  Set cmd.ActiveConnection = con

  'setup stored procedure info to be called
  cmd.CommandText = "MAIN_EXAMPLE"
  cmd.CommandType = adCmdStoredProc

  'fill in parameter info from stored procedure
  cmd.Parameters.Refresh

  'set up the parameter value
  cmd.Parameters("JOB").Value = strJob

  'call the stored procedure
  cmd.Execute

  'return the result
  CallSP_MAIN_EXAMPLE = cmd.Parameters("SALARY").Value

  'release the object
  Set cmd = Nothing

End Function

'This procedure gets all available stored procedure names
Public Function GetProcedureNames(con As ADODB.Connection) As String

  Dim cat As New ADOX.Catalog
  Dim pro As ADOX.Procedure
  Dim strTokens As String

  'open the Catalog
  cat.ActiveConnection = con

  'refresh the Procedures collection
  cat.Procedures.Refresh

  'return names of all Procedures
  strTokens = ""
  For Each pro In cat.Procedures
    strTokens = strTokens & pro.Name & " "
  Next
  GetProcedureNames = strTokens

  'release the objects
  Set pro = Nothing
  Set cat = Nothing

End Function

'This procedure gets all available stored procedure names
Public Function GetProcedures(con As ADODB.Connection) As Object

  'define and initialize new Catalog object
  Dim cat As New ADOX.Catalog
  cat.ActiveConnection = con

  'refresh the Procedures collection
  cat.Procedures.Refresh

  'return information of all Procedures
  Set GetProcedures = cat.Procedures

  'release the objects
  Set cat = Nothing

End Function