Oracle:过程中 INTO 变量中存在多行

js *_*s u 0 sql oracle oracle11g

我的程序看起来像这样。

CREATE OR REPLACE PROCEDURE USP_TMS_OPT_DATA
AS

V_NAME           VARCHAR2(10);
V_TEL_NO         VARCHAR2(10);
V_ADDR           VARCHAR2(10);
...

SELECT NEW_NAME
     , NEW_TEL_NO
     , NEW_ADDR
     , REG_NO
  INTO V_NAME     -- get data row. but it is error.
     , V_TEL_NO
     , V_ADDR  
     , V_REG_NO
  FROM DAILY_VISITOR;
  
  MERGE  -- I use MERGE, because INSERT or UPDATE
  INTO ALL_VISITOR A
  USING dual
    ON (A.REG_NO = V_REG_NO)
  WHEN MATCHED THEN
       UPDATE
          SET A.ADDR = V_ADDR
            , A.NAME = V_NAME
            , A.TEL_NO = V_TEL_NO
  WHEN NOT MATCHED THEN
       INSERT (REG_NO, NAME, TEL_NO, ADDR)
       VALUES (V_REG_NO, V_NAME, V_TEL_NO, V_ADDR);

...  
Run Code Online (Sandbox Code Playgroud)

我获取数据DAILY_VISITOR并插入或更新ALL_VISITOR

但我收到一个错误

ORA-01422: 精确提取返回的行数多于请求的行数

如何使用INTO或其他方式获取多行数据?

或者可以MERGE像这样使用吗INSERT INTO SELECT

甲骨文是11g。

MT0*_*MT0 8

要将SELECT多行放入变量中,您可以使用:

  • BULK COLLECT INTO带有集合变量;或者
  • 将语句作为游标打开,并使用游标进行逐行处理。

但是不要执行这两个操作,因为您不应该使用中间变量来解决此问题,也不应该使用 PL/SQL;相反,结合这两个语句并完全用 SQL 解决它:

MERGE INTO ALL_VISITOR A
USING (
  SELECT NEW_NAME
       , NEW_TEL_NO
       , NEW_ADDR
       , REG_NO
  FROM DAILY_VISITOR
) v
ON (A.REG_NO = V.REG_NO)
WHEN MATCHED THEN
  UPDATE
  SET A.ADDR = V.NEW_ADDR
    , A.NAME = V.NEW_NAME
    , A.TEL_NO = V.NEW_TEL_NO
WHEN NOT MATCHED THEN
  INSERT (REG_NO, NAME, TEL_NO, ADDR)
  VALUES (V.REG_NO, V.NEW_NAME, V.NEW_TEL_NO, V.NEW_ADDR);
Run Code Online (Sandbox Code Playgroud)