
■やりたいこと
フェッチして取得したデータを条件にカウントした結果を取得したい。
■事象
フェッチして取得したデータにダブルクウォートで囲まれている為、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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PL/SQLでのSQL文法
-
カーソル定義での条件分岐
-
PL/SQLカーソルの2重FORループ...
-
Texの枠囲み調節
-
Accessのマクロでモジュールを...
-
Statement ignored というエラー
-
sqlplusでヘッダーが付かない
-
ODBCリンクの際にACCESSでは読...
-
ストアド実行時のエラー「参照...
-
callで順に実行されるプロシー...
-
Access VBAで行ラベルが定義さ...
-
エクセルVBAでUserFormを起動し...
-
Excel VBAで「プログラム実行」...
-
SQLで部分的にGROUP BYしたいとき
-
【Excel VBA】 WorksheetやRa...
-
重複するIDのデータを1行にま...
-
ACCESS、時間ごとの集計の仕方は?
-
今日の日付が入った行のデータ...
-
SQLサーバで和暦から西暦に変換...
-
SQLエラーについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PL/SQLカーソルの2重FORループ...
-
カーソル定義での条件分岐
-
Texの枠囲み調節
-
自動連番でカラムを更新したい
-
ORA-00904:無効な識別子の回避...
-
PL/SQLでのSQL文法
-
PL/SQLにて、マスタから取得し...
-
mysqlのcase文で複数の条件を指...
-
PL/SQLのOPEN cursor_name FOR...
-
PL/SQLでの配列についてetc
-
PL/SQLにてカーソル名を変数に
-
PL/SQLでカーソルを指定する方法
-
T-SQLのカーソルで
-
PL/SQL カーソルのFROM句にカー...
-
[Oracle9i]PL/SQLでFETCHしても...
-
ROW_NUMBER BY PL/SQL
-
T-SQLで
-
PL/SQLプログラムの書き方がわ...
-
PL/SQLのカーソルについて
-
処理の結果レコードがなかった...
おすすめ情報