Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.misc -> Re: passing vb-arrays to oracle stored procedures

Re: passing vb-arrays to oracle stored procedures

From: Matthias Gresz <GreMa_at_t-online.de>
Date: 1998/03/06
Message-ID: <6doq55$3mi$2@news00.btx.dtag.de>

On Thu, 5 Mar 1998 16:36:27 -0500, "George Meltser" <meltser_at_aigfpc.com> wrote: Hi,

I'll just copy code from our project, which might give you hint's how to do. You must use Oracle's object for OLE to achieve this. OO4O is shipped with Oracle.

Oracle-Procedure and Type Definitions:

TYPEN.T_NUMARRAY is defined as:

        TYPE T_NUMARRAY is table of NUMBER index by BINARY_INTEGER;

	PROCEDURE SpeicherNachweis 	(wArraySize IN INTEGER, 
					awArt IN TYPEN.T_NUMARRAY,
					adwBezugsnummer IN TYPEN.T_NUMARRAY,
					szInfo IN  VARCHAR2,
					szAktion IN  VARCHAR2,
					dAktionsDatum IN  Date ,
					dWiedervorlageDatum IN  Date ,
					fWVErledigt IN  NUMBER ,
					wKBNUMMER IN  NUMBER,
					dwNACHWEIS IN OUT NUMBER
				) IS
	--wArraySize IN INTEGER, Number of entires in array
	--awArt IN NUMARRAY, 	PL/SQL table
	--awBezugsnummer IN NUMARRAY, PL/SQL table
	--szInfo IN  VARCHAR2,
	--szAktion IN  VARCHAR2,
	--dAktionsDatum IN  Date ,
	--dAktionsZeit IN  Date ,
	--dWiedervorlageDatum IN  Date ,
	--dWiedervorlageZeit IN  Date ,
	--fWVErledigt IN  NUMBER ,
	--wKBNUMMER IN  NUMBER,
	--dwNACHWEIS IN NUMBER	

	I	Number;
	Begin



		If dwNACHWEIS = 0 THEN
			SELECT MAX(INTINDEX) + 1 INTO dwNACHWEIS FROM NACHWEISE;
			INSERT INTO NACHWEIS (	INTINDEX,
						DATUM          ,
 						UHRZEIT        ,
 						AKTION         ,
						AKTIONSDATUM   ,
	 					AKTIONSZEIT    ,
 						KBNR           ,
 						WVDATUM        ,
 						WVZEIT         ,
 						WVERLEDIGT     ,
	 					INFOTEXT)

			VALUES (		dwNACHWEIS ,
						SYSDATE,'YYYY-MM-DD' ,
						szAktion ,
						to_date(dAktionsDatum,'YYYY-MM-DD') ,
						wKBNUMMER ,
						to_date(dWiedervorlageDatum,'YYYY-MM-DD')  ,
						fWVErledigt  ,
						szInfo );
		ELSE
			UPDATE NACHWEIS SET
 						AKTION =  szAktion       ,
						AKTIONSDATUM = dAktionsDatum   ,
 						KBNR =   wKBNUMMER        ,
 						WVDATUM = dWiedervorlageDatum        ,
 						WVERLEDIGT = fWVErledigt      ,
	 					INFOTEXT = szInfo 
			WHERE 
				INTINDEX = dwNACHWEIS;
		END IF;
		DELETE FROM NACHWEISPERSON WHERE NACHWEISNUMMER = dwNACHWEIS;

		FOR I IN 1..wArraySize LOOP
			INSERT INTO NACHWEISPERSON
				(	NACHWEISNUMMER         ,
					ART                    ,
					BEZUGSNUMMER           ,
					AKTIONSDATUM           
				)
			VALUES (	
					dwNACHWEIS ,
					awArt(I),
					adwBezugsNummer(I),
					dAktionsDatum  
				);            		
		END LOOP;
	exception
		When Others Then
			RAISE;
	
	end SpeicherNachweis 	;




VB:

Function fOraNachweisErstellen (nwAktuell As Nachweis, awArt() As Integer, adwBezugsperson() As Long) As Integer

'nwAktuell  : Structure
'awArt:     array containing integers
'adwPersonen:   array with longs
'Returns: True, in case of success, else False

Dim oLclOraPArray1 As Object
Dim oLclOraPArray2 As Object
Dim oLclOraDatabase As Object
Dim wLclAnzahlPersonen As Integer
Dim wLclLauf As Integer
Dim szLclFehler As String
Dim szLclSQL As String
Dim fLclWährendtrans As Integer     

