FUNCTION调用问题中的PL/SQL集合



我有一个函数MY_FUNC,它将PL/SQL集合作为参数。

但是,当我试图编译一个包时,会遇到一个错误,该包包含一个在INSERT语句中调用MY_FUNC的过程(MY_procedure(。以下是过程和对函数的调用

MY_PROCEDURE (var1 IN OUT VARCHAR2, in_table_list IN OUT bf_types.table_of_addresses_type) 
IS
BEGIN
INSERT INTO my_tab
SELECT col_A,
col_B, 
MY_FUNC(var1, in_table_list)
FROM json_table (json_str etc etc)
END my_procedure;
/

我得到以下错误:

541/3 PL/SQL:SQL语句被忽略561/3 PL/SQL:ORA-00904:"MY_FUNC":无效标识符

561/3 PLS-00306:调用中的参数数量或类型错误'MY_FUNC'

561/42 PLS-00382:表达式的类型错误

以下是编译良好的MY_FUNC的代码:

CREATE OR REPLACE FUNCTION my_func (in_marketid IN VARCHAR2, in_list_of_addresses IN bf_types.table_of_addresses_type) RETURN DATE
IS
cnt INTEGER;
BEGIN
cnt := TO_NUMBER(SUBSTR(in_marketid,1,1));
RETURN(in_list_of_addresses(cnt).move_in_date);
END my_func;`

为了进行测试,我更改了MY_FUNC以删除PL/SQL集合参数,并修改了我的调用。

即创建或替换函数my_func(VARCHAR2中的in_markeid(返回日期

代码是复杂的,所以如果INSERT语句中的函数以PL/SQL表(集合(为参数,那么调用该函数似乎有问题。此外,请注意,MY_FUNC已在包外声明。

如果有人能帮忙,我将不胜感激。

但是,当我试图编译一个包含在INSERT语句中调用MY_FUNC的过程(MY_procedure(。以下是函数的过程和调用

我试着模拟你的情况,并准备了一些可以供你参考的东西。请阅读我的在线评论。

--Created Object
CREATE OR REPLACE TYPE  table_of_addresses_type IS OBJECT
(
move_in_date date
);
--table of your object
create or replace Type v_table_of_addresses_type is table of  table_of_addresses_type;
/
--Table for inserting the record
CREATE TABLE my_tab(col DATE);
/
--Function
CREATE OR REPLACE   FUNCTION my_func(
in_marketid          IN VARCHAR2,
in_list_of_addresses IN v_table_of_addresses_type)
RETURN DATE
IS
cnt INTEGER;
BEGIN
cnt := TO_NUMBER(SUBSTR(in_marketid,1,1));
RETURN(in_list_of_addresses(cnt).move_in_date);
END my_func;
/
--Procedure
CREATE OR REPLACE PROCEDURE MY_PROCEDURE(
var1          IN OUT VARCHAR2,
in_table_list IN OUT v_table_of_addresses_type)
IS
BEGIN
INSERT INTO my_tab
SELECT MY_FUNC(var1, in_table_list) FROM dual;
COMMIT;
END my_procedure;
/
--Calling / Exection:
DECLARE
x v_table_of_addresses_type :=v_table_of_addresses_type();
v_dt DATE;
var1 VARCHAR2(10);
BEGIN
x.EXTEND(3);
--Populating the collection manually. You can populate it via a query as well
x(1) := table_of_addresses_type(to_date('2017-05-21','YYYY-MM-DD'));
x(2) := table_of_addresses_type(to_date('2017-05-22','YYYY-MM-DD'));
x(3) := table_of_addresses_type(to_date('2017-05-23','YYYY-MM-DD'));
--testing function call
v_dt := MY_FUNC('111',x);
dbms_output.put_line (v_dt);
var1:= '111';
--Calling Procedure. have to pass the var1 since its decalre as INOUT paramater in your procedure.
MY_PROCEDURE(var1,x);
END;
/
--testing records from the table
Select * from my_tab

附言:你可以把程序和函数包装在一个包里,而我在回答中没有这样做。

最新更新