PDA

View Full Version : Lib eines Programms ermitteln



Seiten : 1 [2]

B.Hauser
12-06-13, 18:39
Man kann sich auch mit einem Zweizeiler eine User Defined Table Function (UDTF) schreiben, die man dann immer wenn man sie braucht über SQL aufrufen und verarbeiten kann:


Create Or Replace Function YourLib/FindLibPGM
(ParPGM VarChar(10))
Returns Table (ObjLib Char(10) ,
Obj Char(10) ,
ObjDescr Char(50) )

Language SQL
Modifies SQL Data
Called On NULL Input
Disallow Parallel
Not Fenced
Begin
Declare CLCmd VarChar(256) Not Null Default '';

Set CLCmd = 'DSPOBJD OBJ(*ALL/' concat Trim(ParPGM) concat ') '
Concat ' OBJTYPE(*PGM) '
Concat ' OUTPUT(*OUTFILE) '
Concat ' OUTFILE(QTEMP/TMPOBJD) '
Concat ' OUTMBR(*FIRST *REPLACE) ';

Call QCMDEXC(CLCmd, Length(CLCmd));

Return Select ODLBNM, ODOBNM, ODOBTX
From QTEMP/TMPOBJD;
End ;

Wenn das Skript ordnungsgemäß ausgeführt wurde, d.h. die UDTF erstellt wurde, kann man sie von überall und jederzeit mit dem folgenden SQL-Befehl aufrufen:

select *
From Table(FindLibPgm('PGMNAME')) x;

Anstatt PGMNAME kann natürlich auch eine (Host-)Variable eingesetzt werden.

Birgitta

malzusrex
13-06-13, 07:17
Hallo Birgitta,

wollte natürlich das gleich einmal aus probieren. Beim Erstellen der Funktion kann erst eine Meldung, das er mit "LENGTH" nichts anfangen kann. Also habe ich den Code etwas abgewandelt.


Declare CLCmd VarChar(256) Not Null Default '';
Declare CLCmdL DEC(15, 5) Not Null Default 0,0;
Set CLCmd = 'DSPOBJD OBJ(*ALL/' concat Trim(ParPGM) concat ') '
Concat ' OBJTYPE(*PGM) '
Concat ' OUTPUT(*OUTFILE) '
Concat ' OUTFILE(QTEMP/TMPOBJD) '
Concat ' OUTMBR(*FIRST *REPLACE) ';
Set CLCmdL = Length(CLCmd);
Call QCMDEXC(CLCmd, CLCmd);
Return Select ODLBNM, ODOBNM, ODOBTX
From QTEMP/TMPOBJD;
End


Damit konnte ich die Funktion erstellen. Führe ich den SELECT aus kommt
"Abfrage kann nicht ausgeführt werden".
Und eine Ebene tiffer in der Meldung
"Zeichen in CAST-Argument ungültig"

Hast du eventuell noch einmal Zeit dir diese Function anzuschauen?
Gruß
Ronald

andreaspr@aon.at
13-06-13, 07:46
Declare CLCmd VarChar(256) Not Null Default '';
Declare CLCmdL DEC(15, 5) Not Null Default 0,0;
Set CLCmd = 'DSPOBJD OBJ(*ALL/' concat Trim(ParPGM) concat ') '
Concat ' OBJTYPE(*PGM) '
Concat ' OUTPUT(*OUTFILE) '
Concat ' OUTFILE(QTEMP/TMPOBJD) '
Concat ' OUTMBR(*FIRST *REPLACE) ';
Set CLCmdL = Length(CLCmd);
Call QCMDEXC(CLCmd, CLCmd);
Return Select ODLBNM, ODOBNM, ODOBTX
From QTEMP/TMPOBJD;
End


Kann es sein dass du im 2. Parameter die Falsche Variable angiebst? :)

Call QCMDEXC(CLCmd, CLCmdL);

statt

Call QCMDEXC(CLCmd, CLCmd);


lg Andreas

B.Hauser
13-06-13, 07:52
Ich hatte die Funktion gestern Abend auf einem System mit 7.1 erstellt. Dabei hatte ich wohl einiges verwendet, das erst mit Release 7.1 und PTFs dazugekommen ist (Or Replace und Übergabe von Ausdrücken beim Aufruf von Stored Procedures.

Die folgende Version habe ich gerade auf einem System mit V5R4 erstellt und ausgeführt.

Create Function WrkBHA/FindLibPGM
(ParPGM VarChar(10))
Returns Table (ObjLib Char(10) ,
Obj Char(10) ,
ObjDescr Char(50) )

Language SQL
Modifies SQL Data
Called On NULL Input
Disallow Parallel
Not Fenced
Begin
Declare CLCmd VarChar(256) Not Null Default '';
Declare CmdLen Dec(15, 0) Not Null Default 0;

Set CLCmd = 'DSPOBJD OBJ(*ALL/' concat Trim(ParPGM) concat ') '
Concat ' OBJTYPE(*PGM) '
Concat ' OUTPUT(*OUTFILE) '
Concat ' OUTFILE(QTEMP/TMPOBJD) '
Concat ' OUTMBR(*FIRST *REPLACE) ';

Set CmdLen = Length(CLCmd);
Call QCMDEXC(CLCmd, CmdLen);

Return Select ODLBNM, ODOBNM, ODOBTX
From QTEMP/TMPOBJD;
End ;

Aufruf: Ermittelt alle Programme in allen Bibliotheken, die mit HS anfangen. (unter System Naming und IBM i Navigator - Eine SQL Prozedur ausführen - die Bibliothek in der die UDTF erstellt wurde sollte in der Bibliotheksliste sein)

Select * from Table(FindLibPGM('HS*')) x;;

STRSQL macht allerdings auch bei mir Probleme. (ist ja stabilized!!!)

Einbindung in embedded SQL wiederum sollte problemlos funktionieren, da ich jede Menge von diesen UDTFs in meinen Programmen und Prozeduren (auch unter V5R4) verwende.

Birgitta

malzusrex
13-06-13, 07:55
Jo, so geht es.

Hatte da 2 mal die gleiche Variable drin

Danke Euch

Ronald