- 締切済み
PL/SQLのIN演算子で使う文字列の宣言について
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番目の変数の宣言に問題があり、レコードが除外できなかったと思うのですが、 正しい書き方とはどうすればいいのでしょうか? お力を貸してください。 お願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- ny123456789
- ベストアンサー率27% (6/22)
変数としてINに指定しているnochg_beforeあくまで一つの値です。 意図しているような、c1でもc2でもc3でもない、にはならず "c1","c2","c3"ではない、になってしまいます。 そういう意味でIN検索に変数を渡しても意図したような動きにすることは出来ません。 似たような事をするには、一時テーブルを作成する方法、SQLを動的に作成する方法などがありますが、本当にそこまで頑張る必要があるのでしょうか? 素直に、変数を3つ用意する方法が一番簡単ですが、もちろん変数の数は固定になります。
- bin-chan
- ベストアンサー率33% (1403/4213)
update文を組み立てる段階で nochg_before の値を確かめる。 > nochg_before varchar2(100) := 'C1'',''C2'',''C3'; --特定で変換してはいけないもの カンマの前後はシングルクォートを2重にしているのに、文字列全体の囲みは大丈夫? C1','C2','C3 になってない?
補足
変数を修正して、下記の通りにしました。 nochg_before varchar2(100) := '''C1'',''C2'',''C3'''; デバッカ上では、'C1','C2','C3'と表示されているのですが、 前件アップデートされました・・・・