如何使用SELECT ... INTO与JOIN?

时间:2013-08-28 19:35:03

标签: sql oracle join plsql 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上吗?

3 个答案:

答案 0 :(得分:6)

您的PL / SQL有效并且可以接受:

  1. 表格恰好包含4列,对应于您选择的4个值。
  2. 查询将返回1行。
  3. 如果table TABLE不包含正好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异常。

答案 1 :(得分: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;

答案 2 :(得分:0)

这是我目前所拥有的,基于Tony Andrews。

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;

这是我提出的最好的。它允许我在进行连接时选择某些列并将所有值存储到变量中。不优雅,但似乎满足了这个问题。其他答案仍然受到欢迎。