简体   繁体   中英

multiple rows insert in plsql ora 01427

http://i.stack.imgur.com/t2tMi.jpg

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
)

The error means, that this subquery:

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)

returns more that one row.
Please run this query and you will see that at least 2 user ids will appear.

The INSERT statements with the VALUE clause can insert only one row into the table, and it expects only one value for each column in the VALUES clause:

INSERT INTO table( col1, col2, col3 ) VALUES ( val1, val2, val3 )

You can't enter many values to one column in the row.

For example if this subquery returns three numbers: 1,2,3, you cannot insert one row in such a way:

+------+---------+---------+---------+-------+-----------+
| ID   | PRIV_ID | UOPM_ID | USER_ID | ML_ID | PARENT_ID | 
+------+---------+---------+---------+-------+-----------+
| 456  |    1792 |      17 |  1,2,3  |  NULL |         1 |
+------+---------+---------+---------+-------+-----------+

I guess that you don't want to insert only one row, but you are going to insert one separate row for each entry returned by the suquery, like this:

+------+---------+---------+---------+-------+-----------+
| 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 |
+------+---------+---------+---------+-------+-----------+

In this case you can't use INSERT INTO ... VALUES ... syntax,
you need INSERT INTO .... subquery variant instead,
see this answer for more details: How can I insert values into a table, using a subquery with more than one result?

Your insert statement for such a case can be:

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) 

Answer, thanks :)

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;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM