Наборы данных Oracle из двух разных таблиц без объединения - PullRequest
1 голос
/ 13 июля 2011

Мне нужно написать хранимую процедуру, которая будет предоставлять данные из двух разных таблиц.Скажите 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 ]

2 голосов
/ 13 июля 2011

Попробуйте это

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;
0 голосов
/ 15 июля 2011

Этот скрипт показывает, как работает @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;
/
0 голосов
/ 13 июля 2011

Вы должны дать более подробную информацию о вашей проблеме .. в частности, 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
0 голосов
/ 13 июля 2011

Итак, я предполагаю, что записи, которые вы хотите извлечь из каждой таблицы, фактически одинаковы.например, идентификатор, имя, цена.В этом случае просто напишите ваш запрос как

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 в примере, чтобы продемонстрировать это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...