我收到ORA-06531:当我运行具有以下详细信息的商店程序时,引用未初始化的集合:
用户定义的数据类型:
CREATE OR REPLACE TYPE T IS TABLE OF VARHCAR2
存储过程定义:
CREATE OR REPLACE PROCEDURE TEST ( u IN T,v OUT T) IS BEGIN FOR i IN u.FIRST..u.LAST LOOP v(i) := u(i); END LOOP; END;
DECLARE v_t T; u_t T; BEGIN v_t := T(); v_t.EXTEND(2); v_t(1) := "This is test1"; v_t(2) := "This is test2"; TEST(v_t,u_t); END;
请帮帮我.提前致谢.
在您的TEST过程中,您将v声明为OUT参数 – 这意味着该过程需要在过程中初始化输出集合(例如v:= T();).即使您更改调用块以初始化u_t,这也无济于事,因为u_t集合未传递给过程 – 它只接收过程传回的内容.
更改您的代码如下:
CREATE OR REPLACE PROCEDURE TEST ( u IN T,v OUT T) IS i NUMBER := u.FIRST; BEGIN v := T(); v.EXTEND(u.COUNT); IF i IS NOT NULL THEN LOOP v(i) := u(i); i := u.NEXT(i); EXIT WHEN i IS NULL; END LOOP; END IF; END TEST; DECLARE v_t T; u_t T; BEGIN v_t := T(); v_t.EXTEND(2); v_t(1) := 'This is test1'; v_t(2) := 'This is test2'; TEST(v_t,u_t); FOR i IN u_t.FIRST..u_t.LAST LOOP DBMS_OUTPUT.PUT_LINE(u_t(i)); END LOOP; END;
请注意,PL / sql中的字符串常量必须用单引号括起来,而不是双引号.
此外 – 使用在过程和调用块中具有相反含义的类似变量名称只会增加混淆.养成使用有意义名字的习惯,以后你会为自己省去很多困惑.
分享和享受.