为什么不能约束类型?

时间:2018-07-05 12:54:18

标签: sql oracle


我正在努力处理以下代码:

DECLARE
  TOTACID TAB_OF_ID(50);
  RES NUMBER;
BEGIN
  SELECT DISTINCT ID INTO TOTACID
  FROM TABLE_B;

  FOR indx IN 1 .. TOTACID.COUNT
    LOOP
      RES := F_IMPORT(TOTACID(indx));
      DBMS_OUTPUT.PUT_LINE ('Moved ID ' || RES);
    END LOOP;

END;
/

当我运行它时,它失败并显示错误:

  

错误报告-   ORA-06550:第2行,第11列:   PLS-00566:类型名称“ TAB_OF_ID”不能被限制   ORA-06550:第5行,第19列:   PL / SQL:ORA-00932:数据类型不一致:预期的UDT得到了NUMBER   ORA-06550:第5行,第3列:   PL / SQL:忽略了SQL语句   06550。00000-“%s行,%s列:\ n%s”   *原因:通常是PL / SQL编译错误。   *动作:

TAB_OF_ID的声明如下:

create or replace TYPE TAB_OF_ID AS table of NUMBER(19,2);

我不明白哪里出了问题。似乎无法声明TOTACID TAB_OF_ID(50),但是在几天前创建的函数中,我可以声明LIS_ID TAB_OF_ID := TAB_OF_ID(50);,它可以正常工作。 我在这里的脚本有什么区别?

2 个答案:

答案 0 :(得分:2)

您无法通过为表分配固定数量的记录来声明变量,因此您需要执行以下操作:

DECLARE
  TOTACID TAB_OF_ID;
  RES NUMBER;
BEGIN
  SELECT DISTINCT ID bulk collect INTO TOTACID
  FROM TABLE_B;
  ...
END;
/

另外,请注意,您要获取多个值,因此需要BULK COLLECT INTO

关于

LIS_ID TAB_OF_ID := TAB_OF_ID(50);

在这里,您不是在声明具有给定记录数的变量,而是将表的第50个值分配给该变量。

答案 1 :(得分:2)

显然TOTACID TAB_OF_ID(50)LIS_ID TAB_OF_ID := TAB_OF_ID(50);不同,该命令就像

{variable name} {data type} := {inital value};

其中:= {inital value}是可选的。

TOTACID TAB_OF_ID(50)表示

{variable name} {inital value};

这是无效的语法。