Anmelden

View Full Version : SAVLIB und SQL Procedure



mk
21-02-13, 18:25
Hallo zusammen,

es ist jetzt aufgefallen das bei dem Befehl
SAVLIB nicht alle in der Bibliothek
vorhandenen SQL Stored Procedure gesichert werden.

Reine SQL Stored Proceduren werden gesichert.
Die SQL stored Proceduren die z.B auf ein RPG
Programm zeigen werden nicht gesichert.

Ist das schonmal jemandem aufgefallen ?

Gruß
Michael

Fuerchau
22-02-13, 07:29
Reine SQL-Proceduren/Funkionen enthalten ihre Registrierungsinfos bzgl. der SQL-Repositories.
SQL-Deklarationen, die auf externe Programme verweisen werden nur in die Repositories eingetragen, liegen also daher nicht im Objekt selber.

mk
22-02-13, 08:42
Hi,

und wie kann man diese Objekte dann Sichern
und auf einem anderen System Zurückspeichern ?


Gruß
Michael

Fuerchau
22-02-13, 09:57
In dem man das SQL-Script zur Erstellung auf dem Zielsystem wiederholt.

B.Hauser
22-02-13, 10:29
Hallo zusammen,

es ist jetzt aufgefallen das bei dem Befehl
SAVLIB nicht alle in der Bibliothek
vorhandenen SQL Stored Procedure gesichert werden.

Reine SQL Stored Proceduren werden gesichert.
Die SQL stored Proceduren die z.B auf ein RPG
Programm zeigen werden nicht gesichert.

Ist das schonmal jemandem aufgefallen ?

Gruß
Michael

Kann es sein, dass bei Dir die Stored Procedure und das RPG-Programm nicht in der gleichen Bibliothek liegen?

Wir haben jede Menge von externen Stored Procedures, UDFs und UDTFs, die wir in SaveFiles sichern und ohne dass ein SQL Skript abläuft beim Kunden wieder installieren.

Birgitta

Fuerchau
22-02-13, 11:13
Laut Doku ist der Zeitpunkt der Erstellung der Prozedur entscheidend:
Wenn das Objekt beim Create Procedure existiert, wird das im Objekt vermerkt.
Man kann aber auch eine Procedure erstellen, bevor das Objekt vorhanden ist.

Des weiteren (beim Entwickeln ist das ja halt so), wird ja beim CRTxxxPGM das Ursprungsobjekt in die QRPLOBJ verschoben (was ja so gut wie ein löschen ist).
Die SQL-Registrierung wird aber mit verschoben und im neu erstellten Programm nicht automatisch wiederholt.

Der Verweis im SQL-Repository ist aber ein dynamischer Verweis und funktioniert auf dem Entwicklungssystem ja weiter.

Also:
Nach einem CRTxxxPGM sollte der Create Procedure auch wiederholt werden um den Eintrag im PGM-Objekt zu bekommen.

mk
22-02-13, 13:21
Hallo,

seltsam.....

Das Programm und die Stored Procedure sind in der
gleichen Bibliothek.


Hier mal ein Beispiel:

Muss man evtl noch andere Parameter angeben ?



-- SQL generieren

-- Version:
-- Generiert am: 25.06.12
-- Relationale Datenbank:
-- Standardauswahl: DB2 for i

-- ***************************************
-- Brückenprogramm call programs
--
-- ***************************************


-- DROP PROCEDURE ASMTOOL/CALLPRCPHP ;


CREATE PROCEDURE ASMTOOL/CALLPRCPHP (

OUT OUTPARM CHAR(132) ,
IN ACT CHAR(10) ,

IN DELIM CHAR(1) ,

IN PARMS CHAR(4096)

)

LANGUAGE RPGLE

SPECIFIC ASMTOOL/CALLPRCPHP

NOT DETERMINISTIC

MODIFIES SQL DATA

CALLED ON NULL INPUT

EXTERNAL NAME 'ASMTOOL/PRCPHP01R'

PARAMETER STYLE SQL ;



COMMENT ON SPECIFIC PROCEDURE ASMTOOL/CALLPRCPHP

IS 'Procedure Call Programs ' ;


Frage: Wenn ich im OpsNav eine Stored Proc. erstelle
habe ich unter Umständen keine Source.

Gruß
Michael

B.Hauser
22-02-13, 13:39
Jede SQL Routine hat auch einen Source Code auch wenn Du das Object über die Wizards im IBM i Navigator erstellst.

Den Source Code kannst Du im IBM i Navigator über "Generate SQL" / "SQL Generieren" nachträglich erstellen und sichern.
Alternativ kann man auch das API QSQGNDDL verwenden.

Birgitta

andreaspr@aon.at
22-02-13, 14:13
Für die schnelle kann man sich auch über die Systemtabellen (QSYS2/SYSROUTINES) ein paar informationen auslesen lassen.
Z.B. Anzahl der Ein/Ausgangsparameter, Externer Name, Result usw.

Aber am einfachsten ist es wie Birgitta schon sagte über den Navigator.

lg Andreas

Fuerchau
22-02-13, 14:45
Wenn du eine Funktion/Prozedur mit "external ..." erstellst, wird KEIN Objekt erstellt sondern lediglich das SQL-Repositiory (SQLFunc/SQLProcs...) gefüllt.

Wie oben beschrieben, schreibt SQL dann in das externe Programm (nicht sichtbar!) die Registrierungsinfos um im Restorefall das Repository zu füllen.

Erstellst du aber das Programm NEU, gehen diese Infos verloren.
In diesem Fall musst du halt "drop / create" wiederholen.