View Full Version : StoredProcedure
Hallo,
ich habe mir einen kleinen Test zusammengeschustert:
Nachfolgend das SQLRPGLE - in den Compilersettings wird der Cursor mit *ENDMOD geschlossen:
* CREATE PROCEDURE PGM/SRL_TSTX6(IN MANDANT CHAR ( 3))
* RESULT SETS 1 NOT
* DETERMINISTIC READS SQL DATA EXTERNAL NAME PGM/SRL_TSTX6
* PARAMETER STYLE GENERAL
H DFTACTGRP(*NO) ACTGRP(*CALLER)
d aDate s d datFmt(*ISO) inz(D'2010-12-07')
d dayNumber s 10i 0
d dayName s 10a
/free
exec SQL Set Option Commit=*NONE, Naming=*SYS;
exec SQL declare global temporary table temp_daynames
(day_number integer, day_Name varchar (9)) ;
exec SQL insert into temp_daynames
values(1, 'Monday'), (2, 'Tuesday'), (3, 'Wednesday'),
(4, 'Thursday'), (5, 'Friday'), ('6', 'Saturday'),
(7, 'Sunday');
exec SQL values dayOfWeek_ISO(:aDate) into : dayNumber ;
EXEC SQL Declare CustCsr cursor for
SELECT * FROM temp_daynames;
EXEC SQL Open CustCsr;
EXEC SQL SET RESULT SETS for Return to Client
Cursor CustCsr;
return;
C EVAL *INLR = *ON
Und das Java-Programm:
@Test
public void temporaryTable()
{
try
{
CallableStatement callableStmt = AS400_Anmeldung.getConnection().prepareCall("CALL PGM.SRL_TSTX6(?)");
callableStmt.setString(1, "100");
ResultSet rSet = callableStmt.executeQuery();
while (rSet.next())
{
String dayName = rSet.getString(rSet.findColumn("day_Name"));
System.out.println(dayName);
}
} catch (final Exception ex)
{
System.out.println(ex);
}
}
Nur leider kommt es zu einer Exception (java.sql.SQLException: Cursor state not valid.).
Wo ist der Haken? Habe ich etwas übersehen?
Gruß und schönes Wochenende
BM
andreaspr@aon.at
16-10-15, 13:26
Vielleicht darfst du nicht den *INLR auf *ON setzten, sondern muss *OFF bleiben.
lg Andreas
... ILE ist der LR wurscht, close bei *ENDMOD schließt den Cursor und ein geschlossener Cursor lässt sich nicht fetchen.
Das STGMDL kann (und muss) auf Modulebene bereits angegeben werden.
Der Default ist hier *INHERIT.
Beim CRTPGM können nur Module mit gleichen STGMDL bzw. INHERIT gebunden werden.
In einer ACTGRP kann auch nur 1 STGMDL aktiv sein.
Willst du den Compiler austrixen musst du ggf. mittels %ALLOC Speicher anlegen und die Elemente einzeln per Verschiebe-Pointer bearbeiten.
Wenn das Programm noch mal aufgerufen wird, musst du vorher den Speicher wieder freigeben, da du ansonsten ein sog. Memory-Leak erstellst dass im Zweifel, wenn der Systemspeicher nicht mehr ausreicht, zum Herunterfahren der Maschine zwingt.
Ansonsten:
SET RESULT SETS for Return to CALLER
TO CALLER
Specifies that the cursor can return a result set to the caller of the
procedure. For example, if the caller is a client application, the result set is
returned to the client application.
TO CLIENT
Specifies that the cursor can return a result set to the client application.
This cursor is invisible to any intermediate nested procedures. If a function
or trigger called the procedure either directly or indirectly, result sets
cannot be returned to the client and the cursor will be closed after the
procedure finishes.
... das geht aber wieder erst ab V7, vorher gab es den Parameter nicht. Für den Heap bringt das was, ob das aber die Grenzen des Compilers aushebelt wäre noch zu verifizieren.
Ich denke auch, dass hier SQL der Bremser ist und mit Teraspace nicht zurechtkommt.
Ich denke auch, dass hier SQL der Bremser ist und mit Teraspace nicht zurechtkommt.
... auf mich kann sich das "auch" nicht beziehen. Die RNF0376 bezieht sich auf die gesamte DS und besagt, dass kein Speicherelement (variablle, DS,... ) größer als 16773104 Byte sein kann und das steht in der V7 RPG Reference immer noch als restriction drin.
D*B
Moin,
ich hab gerade den "return to caller" ausprobiert - leider kommt es hier zur gleichen Exception.
Kann jemand das Beispielprogramm vielleicht bei sich testen (siehe Post #11)? So auf den 1. Blick sehe ich keinen "offensichtlichen" Fehler.
Danke und Gruß
BM
andreaspr@aon.at
26-10-15, 17:20
Hallo,
ich habe jetzt deine Sourcen 1:1 (bis auf die java connection) übernommen und getestet.
Bei mir (7.2 & Java 8) funktioniert es einwandfrei.
lg Andreas
Hallo Andreas,
vielen Dank für deine Bemühungen!! Stellt sich mir die Frage - wo liegt der Unterschied?
An Release 7.1 & Java 6 wirds (hoffentlich) nicht liegen...
Die Connection stelle ich wie folgt her:
AS400 as400Manager = new AS400("SYSTEM", "USER", "PASSWORT");
AS400JDBCDriver JDBC_DRIVER = new AS400JDBCDriver(); --> jt400.jar Version 7.0
DriverManager.registerDriver(JDBC_DRIVER);
Properties prop = new Properties();
prop.setProperty("prompt", "false");
prop.setProperty("naming", "sql");
prop.setProperty("errors", "full");
prop.setProperty("date format", "eur");
prop.setProperty("time format", "eur");
prop.setProperty("package cache", "false");
prop.setProperty("decimal separator", ".");
prop.setProperty("blocksize", "512");
prop.setProperty("translate binary", "true");
Connection connection = JDBC_DRIVER.connect(as400Manager, prop, "DATEIEN", false);
Die Compilesettings sind wie folgt:
Objekt . . . . . . . . . . . . . > SRL_TSTX6
Bibliothek . . . . . . . . . . > PGM
Quellendatei . . . . . . . . . . > QRPGLESRC
Bibliothek . . . . . . . . . . > PGMSRC
Quellenteildatei . . . . . . . . *OBJ
Quellendatenstromdatei . . . . .
COMMIT-Steuerung . . . . . . . . *NONE
Relationale Datenbank . . . . . *LOCAL
Art der Kompilierung . . . . . . *PGM
Listenausgabe . . . . . . . . . *PRINT
Text 'Beschreibung' . . . . . . *SRCMBRTXT
Vorcompileroptionen . . . . . . *XREF
+ für weitere Werte
RPG-Vorprozessoroptionen . . . . *NONE
Ziel-Release . . . . . . . . . . *CURRENT
INCLUDE-Datei . . . . . . . . . *SRCFILE
Bibliothek . . . . . . . . . . *LIBL
SQL INCLUDE-Verzeichnis . . . . *NONE
Daten kopieren zulassen . . . . *OPTIMIZE
SQL-Cursor schließen . . . . . . *ENDMOD
Blocken zulässig . . . . . . . . *ALLREAD
PREPARE verzögern . . . . . . . *NO
Auflösung gleichzeit. Zugriff . *DFT
Bewertung . . . . . . . . . . . 10
Datumsformat . . . . . . . . . . *JOB
Trennzeichen für Datum . . . . . *JOB
Zeitformat . . . . . . . . . . . *HMS
Trennzeichen für Uhrzeit . . . . *JOB
Ersetzen . . . . . . . . . . . . *YES
RDB-Verbindungsmethode . . . . . *DUW
Standarddatensammlung . . . . . *NONE
Dynam. Standarddatensammlung . . *NO
Paket . . . . . . . . . . . . . *OBJ
Bibliothek . . . . . . . . . . *OBJLIB
SQL-Pfad . . . . . . . . . . . . *NAMING
+ für weitere Werte
SQL-Regeln . . . . . . . . . . . *DB2
IBM SQL-Markierung . . . . . . . *NOFLAG
ANS-Markierung . . . . . . . . . *NONE
Druckdatei . . . . . . . . . . . QSYSPRT
Bibliothek . . . . . . . . . . *LIBL
Debugsicht . . . . . . . . . . . *SOURCE
Debug-Verschlüssel.schlüssel . . *NONE
Benutzerprofil . . . . . . . . . *NAMING
Dynamisches Benutzerprofil . . . *USER
Sortierfolge . . . . . . . . . . *JOB
Bibliothek . . . . . . . . . .
Sprachen-ID . . . . . . . . . . *JOB
Quellenzieldatei . . . . . . . . QSQLTEMP1
Bibliothek . . . . . . . . . . QTEMP
Optionen für Dezimalergebnisse:
Maximale Genauigkeit . . . . . 31
Maximale Anzahl Kommastellen 31
Mindestzahl Kommastellen (Div) 0
DECFLOAT-Rundungsmodus . . . . . *HALFEVEN
Compileroptionen . . . . . . . . *NONE
Magst Du diese vielleicht mal mit deinen Einstellungen verifizieren?
Danke und Gruß
BM