7

我有以下示例代码

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 上吗?

4

3 回答 3

8

您的 PL/SQL 是有效且可接受的,前提是:

  1. 表 TABLE 正好包含 4 列,对应于您选择的 4 个值。
  2. 查询将准确返回 1 行。

如果表 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 异常。

于 2013-08-28T20:16:32.847 回答
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;
于 2013-08-29T20:34:30.563 回答
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;

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

于 2013-08-29T01:52:15.837 回答