在plsql ora 01427中插入多行

在plsql ora 01427中插入多行,sql,oracle,insert,Sql,Oracle,Insert,此错误表示此子查询: SELECT T.USER_ID FROM USER_OTHER_PRIVILEGES T JOIN USERS U ON U.ID = T.USER_ID WHERE T.UOPM_ID = 17 AND T.PRIV_ID IN (719) 返回多个行。 请运行此查询,您将看到至少显示2个用户ID。 带有VALUE子句的INSERT语句只能在表中插入一行,并且VALUES子句中的每列只需要


此错误表示此子查询:

SELECT T.USER_ID
    FROM   USER_OTHER_PRIVILEGES T
           JOIN USERS U
           ON U.ID = T.USER_ID
    WHERE  T.UOPM_ID = 17
    AND    T.PRIV_ID IN (719)
返回多个行。
请运行此查询,您将看到至少显示2个用户ID。

带有VALUE子句的INSERT语句只能在表中插入一行,并且VALUES子句中的每列只需要一个值:

INSERT INTO table( col1, col2, col3 ) VALUES ( val1, val2, val3 )
不能为行中的一列输入多个值。

例如,如果此子查询返回三个数字:1、2、3,则不能以这种方式插入一行:

+------+---------+---------+---------+-------+-----------+
| ID   | PRIV_ID | UOPM_ID | USER_ID | ML_ID | PARENT_ID | 
+------+---------+---------+---------+-------+-----------+
| 456  |    1792 |      17 |  1,2,3  |  NULL |         1 |
+------+---------+---------+---------+-------+-----------+
我猜您不想只插入一行,但您将为suquery返回的每个条目插入一行,如下所示:

+------+---------+---------+---------+-------+-----------+
| ID   | PRIV_ID | UOPM_ID | USER_ID | ML_ID | PARENT_ID | 
+------+---------+---------+---------+-------+-----------+
| 456  |    1792 |      17 |      1  |  NULL |         1 |
+------+---------+---------+---------+-------+-----------+
| 457  |    1792 |      17 |      2  |  NULL |         1 |
+------+---------+---------+---------+-------+-----------+
| 458  |    1792 |      17 |      3  |  NULL |         1 |
+------+---------+---------+---------+-------+-----------+
在这种情况下,您不能使用
插入到。。。值…
语法,
您需要
插入到。。。。子查询
variant,
有关更多详细信息,请参阅此答案:

对于这种情况,您的insert语句可以是:

INSERT INTO  USER_OTHER_PRIVILEGES (
  ID, PRIV_ID,UOPM_ID,USER_ID,ML_ID,PARENT_ID
) 
SELECT
     PRIV_USER_OTH_ID_SEQ.NEXTVAL,
     1792,
     17,
     T.USER_ID,
     NULL,
     1
FROM USER_OTHER_PRIVILEGES T
JOIN USERS U
ON U.ID = T.USER_ID
WHERE  T.UOPM_ID = 17
  AND  T.PRIV_ID IN (719) 
回答,谢谢:)


您的问题是什么?如何在表中添加“USER_OTHER_PRIVILEGES”,67行?是否要将与第一次查询相对应的67行连同sequence 1792,17一起插入USER_OTHER_PRIVILEGES表?您发布了一条
select
语句,表示返回67行。您的
insert
语句包含一个类似的语句,该语句连接到一个额外的表
users
,但不清楚该连接将实现什么。要么因为没有在谓词或投影中引用
用户
,它什么也不做,要么它会更改返回的行数。
INSERT INTO  USER_OTHER_PRIVILEGES (
  ID, PRIV_ID,UOPM_ID,USER_ID,ML_ID,PARENT_ID
) 
SELECT
     PRIV_USER_OTH_ID_SEQ.NEXTVAL,
     1792,
     17,
     T.USER_ID,
     NULL,
     1
FROM USER_OTHER_PRIVILEGES T
JOIN USERS U
ON U.ID = T.USER_ID
WHERE  T.UOPM_ID = 17
  AND  T.PRIV_ID IN (719) 
DECLARE

v_USER_ID INTEGER;


BEGIN
  FOR XYZ IN 
              (
                SELECT T.USER_ID
                FROM   USER_OTHER_PRIVILEGES T
                JOIN USERS U
                ON U.ID = T.USER_ID
                WHERE  T.UOPM_ID = 17
                AND    T.PRIV_ID IN (719)
              )
  LOOP
  v_USER_ID:= XYZ.USER_ID;

                INSERT INTO  USER_OTHER_PRIVILEGES
                (ID, PRIV_ID,UOPM_ID,USER_ID,ML_ID,PARENT_ID)
                VALUES
                (PRIV_USER_OTH_ID_SEQ.NEXTVAL,1792, 17,v_USER_ID, NULL,1);

                COMMIT;

  END LOOP;

END;