Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Oracle中按顺序插入多行_Oracle_Sequence_Multiple Insert - Fatal编程技术网

在Oracle中按顺序插入多行

在Oracle中按顺序插入多行,oracle,sequence,multiple-insert,Oracle,Sequence,Multiple Insert,这是我用于在oracle数据库中插入多行的查询。但当我在其中使用序列时,它会引发错误ORA-00001:唯一约束。怎么做 INSERT ALL INTO POSTAL_CODE( postal_code,desc) VALUES(postal_code.NEXTVAL,'Coimbatore') INTO POSTAL_CODE (postal_code,desc) VALUES(postal_code.NEXTVAL,'Mumbai') SELECT * FROM DU

这是我用于在oracle数据库中插入多行的查询。但当我在其中使用序列时,它会引发错误ORA-00001:唯一约束。怎么做

INSERT ALL
  INTO POSTAL_CODE( postal_code,desc)
    VALUES(postal_code.NEXTVAL,'Coimbatore')
  INTO POSTAL_CODE (postal_code,desc)
    VALUES(postal_code.NEXTVAL,'Mumbai') SELECT * FROM DUAL;

尝试在oracle数据库中插入此多行

INTO POSTAL_CODE (postal_code,desc)
VALUES(&postal_code,&desc) SELECT * FROM DUAL;

将全部插入邮政编码(邮政编码,描述)值(邮政编码.NEXTVAL,&desc)插入邮政编码(邮政编码,描述)值(邮政编码.NEXTVAL,&desc)从双精度选择*

我将使用before insert触发器来填充键列(如果insert没有提供值),而不是使用此方法。序列与多表插入不兼容。

包括:

  • 不能在多表insert语句的任何部分指定序列。多表插入被视为单个SQL语句。因此,对NEXTVAL的第一个引用生成下一个数字,语句中所有后续引用都返回相同的数字
这并不完全正确-您可以使用序列,它总是得到相同的值,因此通过引用相同的序列一次创建父记录和子记录可能会很有用

如果要继续使用
insert all
,可以通过使用获取序列值的非确定性函数来解决这一问题:

CREATE FUNCTION get_seq RETURN NUMBER IS
BEGIN
  RETURN postal_code_seq.nextval;
END;
/

INSERT ALL
  INTO POSTAL_CODE( postal_code,description)
    VALUES(get_seq,'Coimbatore')
  INTO POSTAL_CODE (postal_code,description)
    VALUES(get_seq,'Mumbai') SELECT * FROM DUAL;

2 rows inserted.

SELECT * FROM postal_code;

                            POSTAL_CODE DESCRIPTION        
--------------------------------------- --------------------
                                      1 Coimbatore          
                                      2 Mumbai              

但这有点尴尬。您最好使用单独的insert语句—在单个表中使用多任务insert实际上并没有获得多少好处—或者使用触发器从序列中设置唯一列,或CTE/内联视图来生成要插入的值。

无需修改数据库对象,您只需将多表
insert ALL
重写为单个
insert
,多行由
UNION ALL
连接:

INSERT INTO postal_code
SELECT postal_code_seq.NEXTVAL, description
FROM
(
    SELECT 'Coimbatore' description FROM dual UNION ALL
    SELECT 'Mumbai'     description FROM dual
);

请注意,必须在外部查询中调用该序列。在内部查询中使用序列似乎可以简化代码,但会引发错误“ORA-02287:此处不允许使用序列号”。

在哪里设置替换变量?在哪里设置替换变量?这并不能解决整个语句只递增一次的
nextval
问题,这是唯一约束冲突的原因。在将代码作为答案的一部分发布时,您应该包含解释代码尝试执行的操作以及如何解决问题中描述的问题的文本。目前来看,这不是一个有用的答案。