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。
要将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)