SQL Developer ERROR: Reference to uninitialized collection

SQL Developer ERROR: Reference to uninitialized collection

我正在从 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 引用未初始化的集合 **

这是实际 有效的代码 。看看是怎么做到的。

类型和样本table:

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.

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

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>