加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

oracle – 对未初始化的集合PL / SQL的引用

发布时间:2020-12-12 13:09:12 所属栏目:百科 来源:网络整理
导读:我收到ORA-06531:当我运行具有以下详细信息的商店程序时,引用未初始化的集合: 用户定义的数据类型: CREATE OR REPLACE TYPE T IS TABLE OF VARHCAR2 存储过程定义: CREATE OR REPLACE PROCEDURE TEST ( u IN T,v OUT T)ISBEGIN FOR i IN u.FIRST..u.LAST
我收到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中的字符串常量必须用单引号括起来,而不是双引号.

此外 – 使用在过程和调用块中具有相反含义的类似变量名称只会增加混淆.养成使用有意义名字的习惯,以后你会为自己省去很多困惑.

分享和享受.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读