2017-10-04 29 views
1

私はテーブルに挿入してテーブルを更新する関数を持っています。Oracle:「select from dual」から関数を呼び出す

select AGENTS_REGISTRATION() from dual; 

か::からそれを呼び出す

declare 
    x NUMBER; 
begin 
    select AGENTS_REGISTRATION() into x from dual; 
end; 
/

は何もしません。別のフォームで必要な変更が行われます。

declare 
    x NUMBER; 
begin 
    x := AGENTS_REGISTRATION(); 
end; 
/

最初の2つの式で何が間違っていますか?

+1

「何もしない」とはどういう意味ですか?問合せにDMLは使用できないため、ORA-14551エラーが発生しているはずです。 –

+0

Oracle SQL Developerでは式を実行しますが、ORA-14551は取得しません。 ** select **ステートメントでデータを変更する関数を使用することはできません。あなたは答えとしてあなたのコメントを追加できますか? .... – gavenkoa

+1

関数内でDML操作を実行することはできません。もしそれが "何もしません"と言っていたら、 '他の人がnullになった時 'や' ORA-14551'エラーを抑止する他の何らかの例外処理構造があるでしょう。 –

答えて

4

Oracleでは、問合せ内で操作がDMLであることを許可していません。クエリ内のinserts/updates/deletesデータが上昇してしまうことに関数を呼び出す:

ORA-14551:クエリ内のDML操作を実行することはできません

exceptionは、関数の中に閉じ込められた場合

クエリがエラーを発生しません - それはこの例のように、エラーを再発生させることなく、例外ハンドラ(pragma exception_initを直接使用してORA-14551を捕捉)を使用することは非常に危険です。

関数がautonomous transactionpragma autonomous_transactionを使用)と定義されている場合、クエリでDML操作を使用することは可能ですが、これにより多くの問題が発生します。

解決策はクエリ内で関数を呼び出すことではありません。これを行うことは間違いありません。