2016-11-27 15 views
1

の個人情報を更新するストアドプロシージャを作成します。私はEMPLOYEE表に従業員の個人情報を更新するストアドプロシージャを作成するために次のことを行っている従業員

CREATE OR REPLACE PROCEDURE UPDATE_EMPLOYEE 
(
    THE_EMPLOYEEID IN NUMBER, 
    NEW_LASTNAME IN VARCHAR2, 
    NEW_FIRSTNAME IN VARCHAR2, 
    NEW_TITLE IN VARCHAR2, 
    NEW_REPORTSTO IN NUMBER, 
    NEW_BIRTHDATE IN DATE, 
    NEW_HIREDATE IN DATE, 
    NEW_ADDRESS IN VARCHAR2, 
    NEW_CITY IN VARCHAR2, 
    NEW_STATE IN VARCHAR2, 
    NEW_COUNTRY VARCHAR2, 
    NEW_POSTALCODE VARCHAR2, 
    NEW_PHONE VARCHAR2, 
    NEW_FAX VARCHAR2, 
    NEW_EMAIL VARCHAR2 
) 
AS 
BEGIN 
    UPDATE EMPLOYEE 
    SET LASTNAME = 
     CASE NEW_LASTNAME 
     WHEN NULL THEN 
      LASTNAME 
     ELSE NEW_LASTNAME 
     END, 
     FIRSTNAME = 
     CASE NEW_FIRSTNAME 
     WHEN NULL THEN 
      FIRSTNAME 
     ELSE NEW_FIRSTNAME 
     END, 
     TITLE = NEW_TITLE, 
     REPORTSTO = NEW_REPORTSTO, 
     BIRTHDATE = NEW_BIRTHDATE, 
     HIREDATE = NEW_HIREDATE, 
     ADDRESS = NEW_ADDRESS, 
     CITY = NEW_CITY, 
     STATE = NEW_STATE, 
     COUNTRY = NEW_COUNTRY, 
     POSTALCODE = NEW_POSTALCODE, 
     PHONE = NEW_PHONE, 
     FAX = NEW_FAX, 
     EMAIL = NEW_EMAIL 
    WHERE EMPLOYEEID = THE_EMPLOYEEID; 
END UPDATE_EMPLOYEE; 

EMPLOYEEID、LASTNAME、およびFIRSTNAMEはEMPLOYEE表でNULL可能ではありません。

私はこのメッセージが表示されます。

Connecting to the database ChinookDB. 
ORA-01407: cannot update ("CHINOOK"."EMPLOYEE"."LASTNAME") to NULL 
ORA-06512: at "CHINOOK.UPDATE_EMPLOYEE", line 21 
ORA-06512: at line 34 
Process exited. 
Disconnecting from the database ChinookDB. 

誰かが私が間違ってやっているものにお知らせくださいことはできますか?

+0

この手順をどのように呼び出すのかを知るのに役立ちます。たとえば、別のデータベースに接続しているようです。そのデータベース内のCHINOOKスキーマ内に同じ名前のプロシージャがある場合、それをどのように呼び出しているかに応じて、 "ローカル"バージョンを使用している可能性があります。可能な答えが多すぎる - プロシージャをどのように使用しているかを知ることは、可能性を絞り込むのに役立ちます。 – mathguy

答えて

1

私はあなたがNULL値が渡された場合new_firstnamenew_lastnameパラメータを無視することを前提としています。もしそうなら、あなたのcase文が間違っている

CASE NEW_LASTNAME 
     WHEN NULL THEN 
      LASTNAME 
     ELSE NEW_LASTNAME 
     END, 

は常にnew_lastnameを返します。 NULLを含む値はありません。NULLに等しいので、when nullは常にfalseと評価されます。あなたは

CASE WHEN new_lastname IS NULL 
    THEN lastname 
    ELSE new_lastname 
END 

か。もちろん、もっと簡単に

COALESCE(new_lastname, lastname) 

ような何かを行うことができ、あなたはnew_firstname式で同じ問題を抱えています。

+0

ありがとう!理解しています。 –

関連する問題