来自两个不同表的Oracle数据集,无需加入

时间:2011-07-13 01:51:06

标签: oracle plsql

我需要编写一个存储过程来提供来自两个不同表的数据。说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似乎不起作用。

任何人都有任何想法,如何做到这一点?

4 个答案:

答案 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;
/