[NEWSboard IBMi Forum]
Seite 1 von 3 1 2 ... Letzte
  1. #1
    Registriert seit
    Jan 2012
    Beiträge
    1.139

    SQL Programmierung - Feststellen, ob etwas gefunden wurde

    Guten Tag,
    ich habe eine (wahrscheinlich) triviale Frage:

    Ich möchte eine SQL-Funktion (UDF) schreiben. In der Funktion lese ich mit einer select Anweisung einen Satz aus einer Tabelle.
    Nach der select Anweisung möchte ich möglichst einfach feststellen, ob ein Datensatz gefunden wurde.

    Wenn ich das in embedded SQL im RPGLE machen würde, könnte ich einfach den SQLCOD auf 100 abfragen. Das geht aber so nicht im reinen SQL, oder?

    Hier mal ein ganz einfaches Beispiel:
    Code:
      declare resultBlob Blob(2G) default null;
    
      select rb_blob into resultBlob from idmrepos where re_id = 4711;
    Wenn ich jetzt einfach abfrage, ob das Feld resultBlob null ist, wüsste ich nicht, ob der Key (4711) falsch war oder ob der Key korrekt war, aber das Datenbankfeld rb_blob null war.

    Gibt es eine einfache Methode, das abzufragen? Am liebsten so etwas wie ("if found()") oder so.

    Dieter

  2. #2
    Registriert seit
    Jun 2001
    Beiträge
    1.985
    count(*) optimice for 1 row
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.321
    Der SQLCODE gibt 0, wenn gefunden, 100 bei nicht gefunden zurück.
    Bei Fehlern auch was anderes.
    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
    Jan 2012
    Beiträge
    1.139
    Vielen Dank euch beiden. Aber ich fürchte, ihr habt die Fragestellung nicht richtig gelesen:


    1. Zu Baldur:
      Ich möchte das in SQL programmieren. NICHT in embedded SQL im RPG !!!
      Deshalb habe ich die Variable SQLCOD gar nicht, oder gibt es die auch so im SQL?
    2. Zu Robi:
      Ich will nicht mit einer extra select count -Anweisung die Abfrage nochmal wiederholen. Ich habe eine Anweisung, die mit select Daten aus einem Datensatz holt. Ich will nur wissen, ob das geklappt hat.
      Im RPG würde ich den SQLCOD 100 abfragen. Aber ich bin nicht im RPG!


    Oder habe ich euch falsch verstanden?

  5. #5
    Registriert seit
    Jun 2001
    Beiträge
    1.985
    dann mußt du mehrere Felder holen mit mind. einem, das nicht null werden kann. z.B deine re_id
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.321
    Du hast Recht, die IBM i DB2 macht das etwas anders:
    https://www.ibm.com/docs/en/i/7.4?to...-sql-procedure

    DECLARE CONTINUE HANDLER FOR NOT FOUND
    SET END_TABLE = 1;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    SET DEPT_SALARY = NULL;
    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

  7. #7
    Registriert seit
    Jan 2012
    Beiträge
    1.139
    Zitat Zitat von Robi Beitrag anzeigen
    dann mußt du mehrere Felder holen mit mind. einem, das nicht null werden kann. z.B deine re_id
    Genau das mache ich im Moment. Ich finde es aber unschön und dachte, es gibt etwas eleganteres. Ich mache das jetzt so:

    select true, rb_blob
    into gefunden, resultBlob where ...

    Leider muss man dazu extra eine Variable deklarieren ("gefunden"), die man z.B. im RPG nicht benötigen würde.

  8. #8
    Registriert seit
    Jan 2012
    Beiträge
    1.139
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Du hast Recht, die IBM i DB2 macht das etwas anders:
    https://www.ibm.com/docs/en/i/7.4?to...-sql-procedure

    DECLARE CONTINUE HANDLER FOR NOT FOUND
    SET END_TABLE = 1;
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    SET DEPT_SALARY = NULL;
    Danke für das Beispiel. Aber das finde ich ziemlich kompliziert für so eine eigentlich einfache Sache.
    Man kann sich wohl auch mit GET DIAGONOSTICS die Info besorgen. Aber das ist alles relativ viel Code für eine einfach found-Abfrage, finde ich.

    Aber ich bin beruhigt: Eure Beispiele zeigen mir, dass ich da wohl keine triviale Lösung übersehen habe.

    Nochmals Danke an euch beide.

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.321
    Ob ich nun

    DECLARE CONTINUE HANDLER FOR NOT FOUND
    SET END_TABLE = 1;

    oder

    if SQLCODE <> 0
    SET END_TABLE = 1;

    kodiere, ist doch jetzt nicht der große Unterschied.
    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
    Jan 2012
    Beiträge
    1.139
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Ob ich nun

    DECLARE CONTINUE HANDLER FOR NOT FOUND
    SET END_TABLE = 1;

    oder

    if SQLCODE <> 0
    SET END_TABLE = 1;

    kodiere, ist doch jetzt nicht der große Unterschied.
    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?

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.321
    Ich denke schon. Nur die Variable end_table musst du ja vorher auf 0 setzen;-).
    Probiers doch einfach aus. Du kannst ja SQL-Prozeduren/Funktionen auch debuggen.
    Dies funktioniert allerdings nur über einen 2. Job mit STRSRVJOB Jobname; STRDBG ServiceProgramm;
    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
    Jan 2012
    Beiträge
    1.139
    Viele Dank. ich probiere das mal.

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
  •