1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • 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
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • java-girl
    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

  • 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
    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!

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

  1. Datenschutzerklärung
  2. Impressum