1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

PL/SQL: seltsames Problem bei Abbruchbedingungen

  • java-girl
  • 5. November 2007 um 11:14
  • Unerledigt
  • java-girl
    14
    java-girl
    Mitglied
    Reaktionen
    7
    Punkte
    2.037
    Beiträge
    357
    • 5. November 2007 um 11:14
    • #1

    Hallo!

    Kann mir jemand von euch sagen, was an dieser Syntax falsch ist?

    Code
    WHILE (cur > 9) LOOP
        DBMS_OUTPUT.PUT_LINE('Test ');
        cur := cur - MOD(cur, 10);
        cur := cur/10; 
        DBMS_OUTPUT.PUT_LINE('Test ' || sum1 || ' t ' || cur);
    END LOOP;



    Ursprünglich hatte ich nämlich statt > 9 >10 dort stehen, und damit hat es funktioniert. Bloß war da ein Denkfehler drinnen, und ich brauch > 9. Bei >= 10 kommt das selbe Ergebnis wie bei > 9 : die Prozedur hängt sich auf, und zwar noch vor der allerersten Anweisung. Und sie hängt sich so auf, dass das SQL-Fenster steht.
    Hier der gesamte Code:

    Code
    CREATE OR REPLACE FUNCTION benford(tname IN VARCHAR2, col IN VARCHAR2, nameRes VARCHAR2) RETURN BOOLEAN 
    IS
     TYPE freq_table_typ IS TABLE OF NUMBER
              INDEX BY BINARY_INTEGER;
     freq_table freq_table_typ;
     TYPE curs IS REF CURSOR;
     ref_curs curs;
     sqlstring VARCHAR2(2000);
     cur BINARY_INTEGER;
     v_index BINARY_INTEGER;
     sum1 NUMBER;
     perc NUMBER;
    BEGIN
     [B]DBMS_OUTPUT.PUT_LINE('Test 1');[/B]
     freq_table(1) := 0;
     freq_table(2) := 0;
     freq_table(3) := 0;
     freq_table(4) := 0;
     freq_table(5) := 0;
     freq_table(6) := 0;
     freq_table(7) := 0;
     freq_table(8) := 0;
     freq_table(9) := 0;
     sum1 := 0;
     sqlstring := 'CREATE TABLE ' || nameRes || ' (num NUMBER, freq NUMBER, perc NUMBER)';
     EXECUTE IMMEDIATE sqlstring;
     sqlstring  := 'SELECT  '||col||' FROM  '||tname;
     OPEN  ref_curs FOR sqlstring;
     LOOP
      FETCH ref_curs INTO cur;
      IF cur < 1 THEN
       cur := cur * 10;
      ELSE
      DBMS_OUTPUT.PUT_LINE(cur);
       WHILE (cur > 9) LOOP
        DBMS_OUTPUT.PUT_LINE('Test ');
        cur := cur - MOD(cur, 10);
        cur := cur/10; 
        DBMS_OUTPUT.PUT_LINE('Test ' || sum1 || ' t ' || cur);
       END LOOP;
      END IF;
      freq_table(cur) := freq_table(cur) + 1;
      sum1 := sum1 + 1; 
     
     END LOOP;
     
     
     CLOSE ref_curs;
     
     v_index := freq_table.first;
     while v_index is not NULL loop
      perc := freq_table(cur) / sum1 * 100;
      EXECUTE IMMEDIATE 'INSERT INTO ' || nameRes || ' VALUES(' || v_index || ', '
      || freq_table(cur) || ', ' || perc || ')';
      v_index := freq_table.next(v_index);
     end loop;
     RETURN TRUE;
    EXCEPTION
      WHEN OTHERS THEN 
       DBMS_OUTPUT.PUT_LINE(sqlerrm);
       RETURN FALSE;
    END;
    /
    show errors;
    Alles anzeigen



    Nicht einmal die erste (fett markierte Ausgabe) wird ausgeführt!
    Und ich habe keinen Plan wieso, da es mit der Anweisung >10 perfekt funktioniert (nur halt nicht so wie es sein sollte...)

    Hat jemand eine Ahnung?
    Ich tippe ja darauf, dass er irgendwas falsch hineinkompiliert...aber keine Ahnung was das sein soll.

    Lg.
    java-girl

    There's no better place than 127.0.0.1!

  • Paulchen
    1
    Paulchen
    Gast
    • 5. November 2007 um 11:54
    • #2

    Das erste Codestück ist in Ordnung, für's zweite bin ich zu faul. Hast du "SET SERVEROUTPUT ON;" ausgeführt? Wenn nein, dann gibt DBMS_OUTPUT.PUT_LINE nämlich nix aus.

    Ich hab folgende Prozedur erstellt:

    Code
    CREATE OR REPLACE PROCEDURE blubb(input IN BINARY_INTEGER) IS
    	sum1 BINARY_INTEGER;
    	cur BINARY_INTEGER;
    BEGIN
    	sum1 := 0;
    	cur := input;
    	WHILE (cur > 9) LOOP
    		DBMS_OUTPUT.PUT_LINE('Test ');
    		cur := cur - MOD(cur, 10);
    		cur := cur/10; 
    		DBMS_OUTPUT.PUT_LINE('Test ' || sum1 || ' t ' || cur);
    	END LOOP;
    END;
    /
    Alles anzeigen


    Und das lässt sich wunderbar ausführen:

    Code
    SQL> set serveroutput on;
    SQL> call blubb(0);
    
    
    Call completed.
    
    
    SQL> call blubb(10);
    Test
    Test 0 t 1
    
    
    Call completed.
    
    
    SQL> call blubb(100);
    Test
    Test 0 t 10
    Test
    Test 0 t 1
    
    
    Call completed.
    
    
    SQL> call blubb(500);
    Test
    Test 0 t 50
    Test
    Test 0 t 5
    
    
    Call completed.
    Alles anzeigen

    (Oracle Database 11g Release 11.1.0.6.0)

  • java-girl
    14
    java-girl
    Mitglied
    Reaktionen
    7
    Punkte
    2.037
    Beiträge
    357
    • 5. November 2007 um 16:33
    • #3
    Zitat von Paulchen

    Das erste Codestück ist in Ordnung, für's zweite bin ich zu faul. Hast du &quot;SET SERVEROUTPUT ON;&quot; ausgeführt? Wenn nein, dann gibt DBMS_OUTPUT.PUT_LINE nämlich nix aus.</p>

    Klar, ich bin doch nicht dämlich.Ausserdem habe ich ja bereits erwähnt dass genau das selbe Programm mit > 10 geht und mit > 9 nicht.


    EDIT: Zwar etwas verspätet aber doch: das Problem lag doch wo anders, und etwas, was ich vorher leider nicht gewusst habe ist das SQL-Plus zuerst die Befehler an den Server sendet, der Server diese dann ausführt und erst am Ende selbiger die Ausgabe zurücksendet. Ich war in einer Endlosschleife verfangen, deswegen keine Ausgabe und der Hänger.
    Trotzdem noch mal danke!

    There's no better place than 127.0.0.1!

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung