gpt4 book ai didi

oracle - oracle中如何从另一个存储过程调用一个存储过程

转载 作者:行者123 更新时间:2023-11-30 23:56:02 25 4
gpt4 key购买 nike

我有一个现有的存储过程,它接受 2 个参数并返回一个 oracle 游标。游标包含大约 30 到 60 行数据。

我想在另一个存储过程中使用上述预先存在的存储过程作为表......基本上我想调用预先存在的存储过程并查看返回的行是否包含特定值。

例如:

SP 1 = get_data_1 (returns oracle cursor)
SP 2 = get_data_2

在 get_data_2 中
select count(*) from get_data_1 (pass_input_parms) A where A.ID = '12345'

从概念上讲,这对我来说似乎是一件微不足道的事情,但是作为 Oracle 世界的新手,我不知道如何利用预先存在的返回游标的存储过程。

我该怎么做?

最佳答案

您不能在后续 SQL 语句中重用来自 get_data_1 的 REF CURSOR,因为它只是一个指向语句句柄的指针。游标本身不包含任何数据。

你可以做类似的事情

CREATE PROCEDURE get_data_2( p_cnt OUT NUMBER )
AS
l_rc <<your cursor type>>;
l_rec <<the type your cursor returns>>;
BEGIN
get_data_1(<<parameter 1>>, <<parameter 2>>, l_rc);
p_cnt := 0;
LOOP
FETCH l_rc INTO l_rec;
EXIT WHEN l_rc%NOTFOUND;

IF( l_rec.id = '12345' )
THEN
p_cnt := p_cnt + 1;
END IF;
END LOOP;
CLOSE l_rc;
END;

但是,正如您可能想象的那样,这往往会相对较快地老化。鉴于此,在 Oracle 中具有返回 REF CURSOR 参数的存储过程并不常见,除非您将数据的完成 View 返回给客户端应用程序。例如,如果有一个共享 View ,GET_DATA_1 和 GET_DATA_2 都可以查询而不是让 GET_DATA_2 调用 GET_DATA_1,这将简化程序。如果 GET_DATA_1 是一个流水线表函数而不是一个返回 REF CURSOR 的过程,那么从 GET_DATA_2 调用 GET_DATA_1 会容易得多。

如果您想开始使用流水线表函数(使用 SCOTT 模式)
create or replace type emp_obj as object (
empno number,
ename varchar2(10),
job varchar2(9),
mgr number,
hiredate date );
/

create type emp_tbl
as
table of emp_obj;
/

create function emp_pipe( p_deptno IN NUMBER )
return emp_tbl pipelined
is
begin
FOR x IN (SELECT * FROM emp WHERE deptno = p_deptno)
LOOP
PIPE ROW( emp_obj( x.empno,
x.ename,
x.job,
x.mgr,
x.hiredate ) );
END LOOP;
END;
/

SQL> select * from table( emp_pipe( 10 ) );

EMPNO ENAME JOB MGR HIREDATE
---------- ---------- --------- ---------- ---------
7782 CLARK MANAGER 7839 09-JUN-81
7839 KING PRESIDENT 17-NOV-81
7934 MILLER CLERK 7782 23-JAN-82

关于oracle - oracle中如何从另一个存储过程调用一个存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4155836/

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