2012-08-28 37 views
37

Tôi đã cố gắng thực hiện điều gì đó như tự động tăng trong Oracle 11g Express và SQL Developer. Tôi biết rất ít về Oracle và tôi cũng mới để kích hoạt.Tạo trình kích hoạt trong Oracle Express

Tôi đã thử chạy tính năng này, nhưng tôi không biết cách thực hiện đúng cách.

CREATE TABLE theschema.thetable 
(id NUMBER PRIMARY KEY, 
name VARCHAR2(30)); 

CREATE SEQUENCE theschema.test1_sequence 
START WITH 1 
INCREMENT BY 1; 

create or replace trigger insert_nums 
before insert on theschema.thetable 
for each row 
begin 
select test1_sequence.nextval into :new.id from dual; 
end; 
/

Khi tôi cố gắng tạo trình kích hoạt, tôi nhận được màn hình yêu cầu tôi "gắn". Hộp thoại chỉ có một hộp kiểm "null". Điều này có ý nghĩa gì và làm cách nào để tôi thực hiện một tập lệnh hoạt động chính xác?

Bất kỳ biện pháp phòng ngừa nào trong khi thực hiện loại "tự động tăng" này?

Enter binds

+0

Tôi đã thêm thẻ Nhà phát triển SQL, vì mã này trông ổn; Nó yêu cầu bạn điền vào một biến ràng buộc vì vậy tôi giả sử có một số thiết lập bạn phải tắt ... Tôi không có ý tưởng gì mặc dù. – Ben

+1

BTW, từ Oracle 11 trở đi bạn có thể tham chiếu một chuỗi trực tiếp. Điều này có nghĩa là bạn có thể viết ': new.id: = test1_sequence.nextval' mà không sử dụng lệnh SELECT. – Ben

+1

Cùng một câu hỏi ở đây! Cảm ơn bài đăng của bạn! –

Trả lời

48

Dường như SQL Developer nghĩ rằng bạn đang chạy một DML (thao tác dữ liệu) kịch bản đơn giản, không phải là một DDL (định nghĩa dữ liệu). Nó cũng cho rằng :new.id là một biến có thể kết buộc.

Tại sao điều này xảy ra, tôi không biết; Tôi không thể tái tạo nó trong Oracle SQL Developer 2.1.

Cố gắng mở một cửa sổ bảng SQL mới trong lược đồ theschema và thực hiện một "toàn bộ" kịch bản (không phải là một tuyên bố) bằng cách nhấn F5 (không F9).

+0

Cảm ơn bạn rất nhiều! hoạt động.Tôi không biết tại sao toàn bộ kịch bản phải được thực hiện để làm cho điều này hoạt động đúng. Tại sao nó không thể được thực hiện từng phần một. –

+0

Bạn được chào đón! Tôi không biết tại sao điều này cũng xảy ra, bởi vì SQL Developer của tôi hoạt động tốt. –

+1

Tôi đã có vấn đề chính xác này và đây là giải pháp. Tôi có thể xác nhận Nó liên quan đến phiên bản SQL Developer. – Jhokva

15

Đây là cách tôi đã giải quyết vấn đề này, đặt "set define off;" trước lệnh:

set define off; 
create or replace trigger [...] 
[...] 
end; 
/

Sau đó, đánh dấu cả hai lệnh và nhấn F9 để chạy. Hoặc bạn có thể chạy tất cả các lệnh bằng F5.

Dường như, nếu các lệnh được thực hiện tách biệt với F9 thì tập hợp xác định tắt sẽ không ảnh hưởng.

+0

Âm thanh như một giải pháp tốt, nhưng sẽ tốt hơn nếu bạn đề cập đến những gì "thiết lập xác định tắt" thực sự. Từ những gì tôi đọc, có vẻ như nó tắt nhắc người dùng cho loại biến/giá trị này liên kết? Rất vui được biết. https://stackoverflow.com/questions/34332639/when-or-why-to-use-a-set-define-off-in-oracle-database – Balmipour

+0

Điều này không khắc phục được sự cố trong câu hỏi. Nó dừng các biến phần giữ chỗ phiên dịch SQL Developer (được đánh dấu bằng dấu và,) nhưng không ảnh hưởng đến việc xử lý các biến liên kết (được đánh dấu bằng dấu hai chấm,:) đó là vấn đề mà OP hỏi. –

0

Đối với trường hợp của tôi, giải pháp đã được nhập "newrow" cho 'mới' và "oldrow" cho 'cũ' như giá trị cho các với phím tắt ...

+0

Và nó hoạt động! – m0rjjj

0

Tôi là một người mới tại đây để giữ cho rằng trong tâm trí như Tôi trả lời. Tôi nghĩ rằng vấn đề là mã số

create or replace trigger insert_nums 
before insert on theschema.thetable 
for each row 
begin 
select test1_sequence.nextval into :new.id from dual; 
end; 

Thực ra là một tập lệnh và không thẳng thắn câu lệnh SQL. Do đó bạn phải chạy "Run Script". Tôi phát hiện ra rằng khi tôi có một bảng tính mở trong SQL Developer rằng nếu tôi có bất kỳ chỗ nào trong trang tính thì bất kỳ mã nào cho trình kích hoạt như trên thì thậm chí tôi chỉ cố chạy một câu lệnh mà Nhà phát triển SQL sẽ xem lại trong trang tính và cố gắng chạy kịch bản. Để ngăn chặn điều đó xảy ra tôi đã phải bình luận ra mã. Và nếu tôi muốn chạy mã cho trình kích hoạt hơn là tôi phải mở một trang tính mới, hãy đặt mã ở đó và thực hiện RUN SCRIPT.

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