2012-01-04 34 views
19

Tôi đang sử dụng công cụ Phân tích dữ liệu và yêu cầu tôi có là chấp nhận giá trị từ người dùng, chuyển giá trị đó dưới dạng tham số và lưu trữ nó trong bảng. Khá straighforward vì vậy tôi ngồi viết nàyGiải pháp cho "không thể thực hiện thao tác DML bên trong truy vấn"?

create or replace 
procedure complex(datainput in VARCHAR2) 
is 
begin 
insert into dumtab values (datainput); 
end complex; 

tôi thực hiện điều này trong SQL Developer sử dụng câu lệnh sau

begin 
complex('SomeValue'); 
end; 

Nó hoạt động tốt, và giá trị được chèn vào bảng. Tuy nhiên, các câu lệnh trên không được hỗ trợ trong công cụ Phân tích Dữ liệu, vì vậy tôi đã sử dụng hàm để thay thế. Sau đây là mã của hàm, nó biên dịch.

create or replace 
function supercomplex(datainput in VARCHAR2) 
return varchar2 
is 
begin 
insert into dumtab values (datainput); 
return 'done'; 
end supercomplex; 

Một lần nữa tôi cố gắng thực hiện nó trong SQL Developer, nhưng tôi đã nhận không thể thực hiện một hoạt động DML bên trong một truy vấn khi thực hiện đoạn mã sau

select supercomplex('somevalue') from dual; 

Câu hỏi của tôi là - Tôi cần một câu lệnh có thể chạy hàm được đề cập trong Nhà phát triển SQL hoặc - Một hàm có thể thực hiện những gì tôi đang tìm kiếm có thể được thực hiện bằng cách chọn tuyên bố. - Nếu không thể làm những gì tôi hỏi, tôi muốn một lý do để tôi có thể thông báo cho người quản lý của mình vì tôi rất mới (như một tuần tuổi?) Với PL/SQL vì vậy tôi không biết các quy tắc và cú pháp.

P.S. Làm thế nào tôi muốn này là C++ hoặc thậm chí Java :(

EDIT

tôi cần để chạy các chức năng trên SQL Developer vì trước khi chạy nó trong DMine (đó là công cụ) để kiểm tra nếu nó là Bất cứ điều gì có giá trị hay không. không hợp lệ trong SQL cũng là không hợp lệ trong DMine, nhưng không phải là cách khác xung quanh.

Thanks for the help, tôi hiểu tình hình và giải thích tại sao nó là bất hợp pháp/không được khuyến khích

+0

Lỗi bạn đang nhận không phải là SQL Developer cụ thể, nó là một lỗi Oracle và nó khá đơn giản: Bạn không thể sửa đổi cơ sở dữ liệu trong truy vấn. Có lẽ điều này là do mức độ cách ly, để duy trì sự tuân thủ ACID; bằng không bạn có thể sửa đổi các bảng bạn đang truy vấn cùng một lúc và tất cả Địa ngục sẽ tan vỡ! – Xophmeister

+0

Bạn có thể giải thích tại sao bạn cần gọi một hàm trong SQL Developer không? Tại sao lại là vấn đề đó? – APC

+0

không được hỗ trợ trong công cụ phân tích dữ liệu? công cụ gì nếu bạn có thể chạy SQL trong công cụ này, bạn sẽ có thể chạy một kịch bản (khối ẩn danh bạn hiển thị ban đầu). – tbone

Trả lời

33

Bạn có thể sử dụng chỉ thị pragma autonomous_transaction. Điều này sẽ chạy hàm này thành một giao dịch độc lập có thể thực hiện DML mà không cần nâng cấp ORA-14551.

Lưu ý rằng vì autonomous transaction độc lập, kết quả của DML sẽ được cam kết bên ngoài phạm vi giao dịch gốc. Trong hầu hết các trường hợp, đó không phải là giải pháp có thể chấp nhận được.

SQL> CREATE OR REPLACE FUNCTION supercomplex(datainput IN VARCHAR2) 
    2  RETURN VARCHAR2 IS 
    3  PRAGMA AUTONOMOUS_TRANSACTION; 
    4 BEGIN 
    5  INSERT INTO dumtab VALUES (datainput); 
    6  COMMIT; 
    7  RETURN 'done'; 
    8 END supercomplex; 
    9/

Function created 

SQL> SELECT supercomplex('somevalue') FROM dual; 

SUPERCOMPLEX('SOMEVALUE') 
-------------------------------------------------------------------------------- 
done 

SQL> select * from dumtab; 

A 
-------------------------------------------------------------------------------- 
somevalue 

Tom Kyte has a nice explanation về lý do tại sao lỗi được nêu ở vị trí đầu tiên. Nó không an toàn vì nó có thể phụ thuộc vào thứ tự các hàng được xử lý. Hơn nữa, Oracle không đảm bảo rằng hàm sẽ được thực hiện ít nhất một lần và tối đa một lần cho mỗi hàng.

10

Chỉ cần khai báo một biến để chấp nhận giá trị trả về, ví dụ:

declare 
    retvar varchar2(4); 
begin 
    retvar := supercomplex('somevalue'); 
end; 

Lựa chọn không hoạt động vì hàm đang thực hiện chèn, nếu tất cả nó đã trả về một giá trị thì nó sẽ hoạt động.

+1

Bạn quên bao gồm biến để giữ giá trị trả lại. – APC

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