【问题标题】:How to use SELECT... INTO with a JOIN?如何使用 SELECT... INTO 和 JOIN?
【发布时间】:2026-01-20 11:40:01
【问题描述】:

我有以下示例代码

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

【问题讨论】:

  • 你错过了FROM table
  • 抱歉,我是用手机输入的。那里应该有一个 FROM。
  • 你的代码有什么问题?
  • 我不认为我试图将 table2 中的列放入 table%rowtype 定义的行中。我想我的列太多了,但我必须仔细检查。

标签: sql oracle join plsql select-into


【解决方案1】:

您的 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 异常。

【讨论】:

  • 我的示例表有 6 列,其中 3 列被选中。不过,您的回答给了我另一个想法,我将单独发布。我觉得可能有更好的方法。
【解决方案2】:

这是我目前拥有的,基于 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;

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

【讨论】:

  • TonyAndrews 的回答与 select into 和 IMO 一样优雅(YMMV)。其他选项是使用显式游标,它可以让您获得更多控制但更详细。相关的 Oracle 文档是:Query Result Set Processing.
【解决方案3】:

您可以使用光标来执行此操作。这样您就不必担心 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;

【讨论】: