[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Hybrid View

  1. #1
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.014

    Embedded SQL und Stored Procedure

    Hallo,

    ich habe ein SQLRPG-Programm, in dem ich ein einfaches Select-Statement mit PREPARE vorbereite. Für dieses SQLRPG-Programm habe ich eine Stored Procedure erstellt. Wenn ich nun diese SP von einem Java-Client aus aufrufe, funktioniert es ohne Probleme und ich erhalte das gewünschte Ergebnis. Wenn ich es aber von PHP aus aufrufe, erhalte ich beim OPEN CURSOR immer den SQLCODE -514. Der SP werden in beiden Fällen dieselben Parameter übergeben. Das SQL-Statement ist in beiden Fällen absolut identisch. Ich hab das mit protokolliert. Nur warum erhalte ich bei PHP den SQLCODE -514 ???

    Gruß,
    KM

  2. #2
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.014
    Das Problem ist inzwischen gelöst. Der Benutzer, der die SP von PHP aufgerufen hat, hatte in seiner *LIBL nicht die betreffende Bibliothek. Wenn ich sie beim SELECT explizit angebe, funktioniert's.

    Gruß,
    KM

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.703
    Arbeitest du mit Commit/Rollback ?
    Nach einem Commit/Rollback ist ein vorbereitetes Statement wieder weg, du musst also erneut einen Prepare ausführen.

    Prepared Statements bleiben über Commit-Grenzen nicht erhalten.

    Ggf. ist Autocommit in der Verbindung gesetzt (meistens der Default).

    Stelle in deinem Programm also sicher, dass der Prepare unmittelbar vor dem Execute ausgeführt wird und sich somit im selben Commit-Zyklus befindet.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.931
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Arbeitest du mit Commit/Rollback ?
    Nach einem Commit/Rollback ist ein vorbereitetes Statement wieder weg, du musst also erneut einen Prepare ausführen.

    Prepared Statements bleiben über Commit-Grenzen nicht erhalten.
    Bist Du sicher?
    Eigentlich sollten beim Commit oder Rollback lediglich die Cursor geschlossen werden (sofern sie nicht mit WITH HOLD definiert sind).
    Beim nächsten Aufruf (mit den gleichen Werten) sollte ein OPEN (ggf. mit anderen Parameter-Marker-Werten) genügen.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.703
    Laut Beschreibung des SQL-Fehlers.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  6. #6
    Registriert seit
    Mar 2002
    Beiträge
    5.368
    ... hier muss man fein differenzieren:
    bei SQLCLI (und allem, was das benutzt) werden die prepares mit freigegeben.
    Datenbanktreiber, die auf meist auf SQLCLI aufsetzen, könnten das aber wieder toppen (indem sie aus dem Commit implizit einen Commit hold machen).

    Bei embedded SQL würde ich das für einen Bug halten, rate aber von Stresstests ab.

    Die hold klauseln bei declare cursor, commit etc sind DB2 spezifische Erweiterungen, sollte man sich eigentlich eher abgewöhnen. Wobei ich beim Thema ANSI SQL immer mehr Illusionen verliere, je mehr ich mich damit beschäftige und bei der Arbeit an meiner DB2/400 JDBC Bridge für RPG und Co. fällt da einiges an, umso mehr kräuseln meine Nackenhaare, bei DB2/400, aber auch bei Oracle und manchen JDBC Treibern...

    D*B

    Zitat Zitat von B.Hauser Beitrag anzeigen
    Bist Du sicher?
    Eigentlich sollten beim Commit oder Rollback lediglich die Cursor geschlossen werden (sofern sie nicht mit WITH HOLD definiert sind).
    Beim nächsten Aufruf (mit den gleichen Werten) sollte ein OPEN (ggf. mit anderen Parameter-Marker-Werten) genügen.

    Birgitta
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  7. #7
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Zitat Zitat von BenderD Beitrag anzeigen
    Die hold klauseln bei declare cursor, commit etc sind DB2 spezifische Erweiterungen, sollte man sich eigentlich eher abgewöhnen. Wobei ich beim Thema ANSI SQL immer mehr Illusionen verliere, je mehr ich mich damit beschäftige und bei der Arbeit an meiner DB2/400 JDBC Bridge für RPG und Co. fällt da einiges an, umso mehr kräuseln meine Nackenhaare, bei DB2/400, aber auch bei Oracle und manchen JDBC Treibern...
    Ich habe mal ein Buch gelesen der mit einen passenden Satz beginnt:
    Entscheidet man so offen zu entwickeln, dass das gleiche Konzept auf verschiedenen Plattformen gleich laufen soll, so verzichtet man auf viele Vorzüge die das bestehende System mit sich bringt.

  8. #8
    Registriert seit
    Mar 2002
    Beiträge
    5.368
    ... gute Konzepte sind immer einfach und lassen sich dann ohne nennenswerte Probleme auf (fast) allen Plattformen abbilden. Das Buch würde ich in die Rubrik "empfehlenswerte Ausreden" einsortieren.

    D*B


    Zitat Zitat von andreaspr@aon.at Beitrag anzeigen
    Ich habe mal ein Buch gelesen der mit einen passenden Satz beginnt:
    Entscheidet man so offen zu entwickeln, dass das gleiche Konzept auf verschiedenen Plattformen gleich laufen soll, so verzichtet man auf viele Vorzüge die das bestehende System mit sich bringt.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.703
    @Birgitta
    Man muss unterscheiden zwischen einem Declare Cursor, der in das interne SQLPKG eingebettet ist und einem expliziten Prepare eines Statements.
    Das interne Statement wird automatisch prepared, sobald man es benötigt und nicht existiert. Deshalb sind Commit-Grenzen da nicht relevant.
    Offene Cursor unterliegen da wiederum den Options-Einstellungen und dem jeweligen Commit ggf. with hold.

    Mache ich einen expliziten Prepare eines Statements, muss ich das ggf. wiederholen.
    Insbesonders in Procedure/Function, wo ich ja keinen eigenen Commit/Rollback machen darf, kann ich mich auf die Existenz eines Statements ggf. nicht verlassen.
    Allerdings schadet ein erneuter Prepare auch nicht, falls das Statement schon existiert. Der wird einfach mit SQL-Fehler abgewiesen.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  10. #10
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Insbesonders in Procedure/Function, wo ich ja keinen eigenen Commit/Rollback machen darf, kann ich mich auf die Existenz eines Statements ggf. nicht verlassen.
    Ich bin mir jetzt nicht sicher wie es in früheren OS-Versionen war, aber ab 6.1 können auch innerhalb von Procedures Commit/Rollback abgesetzt werden. Ist allerdings auch etwas aufwendiger. (Aktivierungsgruppen, Rollback-Punkte setzen usw.)

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.703
    Das ist das, was andere DB's schon lange geschachtelte Transaktionen nennt.
    Ich kann damit innherhalb der Prozedur eine eigene Transaktion definieren, die jedoch die übergeordnete Transaktion nicht berühren darf.
    Ein Commit/Rollback der Haupttransaktion wird sowieso abgewiesen.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  12. #12
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Ich weis dieses Thema ist schon länger her, allerdings hatte ich erst jetzt Zeit meine Vermutung zu testen, sodass ich nicht irgendwelche unbelegten Behauptungen aufstelle.

    Also für alle dies interessiert ... ich kann eine Procedure so definieren, dass wenn ich dort ein Rollback absetze, nicht nur zB die Inserts innerhalb der Procedure rückgängig macht, sondern auch die änderung vom aufgerufenen Programm.
    Genauso kann auch ein Rollback im Programm nach dem Aufruf der SP abgesetzt werden und auch die Änderungen der SP werden rückgängig gemacht.
    Ist also alles nur eine Sache wie es definiert und eingesetzt wird. Und das gibt schon mindestens ab 5.4

Similar Threads

  1. Berechtigung für Stored Procedure
    By rebe in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 12-10-06, 11:22
  2. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43
  3. SQL Stored Procedure verschwindet
    By florian in forum IBM i Hauptforum
    Antworten: 10
    Letzter Beitrag: 17-05-06, 16:08
  4. Character verbinden in Embedded SQL
    By e_sichert in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 03-05-06, 10:47
  5. Stored Procedure SQL Cursor Update
    By Jenne in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 14-06-05, 14:00

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •