2016-04-24 76 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;