2017-04-21 7 views
0

Ich habe eine Daten_Objekt von mir:Masse sammeln SQL

CREATE OR REPLACE TYPE my_object AS OBJECT(
number_type  NUMBER, 
varchar_type VARCHAR2(20) 
) 

und erstellen Sie dann i-Typ

CREATE OR REPLACE TYPE my_nt IS TABLE OF my_object; 

Und ich möchte mit verschachtelten Tabelle und diese Aufgabe, ein Verfahren machen, die Rücksendenummer wird von Mitarbeitern einiger Abteilungen. Ich habe zwei Tabellen bekommt: Mitarbeiter und Abteilung ein dies ist mein Code:

DECLARE 
    enum_dname my_nt := my_nt(); 
PROCEDURE print_l IS 
    BEGIN 
     DBMS_OUTPUT.put_line('---------------------------------------------------------'); 
    FOR i IN 1..enum_dname.COUNT 
     LOOP 
     DBMS_OUTPUT.PUT_LINE(enum_dname(i)); 
     END LOOP; 
    END; 
BEGIN 
    SELECT COUNT(emp_id) as number_of, department_name 
    BULK COLLECT INTO enum_dname 
    FROM employees e, department d 
    WHERE e.department_id = d.department_id 
    GROUP BY department_name; 
    print_l; 
    END; 

Und es mir Fehler zeigen: PLS - 00306: Falsche Zahlen Argument in Anruftyp: PUT_LINE

und PL \ SQL: ORA - 00947: nicht genug Werte

DANKE!

+1

Sollte es nicht sein 'enum_dname (i) .number_type' oder' enum_dname (i) .varchar_type' statt nur 'enum_dname (i)'. Hast du das probiert? –

+0

@SudiptaMondal: Ich denke, Sie sollten es eine Antwort machen – Nitish

Antwort

0

Sie haben zwei Fehler. Wie @SudiptaMondal gezeigt hat (and as here) können Sie kein Objekt an put_line() übergeben, Sie müssen einen einzelnen String-Wert übergeben - oder etwas, das zu einer Zeichenfolge auswertet, die verkettet oder implizit konvertiert werden kann oder was auch immer. Also hier könnten Sie tun:

DBMS_OUTPUT.PUT_LINE(enum_dname(i).varchar_type || ': ' || enum_dname(i).number_type); 

oder wie Sie diesen Ausgang formatieren möchten. Die Verwendung von dbms_output für alles außer Debugging ist im Allgemeinen keine gute Idee, da Sie keine Kontrolle darüber haben, ob jemand, der Ihren Code verwendet, die Ausgabe aktiviert hat. Aber das könnte für diese Übung ausreichen.

Das zweite Problem, das den ORA-00947 verursacht, ist, weil Ihre Abfrage versucht, zwei skalare Variablen in einer Objektgruppe zu sammeln. Sie müssen den Objektkonstruktor enthalten:

SELECT my_object(COUNT(emp_id), department_name) 
BULK COLLECT INTO enum_dname 
... 
+0

Ja, das funktioniert! Danke, du bist erstaunlich :) – Bopinko

Verwandte Themen