PDA

View Full Version : SQL Function aus RPGLE aufrufen...



Bratmaxxe
28-04-06, 11:41
Hallo liebe RPG Gemeinde,

ist es möglich aus einem RPG Programm heraus eine SQL Function aufzurufen ?

Habe mal etwas rumprobiert:




D PgmCALL PR ExtPGM(FU074)
D Parm1 3 INZ(*blanks)
D Parm2 4 0 INZ(*zeros)
D Parm3 1 inz(*blank)
D Parm4 21 Inz(*blanks)
*
*
D string S 21 inz(*blanks)
*
*
C CALLP pgmCALL('100':1234:'1':string)

C if string > *blanks
* //
C ENDIF
*
C eval *inlr = *on




FU074 ist die erstellte Function (Modul), ein Serviceprogramm mit dem Namen FU074 gibt es auch...

Function wurde wie folgt erstellt:




CREATE FUNCTION PGM/FU074
( MANDANT CHAR(3),
KST DEC(4, 0),
ART CHAR(1)
) RETURNS CHAR(21)
LANGUAGE RPGLE
EXTERNAL NAME 'PGM/FU074(SQL_FUNC)'
NO SQL
NO EXTERNAL ACTION



Der Compiler teilt mir 7030 er Fehler mit, FU074 ist nicht definiert und Parameter kann nicht nach Referenz übergeben werden, wenn er
beim Aufruf geändert werden kann.

Umgewandelt habe ich mein Testprogramm mit dftactgrp *no

Hoffe auf Eure Antworten,
Gruß
Mäxxchen

mwithake
28-04-06, 11:55
Hallo,

SQL-Funktionen lassen sich per embedded SQL aufrufen:



C/EXEC SQL
C+ SET :ERGEBNIS = SQLFUNKTION(:parm1, :parm2, ...)
C/END_EXEC


Gruß
M.Withake

holgerscherer
28-04-06, 11:55
Hallo liebe RPG Gemeinde,

ist es möglich aus einem RPG Programm heraus eine SQL Function aufzurufen ?

VIelleicht stehe ich grade auf dem Schlauch (nein, ich sitze), aber wie wäre es mit embeddet SQL? Dazu finden sich hier doch einige Artikel, und Experten und Expertinnen liegen auf der Lauer, um Dir zu helfen ;-)

-h

Fuerchau
28-04-06, 11:56
c/exec-sql
c+ set myvar = mysqlfunc(parm1, parm2, ...)
c/end exec

Da es eine SQL-Funktion ist, musst du auch SQL bemühen.

Bratmaxxe
28-04-06, 12:26
der code der function ist wie folgt:




H NOMAIN

FT3TABPK IF E K DISK

DSQL_FUNC PR 21A
D MANDANT 3
D KST 4 0
D ART 1

PSQL_FUNC B EXPORT
DSQL_FUNC PI 21A
D MANDANT 3
D KST 4 0
D ART 1

C* //Initialisierung Work-Felder
D TEXT3 S 3 INZ(*BLANKS)
D TABELLE S 10 INZ('N0210')
D VERSION S 1 INZ('1')
D KST15 S 15
D STRING S 21 INZ(*BLANKS)
C*

// Datei lesen..... usw.

C RETURN STRING
C* -----------------------------------------------------------------
C* ENDE der Prozedur
C* -----------------------------------------------------------------
C CLOSE T3TABPK
PSQL_FUNC E



Es gibt dazu ein Modul und ein Serviceprogramm.

Die Function an sich ist ja kein SQL, sondern normal RPG, ich verstehe nur nicht, warum man die nicht anders aufrufen kann ?

MfG
Mäxxchen

B.Hauser
28-04-06, 13:21
Hallo,

Eine (RPG-)Funktion ist eine Prozedur mit Rückgabe-Wert, die nicht mit CALLP sondern z.B. über EVAL oder IF oder DOU ... usw. wie eine Built-In-Funktion aufgerufen wird.

Also z.B.



/Free
Ergebnis = MyFunc(Param1: Param2: ... ParamX);
If MyFunc2(Parm) > *Zeros;
EndIf;
/End-Free

Auch wenn eine RPG-Funktion als SQL-Funktion registriert ist, kann ich sie immer noch native aufrufen.

Bei der Registrierung einer externen Funktion als SQL-Funktion wird dieser Funktion lediglich eine SQL-Kennung zugeordnet, über die diese Funktion aus SQL heraus aufgerufen werden kann.

Birgitta

Fuerchau
28-04-06, 13:24
Die Funktion steckt in einem Service-Programm, also musst du die Funktion als externe Funktion und nicht als Programm deklarieren und anschließend mit dem Serviceprogramm binden.

1. CRTRPGMOD
2. CRTPGM ... BNDSRVPGM(...)

Bratmaxxe
28-04-06, 15:23
Vielen lieben Dank !

Gruß
Mäxxchen