我正在努力处理以下代码:
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);
,它可以正常工作。
我在这里的脚本有什么区别?
答案 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};
这是无效的语法。