2017-04-21 36 views
0

我自己做了一個data_object:散裝收集SQL

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

然後我創建類型

CREATE OR REPLACE TYPE my_nt IS TABLE OF my_object; 

而且我想用嵌套表這個對象做一個程序,這將是回報數有些部門的僱員。我已經得到了兩個表:員工和部門,這是我的代碼:

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; 

它告訴我的錯誤:PLS - 00306:數字錯誤的參數的呼叫類型:PUT_LINE

和PL \ SQL: ORA - 00947:數值不足

謝謝!

+1

它不應該是'enum_dname(I).number_type'或'enum_dname(I).varchar_type',而不是僅僅'enum_dname(我)'。你嘗試過嗎? –

+0

@SudiptaMondal:我認爲你應該讓它成爲一個答案 – Nitish

回答

0

您有兩個錯誤。正如@SudiptaMondal指出的那樣(and as here)你不能傳遞一個對象到put_line(),你必須傳遞一個字符串值 - 或者是一個可以連接或隱式轉換的字符串,或者其他值。所以在這裏你可能會這樣做:

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

或者你想要格式化輸出。使用dbms_output作爲除調試之外的任何內容通常不是一個好主意,因爲您無法控制是否有人使用您的代碼啓用了輸出。但這對於這個練習來說可能已經足夠了。

導致ORA-00947的第二個問題是因爲您的查詢試圖將兩個標量變量批量收集到對象集合中。您需要包括對象的構造函數:

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

是的,它的工作原理!謝謝你,你太棒了:) – Bopinko