向pl/sql输入传递多个值

dsf9zpds  于 2021-08-01  发布在  Java
关注(0)|答案(4)|浏览(357)

我有一个包含函数的oracle包。此功能有3个输入。我需要向每个输入传递多个值。我可以自动化一个进程,该进程使用每个变量组合多次运行,但我只想对数据库进行一次调用。
简化代码

  1. declare
  2. ln_ret number;
  3. begin
  4. ln_ret := dbo.pkg_rpa.mis_run_script (
  5. '%2020%',
  6. '111','222','333','444',
  7. '1234','2345','6192','1204'
  8. );
  9. dbms_output.put_line('ln_ret=' || t.t (ln_ret));
  10. end;
  11. CREATE OR REPLACE
  12. package dbo.pkg_rpa IS
  13. function mis_run_script (
  14. p_input_dt in varchar2,
  15. p_hospital_id in varchar2,
  16. p_procedure_code in varchar2) RETURN number;
  17. end PKG_RPA;
  18. /
  19. CREATE OR REPLACE
  20. PACKAGE BODY dbo.pkg_rpa IS
  21. function mis_run_claim_assessment_script (
  22. p_input_dt in varchar2,
  23. p_hospital_id in varchar2,
  24. p_procedure_code in varchar2
  25. )
  26. Begin
  27. for i in (select table_name from user_tables where lower(table_name) = 'temp_rpa') loop
  28. execute immediate 'drop table temp_rpa';
  29. end loop;
  30. execute immediate ' create table temp_rpa as select distinct ci.claim_id, count(ci.receipt_id) as count_receipts,
  31. sum(ci.billed_amount) as total_billed_amount, count(*) as claim_items
  32. from claim_item ci left join claim_header ch on ch.claim_id = ci.claim_id
  33. left join cd_hos ho on ho.hospital_id = ci.hospital_id
  34. left join claim_type_header cl on cl.claim_id = ci.claim_id
  35. where cl.claim_status is null and ch.deleted_flag is null
  36. and ch.input_dt like p_input_dt
  37. and ci.hospital_id in (p_hospital_id)
  38. and (ci.claim_id, NVL(ci.claim_item_id,0)) in (select claim_id, NVL(claim_item_id,0) from cd_roc_claim_item
  39. where procedure_code in (p_procedure_code))
  40. 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
  41. where procedure_code not in (p_procedure_code))
  42. group by ci.claim_id
  43. having sum(case when ci.service_type_id is null then 1 end) = 1)';
  44. End;
  45. end mis_run_script;
  46. end PKG_RPA;
  47. /
krcsximq

krcsximq1#

用带引号的字符串传递它( Q'<delimeter><your_actual_string><delimeter>' )具体如下:

  1. begin
  2. ln_ret := dbo.pkg_rpa.mis_run_script (
  3. '%2020%',
  4. Q'#'111','222','333','444'#',
  5. Q'#'1234','2345','6192','1204'#'
  6. );
  7. dbms_output.put_line('ln_ret=' || t.t (ln_ret));
  8. end;
8yoxcaq7

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 体中。
在您的代码中,您必须循环它,而不是每次删除表并重新创建它,而是在开始时删除一次表并在循环中添加数据;

  1. truncate table; --alternative drop and create
  2. for i in 1 .. p_hospital_ids.count loop
  3. insert into temp_rpa
  4. select <columns>
  5. from claim_item ci
  6. ......
  7. and ci.hospital_id = p_hospital_ids[i]
  8. end loop
展开查看全部
zf9nrax1

zf9nrax13#

您可能需要参考以下取自oracle网站的示例。希望有帮助。

  1. CREATE OR REPLACE TYPE nt_type IS TABLE OF NUMBER;
  2. /
  3. CREATE OR REPLACE PROCEDURE print_nt (nt nt_type) AUTHID DEFINER IS
  4. i NUMBER;
  5. BEGIN
  6. i := nt.FIRST;
  7. IF i IS NULL THEN
  8. DBMS_OUTPUT.PUT_LINE('nt is empty');
  9. ELSE
  10. WHILE i IS NOT NULL LOOP
  11. DBMS_OUTPUT.PUT('nt.(' || i || ') = ');
  12. DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(nt(i)), 'NULL'));
  13. i := nt.NEXT(i);
  14. END LOOP;
  15. END IF;
  16. DBMS_OUTPUT.PUT_LINE('---');
  17. END print_nt;
  18. /
  19. DECLARE
  20. nt nt_type := nt_type(); -- nested table variable initialized to empty
  21. BEGIN
  22. print_nt(nt);
  23. nt := nt_type(90, 9, 29, 58);
  24. print_nt(nt);
  25. END;
  26. /
展开查看全部
68de4m5k

68de4m5k4#

您根本不需要动态sql。

  1. CREATE OR REPLACE TYPE NUMBER_TABLE_TYPE AS TABLE OF NUMBER;
  2. CREATE OR REPLACE TYPE VARCHAR_TABLE_TYPE AS TABLE OF VARCHAR2(1000);
  3. function mis_run_claim_assessment_script (
  4. p_input_dt in varchar2,
  5. p_hospital_id in NUMBER_TABLE_TYPE, -- why on earth do you put numbers as strings?
  6. p_procedure_code in VARCHAR_TABLE_TYPE
  7. ) RETURN ??? AS
  8. INSERT INTO temp_rpa (...)
  9. SELECT ...
  10. FROM ...
  11. WHERE ch.input_dt like p_input_dt
  12. AND ci.hospital_id MEMBER OF p_hospital_id
  13. AND procedure_code MEMBER OF p_procedure_code ;
  14. RETURN ???
  15. END;
  16. ln_ret := mis_run_claim_assessment_script(
  17. '%2020%',
  18. NUMBER_TABLE_TYPE(111, 222, 333, 444),
  19. VARCHAR_TABLE_TYPE('not','clear','in','your','question')
  20. );
展开查看全部

相关问题