将数组传递给 PL/SQL

问题描述 投票:0回答:1

我正在尝试将数组从 shell 脚本传递到 PL?SQL 过程。

    sqlplus -s $RAN_UID <<EOF > $OUTPUTS/$file.txt
    set serveroutput on;
    declare
        type nation_list is table of varchar2(100);
        v_nations nation_list := nation_list(${nation//,/','});
    begin
        for i in 1..v_nations.count loop
            dbms_output.put_line('Nation = ' || v_nations(i));
        end loop;
        process_failed_requests(p_nations => v_nations, p_lastrundate => '$LastRun');
    end;
    /
EOF

所以我在这里登录模式

$RAN_UID
。 $nation 中有
'AA,AF,AG'
,我需要将它传递给 PL/SQL 过程。

下面是我的PL?SQL过程:

CREATE OR REPLACE PROCEDURE process_failed_requests(p_nations IN VARCHAR2, p_lastrundate IN VARCHAR2) AS
BEGIN
    FOR rec IN (
        SELECT B.CIDGEN, B.NATION
        FROM COMPANY B
        JOIN NATION_LOOKUP C ON B.NATION = C.CODE
        WHERE B.CIDGEN IN (
            SELECT CIDGEN
            FROM RAN.OA_REQUEST_RESPONSE_STATUS
            WHERE RESPONSE_STATUS = 'FailedRequest'
            AND RESPONSE_UPDATE_STAMP >= TO_DATE(p_lastrundate, 'DD-MON-YYYY HH24:MI:SS')
        )
        AND B.NATION IN (SELECT regexp_substr(p_nations, '[^,]+', 1, LEVEL) FROM DUAL CONNECT BY regexp_substr(p_nations, '[^,]+', 1, LEVEL) IS NOT NULL)
    ) LOOP
        DBMS_OUTPUT.PUT_LINE(rec.CIDGEN || '||' || rec.NATION);
    END LOOP;
END;
/

但是我面临以下问题:

cat oa_req_failed_temp.txt process_failed_requests(p_nations => v_nations, p_lastrundate => '12-Feb-2024 04:36:33'); * ERROR at line 8: ORA-06550: line 8, column 9: PLS-00306: wrong number or types of arguments in call to 'PROCESS_FAILED_REQUESTS' ORA-06550: line 8, column 9: PL/SQL: Statement ignored

但是当参数直接在 PL/SQL 过程中传递时,它工作得很好。

-- procedure process_failed_requests
CREATE OR REPLACE PROCEDURE process_failed_requests(p_nations IN VARCHAR2, p_lastrundate IN VARCHAR2) AS
BEGIN
    FOR rec IN (
        SELECT B.CIDGEN, B.NATION
        FROM COMPANY B
        JOIN NATION_LOOKUP C ON B.NATION = C.CODE
        WHERE B.CIDGEN IN (
            SELECT CIDGEN
            FROM RAN.OA_REQUEST_RESPONSE_STATUS
            WHERE RESPONSE_STATUS = 'FailedRequest'
            AND RESPONSE_UPDATE_STAMP >= TO_DATE(p_lastrundate, 'DD-MON-YYYY HH24:MI:SS')
        )
        AND B.NATION IN (SELECT regexp_substr(p_nations, '[^,]+', 1, LEVEL) FROM DUAL CONNECT BY regexp_substr(p_nations, '[^,]+', 1, LEVEL) IS NOT NULL)
    ) LOOP
        DBMS_OUTPUT.PUT_LINE(rec.CIDGEN || '||' || rec.NATION);
    END LOOP;
END;
/

-- Test script
SET SERVEROUTPUT ON;

DECLARE
    p_nations VARCHAR2(100) := 'AA,AF'; -- Example input: Comma-separated list of nations
    p_lastrundate VARCHAR2(20) := '01-JAN-2000 00:00:00'; -- Example input: Last run date
BEGIN
    process_failed_requests(p_nations, p_lastrundate);
END;
/

sql oracle shell plsql
1个回答
0
投票

您的程序有签名:

PROCEDURE process_failed_requests(p_nations IN VARCHAR2, p_lastrundate IN VARCHAR2)

当您使用时它会起作用:

DECLARE
    p_nations VARCHAR2(100) := 'AA,AF'; 
    p_lastrundate VARCHAR2(20) := '01-JAN-2000 00:00:00';
BEGIN
    process_failed_requests(p_nations, p_lastrundate);
END;
/

使用时不起作用:

declare
  type nation_list is table of varchar2(100);
  v_nations nation_list := nation_list(${nation//,/','});
begin
  process_failed_requests(p_nations => v_nations, p_lastrundate => '$LastRun');
end;
/

这是因为

v_nations
是(本地定义的)
NATION_LIST
数据类型,而不是
VARCHAR2
,并且正如异常消息所述,过程调用具有“错误数量或类型的参数”(在此案例、参数类型)。

如果“

$nation
中有
'AA,AF,AG'
”,则将其分配给正确的类型,
VARCHAR2

declare
  v_nations VARCHAR2(100) := ${nation};
begin
  process_failed_requests(p_nations => v_nations, p_lastrundate => '$LastRun');
end;
/
© www.soinside.com 2019 - 2024. All rights reserved.