View Full Version : SAVLIB und SQL Procedure
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
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.
Hi,
und wie kann man diese Objekte dann Sichern
und auf einem anderen System Zurückspeichern ?
Gruß
Michael
In dem man das SQL-Script zur Erstellung auf dem Zielsystem wiederholt.
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
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.
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
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
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.