Function 函数调用中的PL/SQL集合问题

Function 函数调用中的PL/SQL集合问题,function,plsql,collections,Function,Plsql,Collections,我有一个函数MY_FUNC,它将PL/SQL集合作为参数 但是,当我试图编译一个包时,它有一个在INSERT语句中调用MY_FUNC的过程(MY_过程),我会遇到一个错误。以下是过程和对函数的调用 MY_PROCEDURE (var1 IN OUT VARCHAR2, in_table_list IN OUT bf_types.table_of_addresses_type) IS BEGIN INSERT INTO my_tab SELECT c

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

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

    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:“我的函数”:无效 标识符

561/3 PLS-00306:调用中的参数数量或类型错误 “我的_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;`
为了进行测试,我更改了我的_FUNC以删除PL/SQL集合参数,并修改了我的调用

i、 e.创建或替换函数my_func(VARCHAR2中的市场化)返回日期

代码比较复杂,因此如果函数采用PL/SQL表(集合)作为参数,则在INSERT语句中调用函数似乎有问题。另外,请注意,MY_FUNC已在包外声明

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

然而,当我试图编译一个包含 在INSERT语句中调用MY_FUNC的过程(MY_过程)。 下面是过程和对函数的调用

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

--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

PS:您可以将过程和函数包装在一个包中,我在回答中没有这样做。

您可以在调用部分尝试使用schema name.function\u name吗?如果schema name是schema1,那么schema1.myfunc或从insert语句中删除函数调用,并尝试在过程中正常调用函数。。检查它是否工作。