-
Variables Einlesen von Spalten in sqlrpgle; Problem: "INTO"
Hallo zusammen,
mein Anliegen ist sehr speziell und ich weiß nicht (aber hoffe sehr) ob es möglich ist.
Code:
dcl-proc main;
sqlstm = 'SELECT * FROM VARIABLE';
exec sql PREPARE stmt FROM sqlstm;
exec sql DECLARE crsr CURSOR FOR stmt;
exec sql OPEN crsr;
dou 1 = 0;
exec sql FETCH NEXT FROM crsr INTO :????????;
if SQLCODE <> 0;
leave;
endif;
dsply 'Laeuft!';
enddo;
end-proc;
In meinem Code soll das File, welches im SQL-Statement angegeben wird, variabel sein. Das bedeutet aber leider auch, dass ich nicht weiß, wie viele Felder und welche Datentypen dort herauskommen, dementsprechend weiß ich nicht was ich nach dem INTO angeben soll...
Probiert habe ich es schon (obwohl ich es eigentlich wusste aber versucht habe ich es trotzdem :-) ) mit Feldgruppen, Datenstrukturen und Pointern. Ich glaube ja fast, dass man es irgendwie mit Pointern machen muss aber ich bekomm gerade nicht raus wie...
Ich glaube wenn es eine Lösung dafür gibt ist die bestimmt sehr Kompliziert!?
Hat jemand einen Tipp oder gar eine Lösung für dieses Problem? Würde mich sehr freuen :-)
Vielen lieben Dank schon mal im Voraus für eure Mühe :-)
Beste Grüße
Matthias
EDIT: Rein vorsorglich: Bitte keine Belehrung zu SQL-Injections. Ich weiß darüber bescheid :-)
-
... dass das so gar nicht geht, sagt Dir bereits der Compiler - da braucht es nicht mal einen Blick in die Systemliteratur. Am einfachsten geht das mit SQL CLI, bei embedded SQL muss man da mit dynamic SQL arbeiten und per SQLDA das Resultset beschreiben. Näheres hierzu in der SQL Reference bze. im SQL CLI Handbuch.
Der praktische Nährwert von diesem Ansatz ist allerdings mit statischen Sprachen wie RPG in der Nähe von 0,0
D*B
-
Nun ja, das mit dem 0,0 muss man nicht so stehen lassen.
Natürlich ist das in diesem Fall nicht so einfach, ins besonders da die Daten ja anschließend auch noch irgendwie bearbeitet werden sollen.
Per "describe table" kann man sich eine SQLDA generieren lassen, allerdings muss man für einen Fetch dann ja auch Felder den Variablen zuweisen.
Dies geht z.B. per %alloc(), der Speicher muss dann in der SQLDA als Pointer eingetragen werden.
Alles in allem ein nicht gerade einfacher Weg.
Daher die Frage:
Was willst du damit erreichen?
Ist Java (auch auf der AS/400) da nicht vielleicht der effektivere Weg?
-
... das eigentliche Problem ist doch die fixe Cursor Anzahl und der Share der Dateien.
D*B
-
Nunja, ich habe vor ca. 18 Jahren auf V3R2 einen SQLCPY als Kommando in COBOL genau nach diesem Prinzip gebaut. Dieser läuft heute auf V7R2 noch immer problemlos und erlaubt eben einen Insert/Update/Delete auf Basis eines Selects mit Join und Where.
Benutzt werden da eben dynamische SQLDA's.
-
... auch da würde man heute zu anderen Programmiersprachen greifen. Das ergibt doch ganz andere Aufwand/Effekt Relationen.
-
Hallo BenderD,
Hallo Fuerchau,
vielen Dank für eure Antworten. Der Hintergrund ist folgender:
Wir haben im Unternehmen gerade damit angefangen uns mit Webservices zu beschäftigen. Die Daten liegen bei uns auf der DB2. Nun würden wir für jede Datei oder für jeden Select eigene Webservices brauchen. Das sind zwar kleine Programme, aber letztendlich würden es viele werden.
Nun versuche ich (Und ich bin mir sicher, dass es auf irgendeinem Wege möglich ist) einen universalen Webservice jeweils für SELECT, INSERT, UPDATE und DELETE zu schreiben. Das ich mir da eine Mega-Aufgabe gestellt habe, habe ich mir zwar schon gedacht aber wenn das Ding halt einmal fertig ist, brauche ich mir nie wieder oder zumindest nur sehr selten Gedanken darüber zu machen, wie ich den Webservice bei zukünftigen Programmentwicklungen anpacke(Unser Dateibestand an physischen Dateien wächst in etwa um zwei PF Pro Monat).
Für diese Mammut Aufgabe brauche ich doch ein bisschen Hilfe von Experten
Vielleicht hat jemand sowas schonmal entwickelt oder vielleicht können später mehr Entwickler von dem know how profitieren
Nun für heute mache ich erstmal Feierabend. Ich warte morgen gespannt auf eure Antworten. Hoffentlich kann ich schlafen :-D
Beste Grüße
Matthias
EDIT(Mir fällt hinterher auch immer noch was ein -.-*): Der obige Code stammt natürlich aus einem Test und nicht aus meiner UNIWEBSRVS-Datei. 'VARIABLE' soll dann natürlich eine variable sein in der der Dateiname (PF) steht und die Fragezeichen sollen durch eine variable ersetzt werden.
-
... auch da würde man heute zu anderen Programmiersprachen greifen. Das ergibt doch ganz andere Aufwand/Effekt Relationen.
Ich hätte es lieber über RPG gelöst aber andere Programmiersprachen wie Java, C#, C++, C,... beherrsche ich auch.
-
RPG ist keine dynamische Sprache und für solche komplexen Aufgaben einfach ungeignet.
Java ist insofern gut, als dass du mit Eclipse (o.ä.) entwickeln und testen kannst und es dann auf der AS/400 ausführen lassen kannst (wenn erforderlich).
Es hängt ganz einfach von deiner Anforderung ab.
Deshalb noch mal: was willst du damit erreichen? Was ist deine Aufgabe?
-
HTTP WebServices & Dynamische Verarbeitung ... für mich wäre hier zunächst mal PHP das besser geeignete Werkzeug dafür.
In RPG habe ich mal ein Beispiel-Code zusammengestellt um genau das was du möchtest zu realisieren.
Ist aber sicher kein Code den man für performancekritische Anwendungen verwenden sollte:
Code:
D vsql s 512
D vtype s 10
D vlength s 10 0
D vresult_ind s 10 0
D vCount S 10 0
D i S 10 0
/Free
// SQL Cursor erstellen
vSql = 'Select * From tab1';
Exec Sql Prepare S1 from :vsql;
Exec Sql Declare c1 Cursor For s1;
// Descriptor mit der max. Anzahl der Spalten initialisieren
Exec Sql allocate descriptor 'mydesc' with max 2;
EXEC SQL DESCRIBE S1 Using descriptor 'mydesc';
// Ersten Satz einlesen Exec Sql open c1;
Exec Sql Fetch c1 into sql descriptor 'mydesc';
// Anzahl der Spalten abrufen
EXEC SQL GET DESCRIPTOR 'mydesc' :vCount = COUNT;
// Alle Spalten mit deren Werte einlesen
For i=0 to vCount;
// Attribute der Spalte einlesen
Exec Sql GET DESCRIPTOR 'mydesc' VALUE :i :vtype = TYPE, :vlength = LENGTH, :vresult_ind = INDICATOR;
if vresult_ind >= 0;
Select;
When vtype = '1';
// Character exec Sql GET DESCRIPTOR 'mydesc' VALUE :i :sp2 = DATA;
When vtype = '4';
// Integer exec Sql GET DESCRIPTOR 'mydesc' VALUE :i :sp1 = DATA;
endsl;
endif;
endfor;
Exec Sql close c1;
/End-Free
lg Andreas
-
Hallo zusammen,
zunächst einmal recht herzlichen Dank für eure Antworten und eure Mühe.
Zitat von Fuerchau
Deshalb noch mal: was willst du damit erreichen? Was ist deine Aufgabe?
Ich weiß nicht ob ich besser erklären kann :-) so wie es aussieht scheint andreaspr@aon.at den Punkt aber ganz gut zu treffen. Jedenfalls wenn ich den Code korrekt interpretiere.
Allerdings kommt bei mir bei vCount immer 0 heraus, hier mein Debug:
EDIT: Okay ein eingebettetes Bild war nicht so gut ihr findet es im Anhang^^
Hmm. Vielleicht sollte ich es doch in php machen...
Andreas kannst du mir noch sagen warum da bei mir eine 0 herauskommt? Die Tabelle ist in der Bibliothek definitiv vorhanden (Arbeite ich oft mit).
Vielen Dank euch
Besten Gruß
Matthias Neubert
-
Bei "With max 2" musst du sicher einen höheren Wert angeben.
Starte einfach mal den DEBUG und schau ins Joblog oder mit Monitoring.
In einem der beiden wirst du sicher den genauen Fehler finden können.
lg Andreas
Similar Threads
-
By lch in forum Intern - Hilfe - Feedback - Tests-Forum
Antworten: 10
Letzter Beitrag: 15-02-21, 11:06
-
By wilfried in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 19-07-17, 11:38
-
By Edi in forum IBM i Hauptforum
Antworten: 8
Letzter Beitrag: 07-11-14, 07:52
-
By RLurati in forum NEWSboard Programmierung
Antworten: 1
Letzter Beitrag: 05-08-14, 09:10
-
By loeweadolf in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 13-02-14, 20:58
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