• 締切済み

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番目の変数の宣言に問題があり、レコードが除外できなかったと思うのですが、 正しい書き方とはどうすればいいのでしょうか? お力を貸してください。 お願いします。

  • Oracle
  • 回答数2
  • ありがとう数0

みんなの回答

回答No.2

変数としてINに指定しているnochg_beforeあくまで一つの値です。 意図しているような、c1でもc2でもc3でもない、にはならず "c1","c2","c3"ではない、になってしまいます。 そういう意味でIN検索に変数を渡しても意図したような動きにすることは出来ません。 似たような事をするには、一時テーブルを作成する方法、SQLを動的に作成する方法などがありますが、本当にそこまで頑張る必要があるのでしょうか? 素直に、変数を3つ用意する方法が一番簡単ですが、もちろん変数の数は固定になります。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

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

munimuniporn
質問者

補足

変数を修正して、下記の通りにしました。 nochg_before varchar2(100) := '''C1'',''C2'',''C3'''; デバッカ上では、'C1','C2','C3'と表示されているのですが、 前件アップデートされました・・・・

関連するQ&A

  • PL/SQL

    PL/SQL(Oralce)で、NVARCHAR2の変数を宣言した場合、その変数への代入方法を教えてください。 Hensu NVARCHAR2; と宣言し、 Hensu := N'テスト'; とした場合、コンパイルエラーとなりませんが、 Hensu  NVARCHAR2; Hsensu1 VARCHAR2; と宣言し、 Hensu := N || Hsensu1; とした場合、”識別子Nを宣言してください。”旨のコンパイルエラーが出力されていしまいます。 OracleはR8.1.7です。 よろしくお願いします。

  • PL/SQLでの文字列と数値の比較について

    いつもお世話になっております。 次のように、今が午前中なら「AM」と表示するPL/SQLのプログラムを考えています。 BEGIN if TO_CHAR(SYSTIMESTAMP,'hh24')<12 THEN DBMS_OUTPUT.PUT_LINE('AM'); END if; END; / 動作しているように見えるのですが、TO_CHARはVARCHAR2型を返すとマニュアルに書いてありました。TO_CHARが返す値は数値に変換したほうがよいのでしょうか。あるいはPL/SQLでも、文字列は数値に変換されるのでしょうか。 お教えいただけると助かります。 何卒よろしくお願いいたします。

  • PL/SQLに関しての質問です。

    はじめまして。 PL/SQLの入門書を一冊程度読んで開発に携わってしまった初心者です。 どうしてもわからず、行き詰ってしまったので質問させて下さい。 現在あるパッケージを作成しています。 例えとして、パッケージ内にプロシージャAとプロシージャBが有るとします。 プロシージャA内で、SELECTにてDBから取ってきた値を変数Cに入れます。 その変数Cはパッケージの呼出し元のモジュールに返します。 ここまでは解りますが問題はここからです。 プロシージャAで変数Cに格納した値を、そのままプロシージャBでも使用したいのです。 変数Cを仕様部で宣言して、グローバル変数として使用すれば楽だと思うのですが、 グローバル変数は一切使用してはならない。と言われています。 ご回答お待ちしております。

  • PL/SQL)Functionの引数(文字列)をWHERE文に記述する方法

    PL/SQLで、Functionの中で実行するselect文のWhereに、Functionの 引数で受けとった値をセットしようとしています。 この引数が文字列(VARCHAR2型)の場合、どのようにWHEREで、記述したらよいのでしょうか? ご教授のほどをよろしくお願いします。 CREATE OR REPLACE FUNCTION Fn_TBL_AAA (psCODE IN VARCHAR2) IS CURSOR TBL_AAA_CUR IS SELECT * FROM TBL_AAA WHERE BBB = psCODE ; TBL_AAA_REC TTBL_AAA_CUR%ROWTYPE;       :       : ※上記のように記述すると、実行ではエラーが発生しないのですが、  取得したい結果が返ってきません。TABLE(TBL_AAA)のBBBは、  VARCHAR2なので、通常のSQL*PLUSのSELECT文ではBBB = psCODE  はBBB = 'psCODE'のように [']で括るのですが、PL/SQLの  FUNCTION内ではどのように記述すればよいのかが  わかりません。 以上、よろしくお願いいたします。

  • T-SQLでのテキスト型変数の宣言方法

    何方かT-SQL(MS-SQL Server7.0)でのテキスト型変数の宣言方法をご存知の方がおられたらご教授下さい。 以下で宣言した場合は、エラーになりました。 DECLARE @case_history VARCHAR(255) 宜しくお願いします。

  • PL/SQLの基礎的な質問ですが・・

    こんばんわ! PL/SQLの超初心者なのですが、以下ように「aaa」という変数に一つ目のselect文の結果を代入して、二つ目のselect文のテーブルにその名前を当てはめたいだけなのです。 DECLAER aaa VARCHAR2(30) BEGIN select max(TABLE_NAME) into aaa from ALL_TABLES Like '***'; select * from aaa END; ところが、結果は「表またはビューが存在しません」となります。 このような使い方はできないのでしょうか? どなたかご教示いただけませんでしょうか?宜しくお願いします。

  • PL/SQLを使った開発について質問があります。

    PL/SQLを使った開発について質問があります。 私は、Java(eclipse)を使用して開発を経験しております。 そこで質問があります。 eclipseを使ってPL/SQLの開発は可能でしょうか? また、可能な場合ですが、以下の条件を達成できますか? ・プロシージャが多くても、一発で目的の位置にジャンプしたい ・プロシージャの呼び出し元へジャンプしたい ・変数の宣言へジャンプしたい ・変数名の変更時などに自動リファクタリングしてほしい 等です。 どうか、ご回答よろしくお願いします。

    • ベストアンサー
    • Java
  • PL/SQLのエラーについて

    こんばんは。PL/SQLのエラーについて質問させて頂きます。 現在、Oracle8.1.7のデータベースを使用したオラクルのE-business Suiteという人事系システムで開発をしています。 そこで、SQL*Plusを使用してPL/SQLのパッケージをコンパイルしたところ、パッケージ仕様部も本体部もコンパイルのエラーは出なかったのですが、E-business SuiteにPL/SQLを設定し、動作させようとしたら、下記のようなエラーが発生しました。 -------------------------------------------------------------------- FDPSTP 内のOracleエラー 6550 原因: ORA-06550: 行 1、列 7: PLS-00221: 'ZT_TYOUHYOU_HENSEI_PKG'がプロシージャではないか、または未定義です。 ORA-06550: 行 1、列 7: PL/SQL: Statement ignored が原因で FDPSTP に失敗しました。 --------------------------------------------------------------------- また、作成したPL/SQLパッケージの仕様部は下記のとおりです。 -------------------------------------------------------------------- CREATE OR REPLACE PACKAGE APPS.ZT_TYOUHYOU_HENSEI_PKG AS FUNCTION get_henseihyo_kbn (i_grade IN VARCHAR2,o_hensei_kbn OUT VARCHAR2) RETURN NUMBER; <・・・・・中間部分は省略・・・・・> PROCEDURE main_shori (p_process_date IN VARCHAR2, p_location IN VARCHAR2); END ZT_TYOUHYOU_HENSEI_PKG; -------------------------------------------------------------------- 原因だと思われる心当たりの部分も探してみたのですが、このエラーの意味は何なのか、原因はどこにあるのか分かりません。 どなたかお判りの方、御回答よろしくお願い致します。

  • PL/SQLのカーソルについて

    すみません。 PL/SQLにて以下のようなカーソルがあるのですが、 引数のpJYOKENをWHERE条件に追加することはできないでしょうか。 pJYOKENには(属性 = 0)のような条件が入っています。 条件はその都度違ったものが入ってくるイメージです。 cursor CURテスト (pJYOKEN IN VARCHAR2) IS SELECT 社員コード FROM テストマスタ WHERE 会社ID = '001' AND 区分 = 1; rcテスト CURテスト%rowtype; よろしくお願い致します。

  • PL/SQLについて

    PL/SQLについて お世話になります。 現在Oracle 11gと.Net C#で開発をしている物です。 正直どちらも初心者で悪戦苦闘している日々ですが、 PL/SQLのカーソルについて知りたい事があります。 PL/SQLでカーソルを作成しました。 そしてその同一ストアドプロシージャ文の中で、 先のカーソルの結果で得られた値から別の新たなカーソル でまた新たな結果を返すと言う様な、二重カーソルの様な 事は可能でしょうか。 どなたかご親切な方、ご教授頂きたく宜しくお願い致します。 出来れば、サンプルや、HP等ご紹介頂ければありがたく 思います。