我自己做了一个data_object:
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:值不够
谢谢!
答案 0 :(得分: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
...