在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;