Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Usenet -> c.d.o.misc -> Re: passing vb-arrays to oracle stored procedures
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"
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
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.deReceived on Fri Mar 06 1998 - 00:00:00 CST
![]() |
![]() |