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

Hybrid View

  1. #1
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    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.

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

  3. #3
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    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.

  4. #4
    Registriert seit
    Nov 2020
    Beiträge
    418

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    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

  6. #6
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    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?

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    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

  8. #8
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    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.





  9. #9
    Registriert seit
    Nov 2020
    Beiträge
    418
    Genau, ich verwende das schon seit langem so, ist also nicht abhängig vom Release.
    Wichtig ist nur, dass das Declare ganz genau so definiert wird.
    Wenn es bei der "echten" UDF nicht klappt, schick ggf. mal den Code.

    @Baldur: Ich glaube, das kann man im SQL Programming Redbook (heißen die noch so?) nachlesen.

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Aber warum stehts nicht in der Online-Doku bzw. ich finde es nicht?
    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

  11. #11
    Registriert seit
    Nov 2020
    Beiträge
    418
    Ja, das stimmt schon, es ist teilweise relativ schwer spezielle Informationen zu finden.
    Ich habe damals, als ich für meine DB Workshops, das Programm zusammen gestellt habe, die ganzen DB Redbooks !komplett! gelesen.

    Redbook: "SQL Procedures, Triggers, andFunctions on IBM DB2 for i"
    Kapitel: 2.6.6 Direct SQLSTATE and SQLCODE usage
    Sometimes, it is handy to use the SQLSTATE or SQLCODE directly. Although error handlingis provided by the conditions, handlers and GET DIAGNOSTICS in PSM mostly preclude theneed for direct usage. However, direct usage can facilitate efficiencies sometimes in writingcode.

    To access these values in an SQL procedure, you must first define them as variables with theexact names, as shown in Example 2-42.

    Example 2-42 Declaring SQLCODE and SQLSTATE
    DECLARE SQLCODE INTEGER DEFAULT 0;
    DECLARE SQLSTATE CHAR(5) DEFAULT '00000';

  12. #12
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    Hallo zusammen,
    ich habe das Problem gefunden. Wenn man es erstmal verstanden hat, ist es ganz einfach:


    Ich habe in meinem Programm 2 select-Anweisungen, von denen nur eine ausgeführt wird:
    Code:
    if a=b then
       select irgendwas, was schief geht (also not found);
    end if;
    
    if a<>b then
       select irgendetwas anderes;
    end if;
    
    code = sqlcode;   
    An dieser Stelle sollte der sqlcode eigentlich noch 100 sein, 
    weil die erste select-Anweisung ausgeführt wurde, aber nichts gefunden hat.
    Die zweite select-Anweisung wurde wegen des if a<>b nicht ausgeführt, 
    sollte meiner Meinung nach also den sqlcode nicht verstellen.
    
    Aber: Der sqlcode wird von jeder SQL-Anweisung verändert.
    Die Anweisung if a<>B ist ja auch eine SQL-Anweisung (wenn auch nur 
    eine Strukturanweisung). Diese Anweisung stellt den sqlcode wieder zurück auf 0, 
    da ja ein Vergleich technisch gesehen fehlerfrei stattgefunden hat.
    Jetzt werdet ihr sagen: War ja klar, habe ich ja schon immer gewusst ...

    Ok, das würde ich euch auch glauben :-)

    Ich fand aber es schon tricky.

    Nochmals Danke,

    Dieter

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
  •