dポイントプレゼントキャンペーン実施中!

PL/SQLの変数の宣言の仕方について質問です!!

PL/SQLで変数と変数の使用について質問があります。

PL/SQL内部でUPDATEなどを分を作成する際の、その要素を使用部に変数で格納したいと思ってい
ストアドを作成していました。

例えば:
update tableA
set columnA = 'aaaaaa'
where
columnA not in ('c1','c2','c3')
and
columnA like 'c%';

というを

--仕様部--
afterset varchar2(100) :='aaaaaa'; --変換したい値
nochg_before varchar2(100) := 'C1'',''C2'',''C3'; --特定で変換してはいけないもの
beforeset varchar2(100) := 'c%'; --変換したい対象

--本体部--

update tableA
set columnA = afterset
where
columnA not in (nochg_before)
and
columnA like beforeset;

で、作成して実行した際に、なぜか「特定で変換してはいけないもの」
も一緒に更新をかけていました。
おそらく、2番目の変数の宣言に問題があり、レコードが除外できなかったと思うのですが、
正しい書き方とはどうすればいいのでしょうか?


お力を貸してください。
お願いします。

A 回答 (2件)

変数としてINに指定しているnochg_beforeあくまで一つの値です。



意図しているような、c1でもc2でもc3でもない、にはならず

"c1","c2","c3"ではない、になってしまいます。

そういう意味でIN検索に変数を渡しても意図したような動きにすることは出来ません。

似たような事をするには、一時テーブルを作成する方法、SQLを動的に作成する方法などがありますが、本当にそこまで頑張る必要があるのでしょうか?

素直に、変数を3つ用意する方法が一番簡単ですが、もちろん変数の数は固定になります。
    • good
    • 0

update文を組み立てる段階で nochg_before の値を確かめる。



> nochg_before varchar2(100) := 'C1'',''C2'',''C3'; --特定で変換してはいけないもの
カンマの前後はシングルクォートを2重にしているのに、文字列全体の囲みは大丈夫?
C1','C2','C3 になってない?

この回答への補足

変数を修正して、下記の通りにしました。
nochg_before varchar2(100) := '''C1'',''C2'',''C3''';

デバッカ上では、'C1','C2','C3'と表示されているのですが、
前件アップデートされました・・・・

補足日時:2012/04/03 23:24
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す