2011-07-13 64 views
1

我需要編寫一個存儲過程來提供來自兩個不同表的數據。說table1和table2。這兩張表沒有任何關係。來自兩個不同表的Oracle數據集不加入

現在在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

顯示您的代碼.. ??!你如何聲明你的sys_refcursor並且你如何訪問它? –

回答

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; 
+0

我做到了,但對於P_refcursor2我沒有收到任何記錄。 – niceApp

+0

問題可能出現在您的客戶端。您如何獲得結果?例如,С#客戶端代碼\某些GUI工具? –

+0

對於.NET,您需要用戶 .NextResult()移至下一個結果集(本例中爲p_refcursor2) –

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,在格蘭例子來證明這一點

+0

不,我想要兩個不同列的表的結果集。例如。 table1(姓名,地址,年齡)table2(會員ID,年齡); – niceApp

+0

然後,你絕對需要兩個遊標像@MaximShevtsov答案。你不能有一個返回不同結果結構的遊標。如果可以的話,這是沒有意義的,因爲調用代碼不知道如何處理它。或者我錯過了什麼 – Sodved

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 
+0

我正在執行SQLPlus中的代碼(實際上使用蟾蜍)。您可以使用該聯合,因爲您創建了具有相似列名稱的兩個表。但我試圖從兩個離散表格中獲得結果。即。這兩個表中的列不相同。例如。表1(姓名,地址,年齡)表2(membershipID,balancedue)等。如何在這些類型的表上使用聯合? – niceApp

+0

是的......列名不必是相同的,只要您從每個查詢中選擇相同數量的列即可。如果您需要來自任一表的不同列名,則可以將這兩個查詢的列名稱別名。否則,默認情況下,結果上顯示的列名將是來自第一個查詢的名稱。最重要的是,我會說,不要使用select *,即使您認爲表格結構現在是相同的。 –

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; 
/
相關問題