我正在尝试将数组从 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;
/
您的程序有签名:
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;
/