-
GLOBAL TEMPORARY ist eine Tabelle, die automatisch in QTEMP zur Verfügung gestellt wird.
Diese füllst du ganz normal per Insert und gibst einen Cursor per Select zurück.
Auch hier gilt, dass der Cursor vom Client erst geschlossen werden muss bevor deine Prozedur erneut aufgerufen wird.
Ggf. kann SQL halt kein Teraspace. Hier sind ja Variablen nur bis 16MB erlaubt, alles andere muss dann über LOB's abgewickelt werden.
Also bleibt dir nur eine echte Tabelle übrig.
-
... das storage model ist eine Eigenschaft eines *PGM/*SRVPGM, kann also nicht beim erstellen eines Moduls angegeben werden. Die RNF0376 kommt bei der Erstellung des modules, lässt sich also nicht mit stgmdl *TERASPACE toppen.
Was ist denn an der RPG Logik so wertvoll, dass man das nicht gleich im Java macht? Da gibt es so schicke Sachen wie Hibernate und Co., die den data access in Jave dem ganzen RPG Gerödel haushoch überlegen machen.
D*B
-
Warum baut man Wrapper um bestehende RPG-Schnittstellen, die bekannte Parameter haben man sich aber um die enthaltene Logik nicht mehr kümmern muss oder mangels Quellen nicht verfügbar ist?
-
Hallo,
ich habe mir einen kleinen Test zusammengeschustert:
Nachfolgend das SQLRPGLE - in den Compilersettings wird der Cursor mit *ENDMOD geschlossen:
Code:
* 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:
Code:
@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
-
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.
-
 Zitat von Fuerchau
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
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks