roh*_*wal 9 oracle plsql stored-procedures
我ORA-06531: Reference to uninitialized collection在运行商店程序时收到以下详细信息:
用户定义的数据类型:
CREATE OR REPLACE TYPE T IS TABLE OF VARCHAR2;
Run Code Online (Sandbox Code Playgroud)
存储过程定义:
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;
Run Code Online (Sandbox Code Playgroud)
我使用以下内容来调用该过程:
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;
Run Code Online (Sandbox Code Playgroud)
请帮帮我.提前致谢.
Bob*_*ica 15
在您的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;
Run Code Online (Sandbox Code Playgroud)
请注意,PL/SQL中的字符串常量必须用单引号括起来,而不是双引号.
此外 - 使用在过程和调用块中具有相反含义的类似变量名称只会增加混淆.养成使用有意义的名字的习惯,以后你会为自己省去很多困惑.
分享和享受.