2016-08-03 12 views
-3

私は非常に単純な関数を持っています。渡されたパラメータに基づいてsalary列を更新したいだけです。私は手続きでそれを行うことができることを知っているが、このコードで何が間違っている、誰も私を説明してください。単純な関数が期待通りに機能しません

表とデータ構造:

create table emp_test (emp_id number, salary number); 
insert into emp_test values (10,750); 
insert into emp_test values (11,850); 
insert into emp_test values (12,650); 
insert into emp_test values (13,950); 
insert into emp_test values (14,1750); 
insert into emp_test values (15,2750); 

と機能:

CREATE OR REPLACE FUNCTION 
CIS_EXT.UPDATE_EMP_SAL(p_emp_id IN emp_test.emp_id%TYPE) 
return NUMBER 
IS 
BEGIN 
    UPDATE EMP_TEST SET SALARY = SALARY+200 
    WHERE EMP_ID = p_emp_id; 
    COMMIT; 
    RETURN 1; 
EXCEPTION 
    WHEN OTHERS THEN 
    RETURN 0; 
END UPDATE_EMP_SAL ; 

私は

SELECT UPDATE_EMP_SAL(10) FROM DUAL; 

の下に私の出力が0になぜ来ているように実行?

+2

ヘルプセンターはhttp://stackoverflow.com/help/([あなたの投稿をフォーマットする方法に関するセクション]を持っています書式設定) –

答えて

3

when others例外ハンドラで実際のエラーを隠しています。 That is almost always a bug;あなたがしているのは、有益な情報を抑制し、戻り値を調べる(そして解釈する方法を知る)ことがない限り、呼び出し側がすべてがOKだと思えるようにすることです。予期しない例外をここでは処理しないで、呼び出し側が見たときに何をすべきかを決めるようにしてください。 (呼び出し元のトランザクションを中断する可能性があるため、プロシージャ/関数内でコミットまたはロールバックしない方が良いですが、それは別の問題です)。

あなたがその例外ハンドラを削除した場合、あなたはそれが言っていることがわかります:削除またはSELECT、INSERTなどのDML操作、更新:

ORA-14551: cannot perform a DML operation inside a query 

そのエラーの説明は次のとおりです。

*原因-for-update
は、クエリ内またはPDMLスレーブの下では実行できません。
*問合せまたはPDMLスレーブ
内で、問題のあるDML操作が実行されていないか、
が自律型トランザクションを使用していることを確認してください。

DMLを実行することはできますが、通常はプロシージャ内でDMLを実行することをお勧めします。しかし、あなたの関数がDML操作を行うならば、あなたはだけにして、PL/SQLから呼び出すことができます。

set serveroutput on 
declare 
    rc number; 
begin 
    rc := UPDATE_EMP_SAL(10); 
    dbms_output.put_line(rc); 
end; 
/

PL/SQL procedure successfully completed. 

1 

select * from emp_test where emp_id = 10; 

    EMP_ID  SALARY 
---------- ---------- 
     10  950 
+0

ありがとうございますアレックス、それは動作します – Sohel

+0

@Sohelもしそれが動作する場合は、それを答えとしてマークする必要があります – vercelli

+0

回答しましたか? – Sohel

関連する問題