我有一个包含函数的oracle包。此功能有3个输入。我需要向每个输入传递多个值。我可以自动化一个进程,该进程使用每个变量组合多次运行,但我只想对数据库进行一次调用。
简化代码
declare
ln_ret number;
begin
ln_ret := dbo.pkg_rpa.mis_run_script (
'%2020%',
'111','222','333','444',
'1234','2345','6192','1204'
);
dbms_output.put_line('ln_ret=' || t.t (ln_ret));
end;
CREATE OR REPLACE
package dbo.pkg_rpa IS
function mis_run_script (
p_input_dt in varchar2,
p_hospital_id in varchar2,
p_procedure_code in varchar2) RETURN number;
end PKG_RPA;
/
CREATE OR REPLACE
PACKAGE BODY dbo.pkg_rpa IS
function mis_run_claim_assessment_script (
p_input_dt in varchar2,
p_hospital_id in varchar2,
p_procedure_code in varchar2
)
Begin
for i in (select table_name from user_tables where lower(table_name) = 'temp_rpa') loop
execute immediate 'drop table temp_rpa';
end loop;
execute immediate ' create table temp_rpa as select distinct ci.claim_id, count(ci.receipt_id) as count_receipts,
sum(ci.billed_amount) as total_billed_amount, count(*) as claim_items
from claim_item ci left join claim_header ch on ch.claim_id = ci.claim_id
left join cd_hos ho on ho.hospital_id = ci.hospital_id
left join claim_type_header cl on cl.claim_id = ci.claim_id
where cl.claim_status is null and ch.deleted_flag is null
and ch.input_dt like p_input_dt
and ci.hospital_id in (p_hospital_id)
and (ci.claim_id, NVL(ci.claim_item_id,0)) in (select claim_id, NVL(claim_item_id,0) from cd_roc_claim_item
where procedure_code in (p_procedure_code))
and (ci.claim_id, NVL(ci.claim_item_id,0)) not in (select claim_id, NVL(claim_item_id,0) from cd_roc_claim_item
where procedure_code not in (p_procedure_code))
group by ci.claim_id
having sum(case when ci.service_type_id is null then 1 end) = 1)';
End;
end mis_run_script;
end PKG_RPA;
/
4条答案
按热度按时间krcsximq1#
用带引号的字符串传递它(
Q'<delimeter><your_actual_string><delimeter>'
)具体如下:8yoxcaq72#
您可以使用关联数组作为输入类型。对于第2个和第3个参数,使用dbms\u sql.varchar2a作为日期类型,而不是varchar2。
但是如果论点是相互关联的
p\ U医院id“111”属于程序代码“1234”
p\ U医院id“222”属于程序代码“2345”
等。
我认为您应该创建一个自定义记录类型,创建一个记录类型的表类型,并将其用作参数。
你的论点变成
p_hospital_ids in dbms_sql.varchar2a
在 Package 规格和 Package 体中。在您的代码中,您必须循环它,而不是每次删除表并重新创建它,而是在开始时删除一次表并在循环中添加数据;
zf9nrax13#
您可能需要参考以下取自oracle网站的示例。希望有帮助。
68de4m5k4#
您根本不需要动态sql。