
■やりたいこと
フェッチして取得したデータを条件にカウントした結果を取得したい。
■事象
フェッチして取得したデータにダブルクウォートで囲まれている為、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;
/
A 回答 (2件)
- 最新から表示
- 回答順に表示
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の件数を取得できる
ということかなと思いますがいかがでしょう?
No.1
- 回答日時:
こんにちわ。
> カーソルおよびフェッチ時にダブルクウォートを削除または
> シングルクウォートに変換をすることが可能でしょうか
ltrim, rtrim, translate, replace 等を使えば可能だと思います。
この辺のマニュアルを参考にしてみて下さい。
http://docs.oracle.com/cd/E16338_01/server.112/b …
参考URL:http://docs.oracle.com/cd/E16338_01/server.112/b …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
自動連番でカラムを更新したい
-
PL/SQLでのSQL文法
-
PL/SQLカーソルの2重FORループ...
-
ORA-00904:無効な識別子の回避...
-
Access VBAで行ラベルが定義さ...
-
実行エラー 3075:クエリ式`作...
-
Statement ignored というエラー
-
SQLserver算術オーバーフロ...
-
Accessのマクロでモジュールを...
-
SQL*Loaderでのsysdate使用
-
sqlplusでヘッダーが付かない
-
SQL ブレーク処理について
-
SQL*PLUSでの分秒までの表示の仕方
-
SQLエラーについて
-
sp_executesqlを実行してもテー...
-
別のスキーマのテーブルアップ...
-
ACCESS2007インポート時の空白...
-
DB2のSELECTでカンマ編集につい...
-
Analyzeとは?
-
ALTER SESSIONについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PL/SQLカーソルの2重FORループ...
-
PL/SQLでのSQL文法
-
カーソル定義での条件分岐
-
自動連番でカラムを更新したい
-
Texの枠囲み調節
-
PL/SQLのOPEN cursor_name FOR...
-
ORA-00904:無効な識別子の回避...
-
カーソルループ内部でログを出力
-
PL/SQL カーソルのFROM句にカー...
-
【PL/SQL】LOOPした動的SQLにて...
-
カーソルで集合関数を使った場...
-
ROW_NUMBER BY PL/SQL
-
【PL/SQL】CURSOR ・・・ IS SE...
-
mysqlのcase文で複数の条件を指...
-
Accessのマクロでモジュールを...
-
Statement ignored というエラー
-
Access VBAで行ラベルが定義さ...
-
キャッシュを使わずにSELECTを...
-
callで順に実行されるプロシー...
-
ODBCリンクの際にACCESSでは読...
おすすめ情報