2012-03-07 29 views
7

Tôi cần chuyển tiếp một chuỗi các chuỗi chỉ với quyền truy cập DML. Do lỗi trong một đoạn mã, một số giá trị đã được lấy mà không cần chuỗi nhưng thay vì theo cách thủ công, do đó, bây giờ chuỗi đang nhân đôi các giá trị đó. Vì vậy, tôi muốn đẩy trình tự đến giá trị tối đa sao cho lần tiếp theo được gọi là tiếp theo, nó cho một giá trị cao hơn giá trị tối đa. Tôi đã có khoảng 50 chuỗi mà mỗi người phải đi một vài nghìn về phía trước.Theo cách thủ công chuyển tiếp chuỗi - oracle sql

Điều này có thể chỉ với quyền truy cập DML không? Nếu vậy, làm thế nào tôi nên đi về nó?

Trả lời

8

Bạn có thể sử dụng SQL động để làm điều này. Ví dụ, bit mã này sẽ chọn 10.000 giá trị tiếp theo từ mỗi danh sách các chuỗi.

DECLARE 
    l_num INTEGER; 
BEGIN 
    FOR seq IN (select * 
       from all_sequences 
       where sequence_name in (<<list of 50 sequences>>) 
        and sequence_owner = <<owner of sequences>>) 
    LOOP 
    FOR i IN 1 .. 10000 
    LOOP 
     execute immediate 
     'select ' || seq.sequence_owner || '.' || seq.sequence_name || '.nextval from dual' 
     into l_num; 
    END LOOP; 
    END LOOP; 
END; 

Nếu bạn có khả năng phát hành DDL chống lại thứ tự, bạn có thể sử dụng một cách tiếp cận tương tự để thiết lập INCREMENT đến 10.000, hãy chọn một giá trị từ chuỗi, và thiết lập các INCREMENT lại xuống còn 1 (hoặc bất kỳ nó bây giờ là).

+0

Điều này thật tuyệt vời. Tôi có thể tính toán số vòng lặp cần thiết cho mỗi chuỗi bằng cách trừ đi giá trị tiếp theo của chuỗi từ giá trị tối đa của cột có liên quan để thực hiện điều này một cách tự động. Tôi đã không nhận ra rằng sql có chức năng như vậy. Cảm ơn bạn! – Jeremy

2

bạn có thể chỉ

select seq.nextval from dual 

cho đến khi nó đủ lớn ...

+0

Tôi có khoảng 50 chuỗi mỗi bước phải tiến lên vài nghìn. – Jeremy

+0

bạn có thể chạy PLSQL không? – Randy

1

Để khởi động lại trình tự ở một giá trị khác, bạn cần phải thả và tạo lại.

Xem tài liệu Oracle cho ALTER SEQUENCEhere.

Và đối với CREATE SEQUENCEhere

Vì vậy, không có tôi không nghĩ rằng nó có thể truy cập DML, trừ khi bạn chỉ cần tăng liên tục như Randy gợi ý.

4

Bạn nên xác định sự khác biệt giữa giá trị tiếp theo của chuỗi và giá trị bắt buộc. Giá trị yêu cầu thường là giá trị tối đa của cột khóa chính (hãy đặt tên cho nó là ID).

DECLARE 
    maxid NUMBER; 
    maxseq NUMBER; 
    temp NUMBER; -- without this variable Oracle would skip to query the sequence 
BEGIN 
    SELECT MAX(ID) INTO maxid FROM MYTABLE; 
    SELECT MYSEQ.NEXTVAL INTO maxseq FROM DUAL; 
    FOR i IN maxseq .. maxid LOOP 
     SELECT MYSEQ.NEXTVAL INTO temp FROM DUAL; 
    END LOOP; 
END; 
/
1

Nếu bạn có một bảng có ít nhất nhiều hàng như số tiền bạn muốn thêm vào chuỗi, các thao tác sau sẽ hoạt động. Điều này tăng từng chuỗi theo cùng một số tiền, có thể không phù hợp với bạn, nhưng nó nhanh chóng và dễ dàng mà không yêu cầu PL/SQL hoặc cần phải thả/tạo lại chuỗi. Tôi sử dụng nó mọi lúc khi tôi muốn nhận các chuỗi máy chủ phát triển trước khi sản xuất.

SELECT seq1.nextval, seq2.nextval, ..., seqN.nextval 
    FROM very_large_table 
WHERE ROWNUM <= number_of_rows_to_add 
Các vấn đề liên quan