我正在使用这个匿名函数来测试编程构造以包含在更大的脚本中:
DECLARE
TYPE array IS TABLE OF VARCHAR2(255);
g_to array DEFAULT array ();
BEGIN
INSERT INTO g_to VALUES ('myaddy@internet.com');
END;
但是,当我运行它时,我得到:
*Error starting at line : 1 in command -
DECLARE
TYPE array IS TABLE OF VARCHAR2(255);
g_to array DEFAULT array ();
BEGIN
INSERT INTO g_to VALUES ('myaddy@internet.com');
END;
Error report -
ORA-06550: line 10, column 17:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 10, column 5:
PL/SQL: SQL Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:*
现在,数组已明确定义,为什么INSERT失败?
答案 0 :(得分:1)
当您将数组放入需要由SQL解释器解释的位置(而不是PL / SQL解释器)时,该数组必须是数据库对象,而不是本地定义的。例如,当您想要从数组中进行选择时就是这种情况。
但是,在这种情况下,即使数组是数据库对象,您也会尝试执行无效操作。无论声明是什么,您都无法将变量指定为INSERT
语句的目标。要正确执行此操作,您需要使用SELECT... BULK COLLECT INTO...
:
DECLARE
TYPE array IS TABLE OF VARCHAR2(255);
g_to array DEFAULT array ();
BEGIN
SELECT 'myaddy@internet.com' BULK COLLECT INTO g_to FROM dual;
END;
但是,如果您只是在数组中添加静态值,那么最好不要使用SQL跳过上下文切换并直接插入值:
DECLARE
TYPE array IS TABLE OF VARCHAR2(255);
g_to array DEFAULT array ();
BEGIN
g_to.extend
g_to(g_to.last) := 'myaddy@internet.com';
END;