我需要编写一个存储过程来提供来自两个不同表的数据。说table1和table2。这两个表没有任何关系。
现在在SQL Server中,我可以简单地创建一个存储过程,如:
create procedure abc
as
begin
select * from table1;
select * from table2:
end;
现在在oracle中,我通常会创建一个SYS_REFCURSOR并执行以下操作:
Open SYS_REFCURSOR_VAR For Select * from table1;
但我不知道如何从两个不同的表table1和table2提供两个结果集。我试图为每个表创建两个不同的SYS_REFCURSOR。但是当我执行该程序时,我只从第一个表中获取数据。第二个SYS_REFCURSOR似乎不起作用。
任何人都有任何想法,如何做到这一点?
答案 0 :(得分:2)
试试这个
create or replace procedure tst
(p_refcursor1 out sys_refcursor,p_refcursor2 out sys_refcursor)
is
begin
open p_refcursor1 for
select * from dual;
open p_refcursor2 for
select * from dual;
end;
答案 1 :(得分:0)
所以我假设你想从每个表中提取的记录实际上是相同的。例如id,名称,价格。在这种情况下,只需编写您的查询
SELECT t1.id AS id, t1.name AS name, t1.unit_price AS price FROM t1
UNION
SELECT t2.id AS id, t2.description AS name, t2.price AS price FROM t2
不确定是否需要,但总是良好的形式,以使联合返回具有相同“列”名称的数据集。所以我使用了AS
示例来演示这个
答案 2 :(得分:0)
您需要提供有关您的问题的更多详细信息..具体而言 1)到目前为止您尝试过的代码 2)您如何访问您的引用光标以查看结果? (SQLPLUS或Java或VB.net)?
根据您的SQL Server代码,我假设您正在尝试从两个表中获取行的UNION。以下是Oracle中允许您执行此操作的代码。如您所见,我的客户端工具是SQLPLUS,我可以看到两个表中的值。
create table t1(
id number,
name varchar2(10)
);
create table t2(
id number,
name varchar2(10)
);
create or replace procedure get_t1_and_t2(
o_cur out sys_refcursor) is
begin
open o_cur for
select id from t1
union all
select id from t2;
end;
/
Procedure created.
SQL> var rc refcursor;
SQL> exec get_t1_and_t2( :rc);
PL/SQL procedure successfully completed.
SQL> print rc;
ID
----------
1
2
答案 3 :(得分:0)
此脚本显示@Maxim Shevtsov回答工作。在SQL * Plus
中运行它SET serveroutput ON size 100000
DECLARE
c1 SYS_REFCURSOR;
c2 SYS_REFCURSOR;
v1 VARCHAR2(10);
v2 VARCHAR2(10);
n2 NUMBER;
PROCEDURE tst ( p_refcursor1 OUT SYS_REFCURSOR
, p_refcursor2 OUT SYS_REFCURSOR)
IS
BEGIN
OPEN p_refcursor1 FOR
SELECT 'val1' FROM DUAL;
OPEN p_refcursor2 FOR
SELECT 'val2', 42 FROM DUAL;
END tst;
BEGIN
tst( c1, c2 );
LOOP
FETCH c1 INTO v1;
EXIT WHEN c1%NOTFOUND;
DBMS_OUTPUT.put_line( 'CURSOR1: ' || v1 );
END LOOP;
LOOP
FETCH c2 INTO v2, n2;
EXIT WHEN c2%NOTFOUND;
DBMS_OUTPUT.put_line( 'CURSOR2: ' || v2 || ' ' || n2 );
END LOOP;
END;
/