2008-10-23 36 views
41

Tôi biết rằng tôi có thể chèn nhiều hàng bằng một câu lệnh, nếu tôi sử dụng cú pháp trong this answer.Làm cách nào để chèn nhiều hàng vào oracle với giá trị chuỗi?

Tuy nhiên, một trong những giá trị tôi chèn được lấy từ một chuỗi, ví dụ:

insert into TABLE_NAME 
(COL1,COL2) 
select MY_SEQ.nextval,'some value' from dual 
union all 
select MY_SEQ.nextval,'another value' from dual 
; 

Nếu tôi cố gắng chạy nó, tôi nhận được một lỗi ORA-02.287. Có cách nào xung quanh điều này, hay tôi nên sử dụng rất nhiều câu lệnh INSERT?

EDIT:
Nếu tôi phải chỉ định tên cột cho tất cả các cột khác ngoài chuỗi, tôi mất thời lượng ban đầu, vì vậy nó không đáng giá. Trong trường hợp đó tôi sẽ chỉ sử dụng nhiều câu lệnh INSERT.

+1

Xem thêm http: // stackoverflow.com/questions/8292199/truy vấn-vài-nextval-từ-chuỗi-trong-một-satement nếu bạn có ở đây và chỉ muốn chọn nhiều khác nhau duy nhất chuỗi tiếp theo trong cùng một truy vấn ... – rogerdpack

Trả lời

39

này hoạt động:

insert into TABLE_NAME (COL1,COL2) 
select my_seq.nextval, a 
from 
(SELECT 'SOME VALUE' as a FROM DUAL 
UNION ALL 
SELECT 'ANOTHER VALUE' FROM DUAL) 
+0

Nhận được lỗi sau: 'java.sql.BatchUpdateException: ORA-02287: số thứ tự không được phép ở đây' – beckah

+0

@beckah hỏi một câu hỏi mới hiển thị phiên bản SQL và Oracle của bạn? –

+0

đã tìm ra! cấu trúc giá trị chuỗi được chèn vào không phải là một truy vấn mà chỉ đơn giản là 'sequencer.nextval' như một giá trị chèn làm việc tuyệt vời :) @WW – beckah

1

Khả năng là tạo trình kích hoạt khi chèn để thêm vào số thứ tự chính xác.

2

Từ Oracle Wiki, lỗi 02.287 là

An ORA-02287 occurs when you use a sequence where it is not allowed.

Trong số những nơi mà trình tự không thể được sử dụng, bạn dường như cố gắng:

In a sub-query

Vì vậy, có vẻ như bạn không thể làm bội số trong cùng một tuyên bố.

Các giải pháp họ đưa ra là:

If you want the sequence value to be inserted into the column for every row created, then create a before insert trigger and fetch the sequence value in the trigger and assign it to the column

+0

Tôi đã làm điều này trước đây. Đó là một nỗi đau, nhưng nó dường như là cách duy nhất xung quanh nó. – madlep

+0

-1 Hãy kiểm tra câu trả lời của WW, nó làm việc cho tôi! –

4
insert into TABLE_NAME 
(COL1,COL2) 
WITH 
data AS 
(
    select 'some value' x from dual 
    union all 
    select 'another value' x from dual 
) 
SELECT my_seq.NEXTVAL, x 
FROM data 
; 

Tôi nghĩ rằng đó là những gì bạn muốn, nhưng tôi không có quyền truy cập vào oracle để kiểm tra nó ngay bây giờ.

+0

Phiên bản Oracle nào yêu cầu? –

+0

có sẵn trong 9i – EvilTeach

24

Nó không làm việc vì chuỗi không hoạt động trong các tình huống sau đây:

  • Trong một mệnh đề WHERE
  • Trong một GROUP BY hoặc mệnh đề ORDER
  • THEO Trong một điều khoản riêng biệt
  • Cùng với một UNION hoặc INTERSECT hoặc MINUS
  • Trong một truy vấn phụ

Nguồn: http://www.orafaq.com/wiki/ORA-02287

Tuy nhiên điều này không làm việc:

insert into table_name 
      (col1, col2) 
    select my_seq.nextval, inner_view.* 
    from (select 'some value' someval 
      from dual 
      union all 
      select 'another value' someval 
      from dual) inner_view; 

Hãy thử nó ra:

create table table_name(col1 varchar2(100), col2 varchar2(100)); 

create sequence vcert.my_seq 
start with 1 
increment by 1 
minvalue 0; 

select * from table_name; 
+0

Upvote để cung cấp tài liệu tham khảo về lý do tại sao. – cbeuker

0

làm việc này và không có nhu cầu sử dụng union all.

Insert into BARCODECHANGEHISTORY (IDENTIFIER,MESSAGETYPE,FORMERBARCODE,NEWBARCODE,REPLACEMENTDATETIME,OPERATORID,REASON) 
select SEQ_BARCODECHANGEHISTORY.nextval, MESSAGETYPE, FORMERBARCODE, NEWBARCODE, REPLACEMENTDATETIME, OPERATORID, REASON 
from (
    SELECT 
    'BAR' MESSAGETYPE, 
    '1234567890' FORMERBARCODE, 
    '1234567899' NEWBARCODE, 
    to_timestamp('20/07/12','DD/MM/RR HH24:MI:SSXFF') REPLACEMENTDATETIME, 
    'PIMATD' OPERATORID, 
    'CORRECTION' REASON 
    FROM dual 
); 
+2

thực sự? Làm thế nào bạn sẽ chèn nhiều hơn một hàng trong một câu lệnh duy nhất mà không sử dụng union? – Ovesh

Các vấn đề liên quan