创建Oracle过程错误 - 声明自定义类型

时间:2010-11-23 22:23:46

标签: oracle stored-procedures

我正在尝试使用网络界面在Oracle Express Server(Application Express 2.1.0.00.39)中创建一个过程。

这是我通过Web界面中的SQL Commands选项运行的SQL

CREATE OR REPLACE PROCEDURE my_procedure (listOfNumbers num_list, 
                                          v_value varchar2)

IS

  PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN

  UPDATE my_table
     SET my_column = v_value
   WHERE my_row_id IN (SELECT column_value 
                         FROM TABLE(listOfNumbers));

  COMMIT;

END;

UPDATE:

SELECT column_value FROM TABLE更改为SELECT column_value FROM TABLE(listOfNumbers),但现在我收到以下错误:

  

PLS-00201:标识符'num_list'必须   宣布

更新2:

以下是我创建类型的方式:

CREATE OR REPLACE TYPE  "num_list" as table of NUMBER(38,1)
/

似乎是在参数声明行上引起错误:

(listOfNumbers num_list, v_value varchar2)

以下是Oracle Database Express Edition Web界面显示的对象详细信息。

alt text

3 个答案:

答案 0 :(得分:2)

尝试... TABLE(CAST(listOfNumbers AS num_list))

SQL解析器只是看到一个绑定占位符代替listOfNumbers,因为它是一个自定义类型,你需要告诉它它是什么类型。

这只有在num_list被定义为模式中的类型时才有效,而不仅仅是在PL / SQL块中声明为类型。

答案 1 :(得分:0)

您的代码有效 - 提供的数组类型已正确声明(见下文)。因为你还有问题我怀疑你出错了。但是您需要发布您正在使用的代码来创建NUM_LIST类型,以便我们更正它。

我的测试数据:

SQL> select * from my_table
  2  /

MY_COLUMN             MY_ROW_ID
-------------------- ----------
APC                           1
XYZ                           2
JFK                           3

SQL>

为了在SQL语句中使用类型,我们必须将其创建为SQL对象:

SQL> create type num_list as table of number;
  2  /

Type created.

SQL>
SQL>
SQL> create or replace procedure my_procedure
  2      (listofnumbers num_list,
  3                    v_value varchar2)
  4  is
  5  begin
  6
  7    update my_table
  8       set my_column = v_value
  9     where my_row_id in (select column_value
 10                           from table(listofnumbers));
 11
 12  end;
 13  /

Procedure created.

SQL>

执行程序:

SQL> declare
  2    n num_list := num_list(1,3);
  3  begin
  4    my_procedure (n , 'FOX IN SOCKS');
  5  end;
  6  /

PL/SQL procedure successfully completed.

SQL>

并且lo!

SQL> select * from my_table
  2  /

MY_COLUMN             MY_ROW_ID
-------------------- ----------
FOX IN SOCKS                  1
XYZ                           2
FOX IN SOCKS                  3

SQL>  

答案 2 :(得分:0)

显然我正在创建名称周围带引号的类型:

以下无效

CREATE OR REPLACE TYPE  "NUMBER_T" as table of NUMBER(38,1)

当我没有引号然后创建程序时,它能够识别它。

以下确实有效

CREATE OR REPLACE TYPE  NUMBER_T as table of NUMBER(38,1)

我不确定原因,但确实有效。