• 締切済み

ORA-00904:無効な識別子の回避策について

■やりたいこと フェッチして取得したデータを条件にカウントした結果を取得したい。 ■事象 フェッチして取得したデータにダブルクウォートで囲まれている為、EXECUTE時にORA-00904が発生する。 ■教えて欲しいこと カーソルおよびフェッチ時にダブルクウォートを削除、またはシングルクウォートに変換をすることが可能でしょうか。または、他の方法でカウントを取得する方法がございますでしょうか。 サンプルコードを記載しておりますのでご確認、ご教授のほどよろしくお願いします。 ※※※の箇所が本事象発生箇所となります。 ■サンプルコード DECLARE V_EXEC_STRING VARCHAR2(2000); V_EXEC_COUNT NUMBER; CURSOR TESTCUR IS SELECT TEST_NAME,TEST_ID,TEST_DATE FROM TARGET_TBL WHERE TEST_NAME IN (SELECT tb1.TEST_NAME FROM (SELECT TEST_NAME FROM TARGET_TBL WHERE STATUS = '2') tb1 INNER JOIN READ_TBL tb2 ON(tb1.TEST_NAME = tb2.TEST_NAME)); --取得レコードを格納する変数定義 TESTREC TESTCUR%ROWTYPE; --処理開始 BEGIN --カーソルオープン OPEN TESTCUR; --ループ開始 LOOP --フェッチ 1行ずつデータ取得 FETCH TESTCUR INTO TESTREC; --レコードの最後でループを終了 EXIT WHEN TESTCUR%NOTFOUND; V_EXEC_STRING := ''; V_EXEC_STRING := V_EXEC_STRING || 'SELECT COUNT(*) FROM READ_TBL WHERE TEST_NAME = '|| TESTREC.TEST_NAME; ※※※上記TESTREC.TEST_NAMEに"AAAA"の形でデータが入るため、下記実行時にORAエラーが発生する。 EXECUTE IMMEDIATE V_EXEC_STRING INTO V_EXEC_COUNT; IF V_EXEC_COUNT = '1' THEN UPDATE TARGET_TBL SET TEST_ID = ( SELECT TEST_ID FROM READ_TBL WHERE TEST_NAME = TESTREC.TEST_NAME), TEST_DATE = ( SELECT TEST_DATE FROM READ_TBL WHERE TEST_NAME = TESTREC.TEST_NAME), STATUS = 10 WHERE TEST_NAME = TESTREC.TEST_NAME; END IF; IF V_EXEC_COUNT != '1' THEN UPDATE TARGET_TBL SET STATUS = 20 WHERE TEST_NAME = TESTREC.TEST_NAME; END IF; END LOOP; CLOSE TESTCUR; COMMIT; END; /

みんなの回答

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.2

>カーソルおよびフェッチ時にダブルクウォートを削除、またはシングルクウォートに変換をすることが可能でしょうか。 なんか違う気がする。 >※※※上記TESTREC.TEST_NAMEに"AAAA"の形でデータが入るため、下記実行時にORAエラーが発生する。 というのを >EXECUTE IMMEDIATE V_EXEC_STRING INTO V_EXEC_COUNT; で実行されるSQL文が、 >V_EXEC_STRING := V_EXEC_STRING || 'SELECT COUNT(*) FROM READ_TBL WHERE TEST_NAME = '|| TESTREC.TEST_NAME; によって作成された SELECT COUNT(*) FROM READ_TBL WHERE TEST_NAME = "AAAA" になっているからAAAAという項目がないってエラーになっているようです。 "を除去したところで、 SELECT COUNT(*) FROM READ_TBL WHERE TEST_NAME = AAAA になるだけ。 やはり、AAAAという項目がないってエラーになるのでは? V_EXEC_STRING := V_EXEC_STRING || 'SELECT COUNT(*) FROM READ_TBL WHERE TEST_NAME = '''|| TESTREC.TEST_NAME || ''''; にすると、 SELECT COUNT(*) FROM READ_TBL WHERE TEST_NAME = 'AAAA' となるので、TEST_NAMEの値が、AAAAの件数を取得できる ということかなと思いますがいかがでしょう?

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.1

こんにちわ。 > カーソルおよびフェッチ時にダブルクウォートを削除または > シングルクウォートに変換をすることが可能でしょうか ltrim, rtrim, translate, replace 等を使えば可能だと思います。 この辺のマニュアルを参考にしてみて下さい。 http://docs.oracle.com/cd/E16338_01/server.112/b56299/functions002.htm#CJAEEJFC

参考URL:
http://docs.oracle.com/cd/E16338_01/server.112/b56299/functions002.htm#CJAEEJFC

関連するQ&A