创建Oracle过程错误-声明自定义类型
我正在尝试使用web界面在Oracle Express Server(Application Express 2.1.0.00.39)中创建一个过程 这是我通过web界面中的创建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
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”),它可能会起作用