[NEWSboard IBMi Forum]
Seite 2 von 3 Erste 1 2 3 Letzte
  1. #13
    Registriert seit
    Nov 2020
    Beiträge
    343
    SQLCODE und SQLSTATE sind auch in SQL Funktionen und Prozeduren verfügbar.
    Du musst sie einfach nur declarieren, dann werden sie automatisch befüllt.
    Im SQLRPGLE werden sie automatisch vom Pre-Compiler deklariert.

  2. #14
    Registriert seit
    Jan 2012
    Beiträge
    1.139
    Danke für die Info. Aber ich muss sie zum Abfragen hinter jeder SQL Anweisung, die ich prüfen will, immer mit
    -- Status der SQL-Anweisung abrufen
    GET DIAGNOSTICS SQLCODE = RETURNED_SQLCODE, SQLSTATE = RETURNED_SQLSTATE;

    füllen, oder?

    (Das Code Beispiel stammt von Chat GPT)


  3. #15
    Registriert seit
    Mar 2002
    Beiträge
    5.296
    Zitat Zitat von dschroeder Beitrag anzeigen
    Dann habe ich deinen Code doch noch nicht verstanden. Ich mache mal ein kleines Besipiel:

    In meiner Funktion will mehrere selects abschicken und jeweils wissen, ob es geklappt hat. Muss ich dann mehrmal den Continue Handler deklarieren?

    Also z.B.
    Code:
    DECLARE CONTINUE HANDLER FOR NOT FOUND
    SET END_TABLE = 1;
    
    select ku_name from kunden into name;
    if end_table = 1 then
       erzeugeError(....)
    else
       macheWasGueltiges(name);
    end if;
    
    
    select pr_preis from artikel into preis;
    if end_table = 1 then
       erzeugeError(....)
    else
       macheWasGueltiges(preis);
    end if;
    Meinst du das?
    Oder muss ich vor jedem select den declare und den set machen?
    ... was hast Du denn wirklich vor? Für mich sieht das (oberflächlich betrachtet) nach einem join aus. Was passiert denn, wenn Du gefunden hast und was, wenn nicht - für mich sieht das (oberflächlich betrachtet) nach einem Zugriffsmodul aus.

    D*B

    PS: der KI für eine Ausrede bei ND hält.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  4. #16
    Registriert seit
    Jan 2012
    Beiträge
    1.139
    Das sind nur vereinfachte Beispiele. Ich schreibe eine SQL-Funktion für einen Webservice. Die Funktion liefert für bestimmte Anfragen Blobs zurück bzw. schreibts übergebene Blobs in eine Datenbank. Es sind nur bestimmte Anfragen zulässig. Deshalb gibt es mehrere if's. Das habe ich aber inzwischen durch case when ersetzt.

    Mein eigentliches Problem ist wirklich nur:
    Wie kann ich den SQLCOD nach einer ausgeführten SQL-Anweisung (das kann eine select oder eine update Anweisung sein) bekommen? Ich möchte erkennen, ob die Anweisung problemlos ausgeführt wurde, ob sie keinen Satz gefunden hat oder ob ein anderer Fehler (z.B. wegen Lock) aufgetreten ist.

    Da ich das an mehreren Stellen im Code brauche, suche ich eine "kurze" Lösung.

  5. #17
    Registriert seit
    Nov 2020
    Beiträge
    343
    Deklariere den SQLCODE als Variable und sie wird, wie von mir schon beschrieben, automatisch von SQL befüllt.

  6. #18
    Registriert seit
    Jan 2012
    Beiträge
    1.139
    Ich versuche gerade folgendes (in diesem Fall für update Anweisungen):

    Code:
    ...
    
    
      case
        when requestLibrary = 'EDDATJRN' and requestTable = 'IDMRBLOB' then
           update idmrblob
           set rb_blob = requestBlob
           where rb_rec_id = requestTableId;
           get diagnostics sqlcod = DB2_RETURNED_SQLCODE;
    
    
        when requestLibrary = 'EDDATJRN' and requestTable = 'IDMBLOBS' then
           update idmblobs
           set bl_blob = requestBlob
           where bl_rec_id = requestTableId;
           get diagnostics sqlcod = DB2_RETURNED_SQLCODE;
    
    
        else
           set errorClob = DAXWS_createErrorJSON(procName, 'ERROR_INPUT_PARAM', 'Lib und/oder Table ungültig.');
      end case;
    
    
      if sqlcod <> 0 then
         set errorClob = DAXWS_createErrorJSON(procName, 'ERROR_UPDATE',
                               'Update war nicht erfolgreich. SQL-Fehlercode ' concat digits(sqlcode) );
      end if;
    
    
      set resultClob = json_object('fehler' value errorClob format json,
                                   'daten'  value nullif(0, 0) );
      return resultClob;
    Wenn ich den Code ausführe, um die Funktion zu erstellen, wird jedoch die Zeile
    get diagnostics sqlcod = DB2_RETURNED_SQLCODE;
    angemeckert.

    Position 33 Token DB2_RETURNED_SQLCODE ungültig. Gültige
    Token: COMMAND_FUNCTION COMMAND_FUNCTION_CODE
    DB2_RELATIVE_COST_ESTIMATE DB2_DIAGNOSTIC_CONVERSION_ERR
    OR DB2_GET_DIAGNOSTICS_DIAGNOSTICS DB2_LAST_ROW
    DB2_NUMBER_CONNECTIONS DB2_NUMBER_PARAMETER_MARKERS
    DB2_NUMBER_RESULT_SETS DB2_NUMBER_ROWS
    DB2_NUMBER_SUCCESSFUL_SUBSTMTS DB2_RETURN_STATUS
    RETURN_STATUS DB2_ROW_COUNT_SECONDARY DB2_ROW_LENGTH
    DB2_SQL_ATTR_CONCURRENCY DB2_SQL_ATTR_CURSOR_CAPABILITY
    DB2_SQL_ATTR_CURSOR_HOLD DB2_SQL_ATTR_CURSOR_ROWSET
    DB2_SQL_ATTR_CURSOR_SCROLLABLE DB2_SQL_ATTR_CURSOR_SENSI
    TIVITY DB2_SQL_ATTR_CURSOR_TYPE DYNAMIC_FUNCTION
    DYNAMIC_FUNCTION_CODE MORE NUMBER ROW_COUNT
    TRANSACTION_ACTIVE TRANSACTIONS_COMMITTED

  7. #19
    Registriert seit
    Jan 2012
    Beiträge
    1.139
    Zitat Zitat von Andreas_Prouza Beitrag anzeigen
    Deklariere den SQLCODE als Variable und sie wird, wie von mir schon beschrieben, automatisch von SQL befüllt.
    Vielen Dank, Andreas.

    ich probiere es jetzt nochmal mit deiner Methode. Vielleicht habe ich eben etwas falsch gemacht.

  8. #20
    Registriert seit
    Nov 2020
    Beiträge
    343

  9. #21
    Registriert seit
    Feb 2001
    Beiträge
    20.319
    Den Declare hatte ich nur bei DB2 allgemein und nicht bei DB2 for i gefunden.
    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. #22
    Registriert seit
    Jan 2012
    Beiträge
    1.139
    Tut mir leid, Andreas. Es funktioniert (bei mir) nicht.

    Nur weil die Variable sqlcode heißt, wird sie (bei mir) noch lange nicht gefüllt.

    Vielleicht muss man doch noch irgendwo angeben, dass sie mit dem sqlcode verknüpft ist?

  11. #23
    Registriert seit
    Feb 2001
    Beiträge
    20.319
    Gefüllt werden sie per get diagnostics;-).
    https://www.rpgpgm.com/2017/03/using...ql-errors.html
    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. #24
    Registriert seit
    Jan 2012
    Beiträge
    1.139
    Es ist und bleibt merkwürdig:

    Ich habe jetzt eine ganz simple Testfunktion geschrieben:

    Code:
    --============================================================================
    -- Test für SQLCODE
    --============================================================================
    
    
    create or replace function edpgmlib/DAXTEST()
    returns varchar(100)
    
    
    language sql
    reads sql data
    
    
    begin
      declare sqlstate char(5) default '00000';
      declare sqlcode int default 0;
      declare var1 char(1);
      declare code1 int default 0;
      declare var2 char(1);
      declare code2 int default 0;
    
    
      select 'J' into var1 from sysdummy1 where ibmreqd = 'Y';
      set code1 = SQLCODE;
    
    
      select 'N' into var2 from sysdummy1 where ibmreqd <> 'Y';
      set code2 = SQLCODE;
    
    
      return 'code1=' concat digits(code1) concat ' code2=' concat digits(code2);
    
    
    end;
    Wenn ich das im SQL mittels
    valuesdaxtest();
    ausführe, klappt es!

    Wie gewünscht, ist das Ergebnis: "code1=0000000000 code2=0000000100"

    Es funktioniert also genau, wie Andreas es beschrieben hat!!

    Bei meiner "echten" UDF klappt es allerdings nicht. Ich muss morgen mal in Ruhe darangehen und gucken, was bei meinem Source anders ist.

    Nochmals Danke für eure Geduld und Hilfe.





Similar Threads

  1. Antworten: 16
    Letzter Beitrag: 29-03-22, 16:25
  2. gelöschte sätze feststellen
    By ILEMax in forum IBM i Hauptforum
    Antworten: 16
    Letzter Beitrag: 15-11-16, 06:56
  3. Feststellen in welchem Feld eine F-Taste gedrückt wurde??
    By JonnyRico in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 20-04-05, 15:29
  4. Remote IP-Drucker => Feststellen Port
    By MAA in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 29-08-04, 11:45
  5. Beendigung von übergebenen Jobs feststellen
    By Cheesy in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 14-07-04, 08:28

Berechtigungen

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