-
 Zitat von Fuerchau
Execute Immediate geht da leider nicht.
Du musst den Umweg über einen Cursor mit Open/Fetch/Close nehmen.
Per Declare Cursor for Statement und Prepare machst du einen dynamischen Cursor.
Dein Fetch kann dann wieder statisch sein solange die Ergebnisspalten passen.
Wie in deinen anderen Threads schon beschrieben musst du aber hier den Umweg über CLOB_LOCATOR gehen und kannst dann den Inhalt in eine CLOB_FILE kopieren.
... der execute immediate scheitert daran, dass keine Variablen verwendet werden können. Prepare mit nachfolgendem execute using sollte allerdings auch ohne cursor und fetch ebenfalls gehen.
D*B
-
"Execute ... Using" gilt leider nur für Parametermarker.
MyStmt = "Select ... where f1=?";
prepare ...
execute ... using MyVar;
Um Ergebnisse zu erhalten geht das nur per Descriptor (SQLDA mit SQLVAR-Array).
Wer sich das zutraut kann das verwenden. Dies ist dann vielleicht schneller als Open/Fetch/Close.
-
 Zitat von Fuerchau
"Execute ... Using" gilt leider nur für Parametermarker.
MyStmt = "Select ... where f1=?";
prepare ...
execute ... using MyVar;
Um Ergebnisse zu erhalten geht das nur per Descriptor (SQLDA mit SQLVAR-Array).
Wer sich das zutraut kann das verwenden. Dies ist dann vielleicht schneller als Open/Fetch/Close.
... den select into kann man auch mit einer SQLDA nicht dynamisch preparen, aber values into kann man dynamisch preparen, auch ohne SQLDA. Performance relevant ist das so oder so nicht, da der Declare cursor eine Compiletime Geschichte ist, die Musik spielt beim prepare und beim open/fetch versus execute using könnte die typisierte variante (mit SQLDA) sogar im Vorteil sein - allerdings legt das alles im Bereich unterhalb der Messbarkeitsgrenze.
D*B
-
Danke für die Tips. Mal wieder was gelernt...
-
Ist schon seltsam, dass der "Select Into" eigentlich dem "Value Into" vollkommen entspricht da beide nur eine einzelne Zeile zurückgeben dürfen.
Allerdings vermisse ich beim "Values Into" die Beschreibung, wie das mit einem Prepared Statement gehen soll.
Entweder ich prepare den "Values..." mit anschließendem "Execute into", wobei der Execute ja bei INTO nur eine SQLDA erlaubt oder ich kann beim "Values" statt eines Ausdruckes auch einen Statementnamen angeben. Das ist so aber nicht dokumentiert.
-
... wie sonst auch:
Code:
D*B CRTSQLRPGI TSTVALUES
D*B+ OBJTYPE(*MODULE)
D*B+ DBGVIEW(*SOURCE)
D*B CRTPGM TSTVALUES
D*B+ ACTGRP(TSTVALUES)
d maxname s 30
d halstring s 128
halstring = 'values (select max(vorname) from covelenz) '
+ 'into ?';
exec sql
prepare s1 from :halstring;
exec sql
execute s1 using :maxname;
dsply maxname;
exec sql commit;
return;
das mit values und select into verstehe ich auch nicht, wahrscheinlich hat der erste Versuch das zu implementieren zu einem Bug im Parser beim parsen des Select geführt und dann hat man...
oder das war wieder so eine Kantinenwette, wo die SQL Crew mit der RPG Crew gewettet hat, dass man auch eine unnötige Anweisung im SQL unterkriegt...
D*B
-
Ok, aus der Doku für Execute ging nicht eindeutig hervor, dass "using" auch für Ausgabeparameter gilt (z.B. für dynamische SQL-Prozeduraufrufe interessant).
Den komplexen "execute ... into Descriptor" benötigt man dann ja jetzt nicht mehr.
-
... ich habe noch nie SQL Deskriptoren verwendet, den einzigen Fall, den ich sehe, ist: Wenn man den Tabellennamen, bzw. die Parameterliste oder die Struktur eines ResultSets erst zur Laufzeit kennt und bis dahin flexibel halten will (in anderen Worten: Mit Kanonen auf Spatzen schießen will, Dinge unnötig verkomplizieren oder zeigen will, dass man unverständliche Programme schreiben kann).
Die Datenbank baut einem eh# für die Rückgaben eine SQLDA, die mit den Daten zurückkommt.
D*B
-
Ich habe in V4R3 einen variablen SQLCPY (als CMD) entwickelt, der heute auf V7R1 immer noch funktioniert und auch sehr häufig eingesetzt wird.
Hier muss mit SQLDA's gearbeitet werden da weder Tabellen noch Felder zur Compilezeit bekannt sind.
Da haben es dynamische Sprachen wie Java/VB/.NET... natürlich erheblich einfacher.
In einer normalen Anwendung habe ich SQLDA's auch noch nie benötigt.
-
... da hätte ich eher SQL CLI genommen (Geschmacksache sagte der Affe und biss in die Seife)
-
Da dies nun schon eine Weile hier ist (ca. 1999/2000) war mir CLI auf der AS/400 und C-Aufrufe aus COBOL noch unbekannt und RPG mache ich erst seit ca. 2002.
M.a.W.: der SQLCPY ist komplett in COBOL.
Similar Threads
-
By dschroeder in forum IBM i Hauptforum
Antworten: 14
Letzter Beitrag: 31-08-16, 15:32
-
By alex61 in forum IBM i Hauptforum
Antworten: 7
Letzter Beitrag: 06-07-16, 11:51
-
By alex61 in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 09-06-16, 13:26
-
By Joshua in forum NEWSboard Programmierung
Antworten: 12
Letzter Beitrag: 24-11-15, 10:53
-
By labm in forum NEWSboard Programmierung
Antworten: 8
Letzter Beitrag: 07-05-15, 07:55
Tags for this Thread
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