Click to See Complete Forum and Search --> : ADO,Oracle Stored Procedure and Recordset
December 28th, 1999, 10:03 PM
i want make a stored procedure in oracle8 which can return a recordset,
i also want to use the recordset by ADO,could someone tell me how to
realize it?
thank you.
FWALGMan
December 28th, 1999, 10:43 PM
The trickiest part is getting the right Microsoft Driver for the job. Certain drivers dont work well with Oracle. The best driver I have found is Microsoft ODBC Driver for Oracle (MSORCL32). The only way I have found in Oracle to return a recordset to ADO is by using Oracle tables. Here is an example. It creates a package and stored proc and returns a recordset with two columns. There is good information on this in of all places Microsofts MSDN website:
CREATE OR REPLACE PACKAGE import.HOWLMARSCRIPTS AS
TYPE t_id is TABLE of NUMBER
INDEX BY BINARY_INTEGER;
TYPE t_JobTitle is TABLE of VARCHAR2(10)
INDEX BY BINARY_INTEGER;
TYPE t_Description is TABLE of VARCHAR2(100)
INDEX BY BINARY_INTEGER;
PROCEDURE ReturnRecordSet(ReturnCode IN OUT NUMBER,
JobTitle OUT t_jobTitle,
Description OUT t_description
);
END HOWLMARSCRIPTS;
/
CREATE OR REPLACE PACKAGE BODY import.HOWLMARSCRIPTS AS
PROCEDURE ReturnRecordSet(ReturnCode IN OUT NUMBER,
JobTitle OUT t_jobTitle,
Description OUT t_description
)
IS
i NUMBER DEFAULT 1;
CURSOR fdJobTitleInfo IS
SELECT Jobtitle, description
FROM import.fdjobtitle;
BEGIN
IF NOT fdJobTitleInfo%ISOPEN THEN -- open the cursor if
OPEN fdJobTitleInfo; -- not already open
END IF;
LOOP
FETCH fdJobTitleInfo INTO jobTitle(i),Description(i);
EXIT WHEN (fdJobTitleInfo%NOTFOUND);
i := i + 1;
END LOOP;
CLOSE fdJobTitleInfo;
-- Success!
returncode := 0;
EXCEPTION
WHEN OTHERS THEN
CLOSE fdJobTitleInfo;
RAISE;
returncode := -1;
END ReturnRecordSet;
END HOWLMARSCRIPTS;
/
December 29th, 1999, 12:11 AM
thank you for your suggestion!
i also donot know how to set the parameter of SP when i call the SP
in VB source code,could you tell me more a little? thank you!
FWALGMan
December 29th, 1999, 05:19 PM
The basics are as follows in this ADO Subroutine. This has one parameter and returns a resultset of up to 100,000 rows. This is a limitation in the driver that you have to specify the max number of rows to return. If you have any further questions I will be glad to answer them, or you can search msdn.microsoft.com on Oracle Recordsets for more details:
Private Sub cmbShipNumEnd_DropDown()
Dim sSQL As String
Dim CPw1 As ADODB.Command
Dim Rs As ADODB.Recordset
On Error GoTo Err_cmbShipNumEnd_DropDown
sSQL = "{call " & gsProteanSchema & "MPMSCRIPTS.MPMShipDocNumEnd (?,{resultset 100000, outShipNum})}"
Set CPw1 = New ADODB.Command
CPw1.ActiveConnection = goRDOConnection
CPw1.CommandText = sSQL
CPw1.CommandType = adCmdText
' Set Values for In Parameters
CPw1.Parameters(0).Value = cmbShipNumStart.Text
' Open the resultset based on the stored procedures and populate the
' combobox.
Set Rs = New ADODB.Recordset
Rs.CursorType = adOpenStatic
Set Rs = CPw1.Execute
cmbShipNumEnd.Clear
cmbShipNumEnd.AddItem ""
While Not Rs.EOF
If Not IsNull(Rs(0).Value) Then
cmbShipNumEnd.AddItem Rs(0).Value
End If
Rs.MoveNext
Wend
' Close the query and resultset objects to free up memory
Rs.Close
Set Rs = Nothing
Set CPw1 = Nothing
Exit Sub
Err_cmbShipNumEnd_DropDown:
' Clean up any possible open objects on errors
If Rs.State = adStateOpen Then
Rs.Close
Set Rs = Nothing
End If
Set CPw1 = Nothing
MsgBox "ERROR: " & Err.Number & " (cmbShipNumEnd.DropDown) " & Err.Description, vbInformation, "Print Shipping Documents"
End Sub
January 6th, 2000, 02:42 AM
hello
your suggestion has helped me very much,thank you.
could help me with another question?
this is a stored procedure:
CREATE OR REPLACE PACKAGE BODY sp1
AS
PROCEDURE sp
(INCode IN OUT NUMBER,
pCD IN VARCHAR2(4) )
IS
CURSOR customer IS
SELECT ...
FROM...
where... ;
BEGIN
FOR singlecustomer IN customer
....
now i want to define the cursor customer which the sql statement
is depend on the process of the parameter 'incode' and 'pcd',
but the cursor has to be declared in the head of procedure...
thank you again!
FWALGMan
January 8th, 2000, 01:27 PM
Sure not a problem. The Oracle Documentation has alot of information about Dynamic Stored Procedures. Here is a sample one though. Hope this helps. The Oracle 8 Web Page Documentation is very good for this kind of stuf:
-- Dynamic SQL Cursor for Retrieving Print TareWeight Field
source_cursor := dbms_sql.open_cursor;
DBMS_SQL.PARSE(source_cursor, 'SELECT ' || FIELDTAREWEIGHT || ' FROM ' || PRINTFIELDTABLE ||
'PF, fdAddon fdA WHERE PF.ObjectID = fdA.ObjectID
AND fdA.PARENTOBJECTID = ' || SOLDTOOBJECTID, DBMS_SQL.V7);
DBMS_SQL.DEFINE_COLUMN(source_cursor, 1, PRINTTAREWEIGHT);
ignore := DBMS_SQL.EXECUTE(source_cursor);
IF DBMS_SQL.FETCH_ROWS(source_cursor)>0 THEN -- get column values of the row
DBMS_SQL.COLUMN_VALUE(source_cursor, 1, PRINTTAREWEIGHT);
ELSE
raise_application_error(-20101, 'DATA INTEGRITY - Cannot find Measurement Options for the trading partner ' || SOLDTO);
END IF;
DBMS_SQL.CLOSE_CURSOR(source_cursor);
EXCEPTION
WHEN OTHERS THEN
IF DBMS_SQL.IS_OPEN(source_cursor) THEN
DBMS_SQL.CLOSE_CURSOR(source_cursor);
END IF;
IF inShippingLine%ISOPEN THEN
CLOSE inShippingLine;
END IF;
RAISE;
END;
January 14th, 2000, 01:36 PM
Create package pkname as
typr t_table is of varchar2(10) indexed by binary_integer
function p1(r t_table) return t_table;
end ;
create Package body pkname as
Function p1(t in out t_table) return t_table as
cursor c1 is select empname from emp;
i Number
begin
for i in c1
Loop
t(i) = c1.ename
i = i + 1
end loop
return t;
End p1
end;
If I am calling this procedure in Vb what is the parameter i must pass.
Because in Vb we don't have anything like Table.
So how do U proceed.
codeguru.com
Copyright Internet.com Inc., All Rights Reserved.