2016-03-21 11 views
0

テーブルを更新するストアドプロシージャを作成しました。 しかし、私は1つ以上のパラメータがNULLであるところを考慮したいと思います。 このような場合、私は列を更新したくないので、既存の値をそのまま残したいと思います。PL SQL - パラメータがNULLでない場合のストアドプロシージャ更新列

私が使用することを試みた:

UPDATE 
     VS_USER_T 
    SET 
     USR_FIRST_NAME = ISNULL(p_NewUsrFName, @p_NewUsrFName) 
    WHERE 
     USR_ID = lv_Num_UsrId; 

しかし、私は '@' のエラーを取得し、私は、Oracle 12cとを使用しています。

は、これは「p_NewUsrnameは」私のように既存の値のままにしたい場合には、NULLにすることができたときに私のUPDATEステートメントは、ように見えるべきか教えてくださいプロシージャコール

PROCEDURE UpdateUser 
    (p_UserId    IN   VS_USER_T.USR_ID%TYPE, 
     p_NewUsrFName  IN   VS_USER_T.USR_FIRST_NAME%TYPE, 
     p_NewUsrLName  IN   VS_USER_T.USR_LAST_NAME%TYPE, 
     p_NewUsrname   IN   VS_USER_T.USR_LOGIN%TYPE) 

です。

ありがとうございます。

+0

あなたのコードは、あなたのSPの外観がよりよく理解できるように更新してください。 –

+0

パラメータをオプションとして設定していますか? –

+0

Oracleのマニュアルでは、変数に接頭辞 '@ 'を付ける構文を見つけましたか? –

答えて

1

既存の列の値を参照する必要がある既存の値に保つために:

USR_FIRST_NAME = ISNULL(p_NewUsrFName, USER_FIRST_NAME) 

またはあなたが使用することができます

USR_FIRST_NAME = CASE WHEN p_NewUsrFName is null THEN USER_FIRST_NAME ELSE NewUsrFName END 
+0

Oracleには 'ISNULL'機能がありません:' ORA-00904: "ISNULL":無効な識別子です。同じことをするいくつかのOracle関数については、[@Niall answer](http://stackoverflow.com/a/36175914/1509264)を参照してください。 – MT0

+0

'NVL()'を使うか、もっと冗長ではあるが一般的な 'CASE WHEN ... THEN..ELSE ... END'構文を使うことができます – rpy

0

たとえば、デコードステートメントを使用できます。

update my_table t 
set username = decode(p_NewUsrname, NULL, t.username, p_NewUsrname) 
where t.id = p_UserId; 
3

ISNULL()はまだ標準のOracleではありません(少なくともあなたが使用していると言っているOracle 12cのバージョンでは)。 ISNULL()と呼ばれるPL/SQL関数を記述して使用することはもちろん可能です。

標準のOracle 12cインストールでは、NVLまたはCOALESCEを代わりに使用してください。

USR_FIRST_NAME = NVL(p_NewUsrFName, USR_FIRST_NAME) 
    or 
USR_FIRST_NAME = COALESCE(p_NewUsrFName, USR_FIRST_NAME) 
関連する問題