【问题标题】:Bulk collect sql批量收集sql
【发布时间】:2017-04-21 07:40:12
【问题描述】:

我自己做了一个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:没有足够的值

谢谢!

【问题讨论】:

  • 不应该是enum_dname(i).number_typeenum_dname(i).varchar_type 而不仅仅是enum_dname(i)。你试过吗?
  • @SudiptaMondal:我认为你应该把它作为一个答案

标签: oracle plsql


【解决方案1】:

你有两个错误。正如@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
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    相关资源
    最近更新 更多