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

标签 oracle stored-procedures plsql

当我运行具有以下详细信息的存储过程时,我收到 ORA-06531:对未初始化集合的引用:

用户定义的数据类型:

CREATE OR REPLACE TYPE T IS TABLE OF VARCHAR2;

存储过程定义:

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();)。即使您更改调用 block 来初始化 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 中的字符串常量必须用单引号括起来,而不是双引号。

此外 - 使用在过程和调用 block 中具有相反含义的相似变量名只会增加困惑。养成使用有意义的名称的习惯,以后您会避免很多困惑。

分享并享受。

关于oracle - 对未初始化集合 PL/SQL 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25201903/

相关文章:

java - 在 Oracle 表中存储 JSON 数组

php - Mysql存储过程: DEFINER =`root` @`%` is not working in localhost

sql - 为什么 SQL Server 不能更改存储过程中的 View ?

mysql - 返回该月的最后一天

c# - 存储过程动态排序依据

sql - 使用 XMLTYPE 输出执行 Oracle 存储过程并将其捕获到 SSIS 变量中

sql - 选择最近的行,优化 (Oracle SQL)

database - Oracle : Locking or not? 中的并发更新

c# - 在没有存储过程的情况下从 C# 将二进制数据插入 SQL

linux - 无法使用 expdp 导出,无法打开日志等等