Announcement

Collapse
No announcement yet.

Error-Handling in SQL Stored Procedures

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Error-Handling in SQL Stored Procedures

    Hallo,<br>
    <br>
    ich möchte in einer Stored Procedure (SP) ein SQL-Select absetzen und prüfen ob im Resultset mindesten ein Satz gefunden worden ist. Ich habe schon versucht mit dem "Continue Handler" eine solche Prüfung zu erreichen. Aber irgendwie komme ich auf keinen grünen Zweig. Wer kann mir helfen? Hat jemand vielleicht ein Beispiel für mein Problem?<br>
    <br>
    Gruß,<br>
    Marco

  • #2
    Hallo,

    das folgende Beispiel für den MS SQL Server demonstriert die Vorgehensweise. Über die Systemfunktion <b>@@ROWCOUNT</b> kann man nach dem SELECT prüfen, wie viele Datensätze in der Ergebnismenge vorhanden sind:
    <pre>
    USE tempdb
    <b>GO</b>
    <br>
    <b>CREATE</b> <b>TABLE</b> <b>Test</b>
    (
    recid <b>INTEGER</b> <b>NOT</b> <b>NULL</b> <b>IDENTITY</b> <b>PRIMARY</b> <b>KEY</b>,
    wert <b>VARCHAR</b>(9) <b>NOT</b> <b>NULL</b>
    )
    <b>GO</b>
    <br>
    <b>INSERT</b> <b>INTO</b> <b>Test</b> (wert) <b>VALUES</b> (<font color="#9933CC">'Test 1'</font>)
    <b>INSERT</b> <b>INTO</b> <b>Test</b> (wert) <b>VALUES</b> (<font color="#9933CC">'Test 2'</font>)
    <b>INSERT</b> <b>INTO</b> <b>Test</b> (wert) <b>VALUES</b> (<font color="#9933CC">'Test 3'</font>)
    <b>GO</b>
    <br>
    <b>CREATE</b> <b>PROCEDURE</b> spTest
    (
    @recid <b>INTEGER</b>
    )
    <b>AS</b>
    <b>SELECT</b> * <b>FROM</b> dbo.<b>Test</b> <b>WHERE</b> recid = @recid
    <b>IF</b> @@ROWCOUNT &gt; 0
    <b>BEGIN</b>
    PRINT <font color="#9933CC">'Es wurde ein Datensatz gefunden'</font>
    <b>END</b>
    <b>ELSE</b>
    <b>BEGIN</b>
    PRINT <font color="#9933CC">'Kein Datensatz gefunden'</font>
    <b>END</b>
    <b>GO</b>
    <br>
    -- Stored Procedure testen
    <b>EXEC</b> spTest 4
    </pre&gt

    Comment


    • #3
      Guten Morgen Herr Kosch,<br>
      <br>
      ich habe ganz vergessen zu erwähnen, dass ich mit der AS400 arbeite und DB2 als Datenbank benutze. Dort habe ich es auch schon mit dem Befehl ROW_COUNT ausprobiert. Aber alle Versuche schlugen fehl. Ich sitze schon seit 2 Tagen daran eine Lösung zu finden. Auch eine Suche im Internet nach Beispielen schlug fehl.
      <br>
      Dennoch vielen Dank für Ihre Hilfe!<br>
      <br>
      Gruß,<br>
      Marc

      Comment


      • #4
        Hier die Lösung:<br>
        <br>
        ---- Anweisungsblock für Creat Procedure --- <br>
        <br>
        begin<br>
        <br>
        declare C_SQL varchar(2048);<br>

        declare erg_drmdmod varchar(5);<br>

        declare at_end int default 0;<br>

        declare not_found condition for '02000';<br>

        declare csr_dfm1 dynamic scroll cursor with return for SEL_dfm1 ;<br>

        declare continue handler for not_found set at_end = 1; <br>
        <br>
        set C_SQL = 'select FELDA from '|| c_ziel ||' where FELDA = '|| c_zielwert ||' and FELDB = '''|| c_allnr || ''' ' ;<br>

        <br>

        prepare SEL_dfm1 from C_SQL;<br>

        open csr_dfm1;<br>

        <br>

        fetch csr_dfm1 into erg_drmdmod;<br>

        <br>

        --- Prüfen ob Satz schon vorhanden. <br>

        if (at_end = 1) then<br>
        ...<br>
        ...<br>
        ...<br>
        else<br>
        ...<br>
        ...<br>
        ...<br>
        end if;<br>
        close csr_dfm1;<br>
        end;<br>
        <br>
        Gruß,<br>
        Marc

        Comment

        Working...
        X