gpt4 book ai didi

oracle - 如何将数字列表传递给存储过程?

转载 作者:行者123 更新时间:2023-12-04 22:51:14 24 4
gpt4 key购买 nike

所以我有以下存储过程:

CREATE OR REPLACE PROCEDURE stored_p
(
ntype IN NUMBER ,
p_ResultSet OUT TYPES.cursorType
)
AS
BEGIN
OPEN p_ResultSet FOR
select * from table where ttype in ntype;
END stored_p

而且,我可以这样称呼它:
VARIABLE resultSet  REFCURSOR
EXEC stored_p(80001, :resultSet);
PRINT :resultSet

但我希望能够这样称呼它:
VARIABLE resultSet  REFCURSOR
EXEC stored_p([80001,80002], :resultSet);
PRINT :resultSet

我应该如何相应地修改我的存储过程?我这样做是为了可以在 Crystal Report 中显示结果......(以防万一会影响任何事情......谢谢!

最佳答案

最好的选择是传递一个集合

SQL> create type empno_tbl
2 is
3 table of number;
4 /

Type created.


SQL> create or replace procedure stored_p
2 (
3 empnos in empno_tbl,
4 p_rc out sys_refcursor )
5 as
6 begin
7 open
8 p_rc for select * from emp where empno in (select * from table(empnos));
9 end;
10 /

Procedure created.

SQL> var rc refcursor;

SQL> ed
Wrote file afiedt.buf

1 create or replace procedure stored_p
2 (
3 empnos in empno_tbl,
4 p_rc out sys_refcursor )
5 as
6 begin
7 open
8 p_rc for select * from emp where empno in (select * from table(empnos));
9* end;
SQL> begin
2 stored_p( new empno_tbl(7902,7934), :rc );
3 end;
4 /

PL/SQL procedure successfully completed.

SQL> print rc

EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ---------- --------- ---------- --------- ---------- ----------
DEPTNO FAKE_COL FOO
---------- ---------- ----------
7902 FORD ANALYST 7566 03-DEC-81 3000
20 1

7934 MILLER CLERK 7782 23-JAN-82 1300
10 1

不幸的是,Crystal Reports 可能无法将正确的集合传递给存储过程。如果是这种情况,您必须传入一个以逗号分隔的数字列表。然后,您的过程必须将该逗号分隔的字符串解析为一个集合。您可以使用(或修改) Tom Kyte's in_list为此功能
SQL> ed
Wrote file afiedt.buf

1 create or replace function in_list(
2 p_string in varchar2
3 )
4 return empno_tbl
5 as
6 l_string long default p_string || ',';
7 l_data empno_tbl := empno_tbl();
8 n number;
9 begin
10 loop
11 exit when l_string is null;
12 n := instr( l_string, ',' );
13 l_data.extend;
14 l_data(l_data.count) :=
15 ltrim( rtrim( substr( l_string, 1, n-1 ) ) );
16 l_string := substr( l_string, n+1 );
17 end loop;
18 return l_data;
19* end;
SQL> /

Function created.

SQL> ed
Wrote file afiedt.buf

1 create or replace procedure stored_p
2 (
3 empnos in varchar2,
4 p_rc out sys_refcursor )
5 as
6 begin
7 open p_rc
8 for select *
9 from emp
10 where empno in (select *
11 from table(in_list(empnos)));
12* end;
SQL> /

Procedure created.

SQL> ed
Wrote file afiedt.buf

1 begin
2 stored_p( '7902,7934', :rc );
3* end;
SQL> /

PL/SQL procedure successfully completed.

SQL> print rc

EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ---------- --------- ---------- --------- ---------- ----------
DEPTNO FAKE_COL FOO
---------- ---------- ----------
7902 FORD ANALYST 7566 03-DEC-81 3000
20 1

7934 MILLER CLERK 7782 23-JAN-82 1300
10 1

关于oracle - 如何将数字列表传递给存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5268699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com