【问题标题】:multiple rows insert in plsql ora 01427在 plsql ora 01427 中插入多行
【发布时间】:2016-04-24 00:27:39
【问题描述】:

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
)

【问题讨论】:

  • 你的问题是什么?
  • 如何添加“USER_OTHER_PRIVILEGES”是表,67行?
  • 您是否要将与您的第一个查询相对应的 67 行与序列、1792,17 一起插入到 user_other_privileges 表中?
  • 您发布了一条 select 语句,您说该语句返回 67 行。您的insert 语句包含一个类似的语句,该语句连接到一个附加表users,但该连接将完成什么并不明显。要么它什么都不做,因为你没有在谓词或投影中引用users,要么它会改变返回的行数。

标签: sql oracle insert


【解决方案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。

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

在这种情况下,您不能使用 INSERT INTO ... VALUES ... 语法,
您需要 INSERT INTO .... subquery 变体,
有关详细信息,请参阅此答案: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) 

【讨论】:

    【解决方案2】:

    回答,谢谢:)

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 2021-08-23
      • 1970-01-01
      • 2014-06-24
      • 1970-01-01
      相关资源
      最近更新 更多