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

创建Oracle过程错误-声明自定义类型,oracle,stored-procedures,Oracle,Stored Procedures,我正在尝试使用web界面在Oracle Express Server(Application Express 2.1.0.00.39)中创建一个过程 这是我通过web界面中的SQL命令选项运行的SQL CREATE OR REPLACE PROCEDURE my_procedure (listOfNumbers num_list, v_value varchar2) IS PRAGMA AUTONOMO

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

这是我通过web界面中的
SQL命令
选项运行的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;
更新: 将表中的
选择列值更改为
从表中选择列值(列表编号)
,但现在出现以下错误:

PLS-00201:标识符“编号列表”必须为 宣布

更新2: 以下是我如何创建我的类型:

CREATE OR REPLACE TYPE  "num_list" as table of NUMBER(38,1)
/
似乎是在参数声明行上导致错误:

(listOfNumbers num_list, v_value varchar2)
以下是Oracle Database Express Edition web界面显示的对象详细信息

试试……
表(CAST(以num\u列表的形式列出数字))

SQL解析器只是看到一个绑定占位符来代替
listofNumber
,因为它是一个自定义类型,所以您需要告诉它它是什么类型


只有在模式中将
num\u list
定义为一个类型,而不仅仅是在PL/SQL块中声明为一个类型的情况下,这才有效。

如果数组类型已正确声明,则代码有效(见下文)。因为你仍然有一个问题,我怀疑这就是你出错的地方。但是您需要发布用于创建NUM_列表类型的代码,以便我们更正它

我的测试数据:

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>

SQL> select * from my_table
  2  /

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

SQL>  

显然,我是在创建名称周围加引号的类型:

以下无效

CREATE OR REPLACE TYPE  "NUMBER_T" as table of NUMBER(38,1)
CREATE OR REPLACE TYPE  NUMBER_T as table of NUMBER(38,1)
当我在没有引号的情况下创建过程时,它能够识别它

以下内容确实有效:

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

我不知道为什么,但它起作用了。

有,但我看不出发布的抽象代码有什么问题。更新是否在存储过程之外工作?是的,更新工作。我更新了我的问题,似乎在为嵌套的select语句添加
listofNumber
后出现了新的错误。@rla-我将
中的
添加到参数中,仍然得到了括号错误。当我从表(ListofNumber)中添加
时,我得到了一个不同的错误。检查更新。模式中声明了类型
num\u list
。我用如何创建类型更新了我的问题。可能引号强制名称区分大小写,我打赌如果您将类型声明为“NUMBER_T”,然后以完全相同的方式指定参数(即listOfNumbers“NUMBER_T”),它可能会起作用