我正在尝试使用网络界面在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;
将SELECT column_value FROM TABLE
更改为SELECT column_value FROM TABLE(listOfNumbers)
,但现在我收到以下错误:
PLS-00201:标识符'num_list'必须 宣布
以下是我创建类型的方式:
CREATE OR REPLACE TYPE "num_list" as table of NUMBER(38,1)
/
似乎是在参数声明行上引起错误:
(listOfNumbers num_list, v_value varchar2)
以下是Oracle Database Express Edition Web界面显示的对象详细信息。
答案 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)
我不确定原因,但确实有效。