On Error GoTo OraNachweisErstellenFehler

    fLclWährendtrans = False
    wLclAnzahlPersonen = UBound(awArt)

    Set oGblOraSession = CreateObject("OracleInProcServer.XOraSession")     Set oLclOraDatabase = oGblOraSession.OpenDatabase(szGblMaklerDB, szGblUSER & "/" & szGblPWD, 0&)  

    oLclOraDatabase.Parameters.Add "ArraySize", wLclAnzahlPersonen, ORAPARM_INPUT     oLclOraDatabase.Parameters("ArraySize").ServerType = ORATYPE_NUMBER

    oLclOraDatabase.Parameters.AddTable "awArt", ORAPARM_INPUT, ORATYPE_NUMBER, wLclAnzahlPersonen, 22     oLclOraDatabase.Parameters.AddTable "adwBezugsnummer", ORAPARM_INPUT, ORATYPE_NUMBER, wLclAnzahlPersonen, 22

    oLclOraDatabase.Parameters.Add "szInfo", "", ORAPARM_INPUT     oLclOraDatabase.Parameters("szInfo").ServerType = ORATYPE_VARCHAR2

    oLclOraDatabase.Parameters.Add "szAktion", "", ORAPARM_INPUT     oLclOraDatabase.Parameters("szAktion").ServerType = ORATYPE_VARCHAR2

    oLclOraDatabase.Parameters.Add "dAktionsDatum", Date, ORAPARM_INPUT     oLclOraDatabase.Parameters("dAktionsDatum").ServerType = ORATYPE_DATE

    oLclOraDatabase.Parameters.Add "dWiedervorlageDatum", Null, ORAPARM_INPUT     oLclOraDatabase.Parameters("dWiedervorlageDatum").ServerType = ORATYPE_DATE

    oLclOraDatabase.Parameters.Add "fWVErledigt", -1, ORAPARM_INPUT     oLclOraDatabase.Parameters("fWVErledigt").ServerType = ORATYPE_NUMBER

    oLclOraDatabase.Parameters.Add "wKBNUMMER", 1, ORAPARM_INPUT     oLclOraDatabase.Parameters("wKBNUMMER").ServerType = ORATYPE_NUMBER     

    oLclOraDatabase.Parameters.Add "dwNWNUMMER", 0, ORAPARM_INPUT     oLclOraDatabase.Parameters("dwNWNUMMER").ServerType = ORATYPE_NUMBER

    oLclOraDatabase.Parameters("szInfo").Value = nwAktuell.szInfoText
    oLclOraDatabase.Parameters("szAktion").Value = nwAktuell.szAktion
    oLclOraDatabase.Parameters("dAktionsDatum").Value = DateValue(nwAktuell.szAktionsDatum)
    oLclOraDatabase.Parameters("dWiedervorlageDatum").Value = DateValue(nwAktuell.szWVDatum)
    oLclOraDatabase.Parameters("fWVErledigt").Value = nwAktuell.szWVErledigt
    oLclOraDatabase.Parameters("wKBNUMMER").Value = nwAktuell.szKBNummer
    oLclOraDatabase.Parameters("dwNWNUMMER").Value = nwAktuell.szIndex


    Set oLclOraPArray1 = oLclOraDatabase.Parameters("awArt")     Set oLclOraPArray2 = oLclOraDatabase.Parameters("adwBezugsnummer")      

    For wLclLauf = 0 To wLclAnzahlPersonen - 1 'PArray begins with 0!!!!!!!

        oLclOraPArray1.put_Value awArt(wLclLauf + 1), wLclLauf
        oLclOraPArray2.put_Value adwBezugsperson(wLclLauf + 1), wLclLauf
    Next wLclLauf
     
    

    szLclSQL = "Begin T1.PACK_DBACCESS.SpeicherNachweis(:ArraySize ,"
    szLclSQL = szLclSQL & ":awArt ,"
    szLclSQL = szLclSQL & ":adwBezugsnummer ,"
    szLclSQL = szLclSQL & ":szInfo ,"
    szLclSQL = szLclSQL & ":szAktion ,"
    szLclSQL = szLclSQL & ":dAktionsDatum  ,"
    szLclSQL = szLclSQL & ":dWiedervorlageDatum  ,"
    szLclSQL = szLclSQL & ":fWVErledigt ,"
    szLclSQL = szLclSQL & ":wKBNUMMER,"
    szLclSQL = szLclSQL & ":dwNWNUMMER"

    szLclSQL = szLclSQL & ");"
    szLclSQL = szLclSQL & " End;"

    oGblOraSession.DbBeginTrans
    fLclWährendtrans = True

     
        oLclOraDatabase.DbExecuteSQL (szLclSQL)
    

    oGblOraSession.DbCommitTrans
    fLclWährendtrans = False       

    Set oLclOraPArray1 = Nothing
    Set oLclOraPArray2 = Nothing
    Set oLclOraDatabase = Nothing
    Set oGblOraSession = Nothing     

    On Error GoTo 0
    fOraNachweisErstellen = True
    Exit Function      

OraNachweisErstellenFehler:
'

    If oLclOraDatabase.LastServerErr <> 0 Or oLclOraDatabase.LastServerErrText <> "" Then

        szLclFehler = oLclOraDatabase.LastServerErr & " " & oLclOraDatabase.LastServerErrText     Else

        szLclFehler = Error
    End If

    MsgBox szLclFehler, MB_FEHLER, Str$(Err)

    If fLclWährendtrans Then

        oGblOraSession.DbRollback
        fLclWährendtrans = False

    End If

    Set oLclOraPArray1 = Nothing
    Set oLclOraPArray2 = Nothing
    Set oLclOraDatabase = Nothing
    Set oGblOraSession = Nothing

    On Error GoTo 0
    fOraNachweisErstellen = False
    Exit Function
End Function

>Does anybody know how to pass a Visual Basic array to an Oracle stored
>procedure.
>We are using VB5 ---> ODBC -----> Oracle 7.3.2
>I know how to do it row by row, bu ti'd like to be able to pass the whole
>array in one call.
>Thanx in advance.
>Please reply to meltser_at_aigfpc.com
>
>

--

Regards

Matthias Gresz    :-)

GreMa_at_T-online.de
Received on Fri Mar 06 1998 - 00:00:00 CST

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US