【问题标题】:SQL Developer ERROR: Reference to uninitialized collectionSQL Developer 错误:对未初始化集合的引用
【发布时间】:2021-03-19 04:01:41
【问题描述】:

我正在从 SQL DEVELPER 执行以下过程,我可以选择插入 z_id 和 i_type 的输入值,但是 i_data 是灰色的。

不能从 SQL 执行带有输入参数的过程作为集合 开发工具?

我在这里缺少什么?代码已编译但无法通过 SQL Developer 执行

以下是我所做的,但这会在 Oracle 19c 上产生编译错误

create or replace type my_type AS OBJECT (
p_id number,
p_text varchar2 (100),
p_details clob);
/
create or replace type tab1 is table of my_type;
/



 create or replace procedure vehicle_det (z_id in varchar2, i_type in varchar2, i_data in tab1)
    IS
   BEGIN
    for i in 1..i_data.count
    LOOP
    if (i_type ='BMW')
    THEN
    UPDATE STOCK_DATA
    set stock_id=i_data(i).p_id, stock_des=i_data(i).p_text, clearance=i_data(i).p_details where s_id=z_id ;
    end if;
    end loop;
    end vehicle_det;

以下是错误,请提供您的智慧:::: **错误 --ORA-06531 引用未初始化的集合**

【问题讨论】:

  • 参数i_data 的类型为my_type,它是一个标量。你不能迭代一个标量。我的猜测是您打算将 i_data 设为 tab1 类型,这是一个集合。你可以遍历一个集合。
  • @JustinCave 感谢您的智慧,更新了有问题的代码,但无法执行 ERROR --ORA-06531 Reference to uninitialized collection
  • 如果您在调用代码时遇到错误,请编辑您的问题以包括您如何调用该过程。我的猜测是您在调用过程之前没有正确初始化集合。
  • @JustinCave 我正在尝试从 SQL Developer 工具执行过程已更新问题
  • @JustinCave,你不觉得 OP 在过程定义中缺少 BEGIN 关键字吗?

标签: oracle plsql collections


【解决方案1】:

这是实际工作的代码。看看它是如何完成的。

类型和示例表:

SQL> create or replace type my_type AS OBJECT (
  2    p_id      number,
  3    p_text    varchar2 (100),
  4    p_details clob);
  5  /

Type created.

SQL> create or replace type tab1 is table of my_type;
  2  /

Type created.

SQL> create table stock_data
  2    (s_id       number,
  3     stock_id   number,
  4     stock_des  varchar2(20),
  5     clearance  clob);

Table created.

SQL> insert into stock_data
  2    select 1 s_id, 1 stock_id, 'Description' stock_Des, null clearance
  3    from dual;

1 row created.

SQL>

程序:

SQL> create or replace procedure vehicle_det
  2    (z_id in varchar2, i_type in varchar2, i_data in tab1)
  3  IS
  4  BEGIN
  5    for i in 1..i_data.count LOOP
  6      if i_type = 'BMW' THEN
  7         UPDATE STOCK_DATA
  8           set stock_id  = i_data(i).p_id,
  9               stock_des = i_data(i).p_text,
 10               clearance = i_data(i).p_details
 11           where s_id = z_id ;
 12      end if;
 13    end loop;
 14  end vehicle_det;
 15  /

Procedure created.

测试:当前表格内容/运行程序/查看结果:

SQL> select * from stock_data;

      S_ID   STOCK_ID STOCK_DES            CLEARANCE
---------- ---------- -------------------- ------------------------------
         1          1 Description

SQL> declare
  2    l_data tab1 := tab1();
  3  begin
  4    l_data.extend;
  5    l_data(1) := my_type(1, 'This is BMW', 'Oh yes, this IS a BMW!');
  6
  7    vehicle_det(1, 'BMW', l_data);
  8  end;
  9  /

PL/SQL procedure successfully completed.

SQL> select * from stock_data;

      S_ID   STOCK_ID STOCK_DES            CLEARANCE
---------- ---------- -------------------- ------------------------------
         1          1 This is BMW          Oh yes, this IS a BMW!

SQL>

【讨论】:

  • 像魅力一样工作@littlefoot 感谢您的帮助
  • 有没有办法我可以使用动态 sql 编写下面的正则表达式 regexp_replace(result_of_first_pass, '\.(docx|pdf|msg) ', '.\1, ') 在尝试编写动态 sql 时无法转义所有字符
  • 你应该为一个新问题打开一个新问题。请这样做,正确解释。
  • 是的,我可以,但我没有足够的积分来提问,你能帮我一次@littlefoot
  • 嗯?那你怎么打开你之前的三个问题呢?您不必有任何 学分 即可询问。
猜你喜欢
  • 2014-10-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-01
相关资源
最近更新 更多