2016-04-24 44 views
-4

http://i.stack.imgur.com/t2tMi.jpg多行插入在PLSQL ORA 01427

SELECT T.USER_ID 
    FROM USER_OTHER_PRIVILEGES T 
WHERE T.UOPM_ID = 17 
    AND T.PRIV_ID IN (719) ; 67 rows selected 

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, 
    (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)), 
    NULL, 
    1 
) 
+3

什么是你的问题? –

+0

如何添加“USER_OTHER_PRIVILEGES”表是67行? – Berkay

+0

是否要将对应于第一个查询的67行与序列1792,17一起插入到user_other_privileges表中? – cableload

回答

1

错误意味着,这个子查询:

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。

与价值条款的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 | 
+------+---------+---------+---------+-------+-----------+ 

在这种情况下,你不能使用INSERT INTO ... VALUES ...语法,
需要INSERT INTO .... subquery变种来代替,
看到这个answe r表示更多的细节:How can I insert values into a table, using a subquery with more than one result?

您的这种情况下,插入语句可以是:

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) 
0

解答,非常感谢:)

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;