2013-08-28 60 views
4

我有下面的代碼示例如何使用SELECT ... INTO加入?

DECLARE 
    myRow table%rowtype 
    myVar table2.column%type 
BEGIN 
    SELECT table.col1, table.col3, table.col4, table2.column 
    INTO myRow 
    FROM table 
    JOIN table2 
    On table.col6 = table2.col1; 
END; 

我如何重構,以便它是一個有效的聲明?我可以以某種方式將連接的列存儲到myRow或myVar上嗎?

+0

你錯過了'FROM table'。 – Barmar

+0

對不起,我從我的手機中輸入了這個。那裏應該是一個FROM。 – BLaZuRE

+0

你的代碼有什麼問題? – Parado

回答

5

你的PL/SQL是有效的,可以接受的:

  1. 表的表只包含4列,與您所選擇的4個值。
  2. 該查詢將完全返回1行。

如果表的表不包含正好4列,那麼你需要選擇成別的東西,也許只是4個變量:

DECLARE 
    v_col1 table.col1%type; 
    v_col3 table.col3%type; 
    v_col4 table.col4%type; 
    v_column table2.column%type; 
BEGIN 
    SELECT table.col1, table.col3, table.col4, table2.column 
    INTO v_col1, v_col3, v_col4, v_column 
    FROM table 
    JOIN table2 
    On table.col6 = table2.col1; 
END; 

如果查詢返回超過1行,你會得到一個TOO_MANY_ROWS例外;如果它沒有返回任何行,你將得到一個NO_DATA_FOUND異常。

+0

我的示例表格有6列,其中3個被選中。你的回答給了我另一個想法,我將分開發布。我覺得可以有更好的辦法。 – BLaZuRE

0

這是我目前擁有的,基於託尼安德魯斯。

DECLARE 
    myRow table%rowtype 
    myVar table2.column%type 
BEGIN 
    SELECT 
     table.col1, -- Column 2 intentionally left out 
     table.col3, 
     table.col4, 
     table2.column --Column from joined table 
    INTO 
     myRow.col1, 
     myRow.col3, 
     myRow.col4, 
     myVar  -- Won't store into myRow, so made a separate variable 
    FROM table 
    JOIN table2 
    On table.col6 = table2.col1; 
END; 

這是我想到的最好的。它允許我在進行連接時選擇某些列並將所有值存儲到變量中。不優雅,但似乎可以解決問題。其他答案仍然受歡迎。

+0

託尼安德魯斯的答案與你選擇進入的IMO以及相當優雅的(YMMV)相比非常精緻。其他選項是使用明確的遊標,它可以給你更多的控制權,但是更加冗長。相關的Oracle文檔是:[查詢結果集處理](http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/static.htm#i45320)。 – user272735

1

您可以使用遊標來做到這一點。這樣你就不必擔心TOO_MANY_ROWS或NO_DATA_FOUND異常。

,你也將有你列添加到您的查詢,它會自動被添加到您的同類型的變量

你有兩個選擇用光標每次的靈活性:用剛返回的第一行或使用所有行。

選項#1

DECLARE 

    CURSOR C_DATA IS 
    SELECT 
     table.col1, -- Column 2 intentionally left out 
     table.col3, 
     table.col4, 
     table2.column --Column from joined table 
    FROM table 
    JOIN table2 
    On table.col6 = table2.col1; 

    myRow C_DATA%rowtype 

BEGIN 

OPEN C_DATA; 
    FETCH c_data INTO myRow; 
CLOSE C_DATA; 

     -- USE ANYWHERE INSIDE THIS ESCOPE YOUR COLUMNS as myRow.col4. 

END; 

選項#2

DECLARE 

    CURSOR C_DATA IS 
    SELECT 
     table.col1, -- Column 2 intentionally left out 
     table.col3, 
     table.col4, 
     table2.column --Column from joined table 
    FROM table 
    JOIN table2 
    On table.col6 = table2.col1; 


BEGIN 

FOR myRow IN C_DATA LOOP 

     -- USE INSIDE HERE YOUR COLUMNS as myRow.col4.  

END LOOP; 

END;