
■やりたいこと
フェッチして取得したデータを条件にカウントした結果を取得したい。
■事象
フェッチして取得したデータにダブルクウォートで囲まれている為、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で質問しましょう!
似たような質問が見つかりました
- Java java final 1 2022/06/10 22:49
- PHP $_SESSIONについて教えて下さい。 2 2023/03/02 09:18
- Excel(エクセル) 複数のブックをひとつのブック(複数のシートにまとめる)場合にシートとの順番について 5 2022/12/28 20:47
- JavaScript Javascript初心者|jQueryの.val()で値を取得し複数の要素を連結させる方法知りたい 2 2022/06/02 12:06
- MySQL 次の時間帯の勝率の合計を求めるSQL文 1 2023/07/04 17:12
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Texの枠囲み調節
-
PL/SQL カーソルのFROM句にカー...
-
PL/SQLカーソルの2重FORループ...
-
【PL/SQL】CURSOR ・・・ IS SE...
-
文字列の置換
-
PL/SQLでのSQL文法
-
PL/SQLにて、マスタから取得し...
-
Accessのマクロでモジュールを...
-
Statement ignored というエラー
-
sqlplusでヘッダーが付かない
-
今日の日付が入った行のデータ...
-
callで順に実行されるプロシー...
-
14桁の日付(YYYYMMDDHHMMSS)を...
-
ODBCリンクの際にACCESSでは読...
-
PL/SQLでSPOOLさせたいのですが...
-
キャッシュを使わずにSELECTを...
-
日付型なら変数の先頭になん...
-
Accessの数値から時間に変換す...
-
SQLserver算術オーバーフロ...
-
エクセルVBAでUserFormを起動し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PL/SQLカーソルの2重FORループ...
-
PL/SQLでのSQL文法
-
Texの枠囲み調節
-
カーソル定義での条件分岐
-
カーソルで集合関数を使った場...
-
自動連番でカラムを更新したい
-
[Oracle9i]PL/SQLでFETCHしても...
-
ROW_NUMBER BY PL/SQL
-
動的なSQLからカーソルを返す。
-
カーソルフェッチにて、最終レ...
-
PL/SQLのOPEN cursor_name FOR...
-
ループカウンタの値
-
PL/SQL カーソルのFROM句にカー...
-
【PL/SQL】CURSOR ・・・ IS SE...
-
PL/SQLで
-
PL/SQLにて、マスタから取得し...
-
カーソルループ内部でログを出力
-
ACCESS VBAでループ中に制御を...
-
PL/SQL)Functionの引数(文字列...
-
指定した時間を除くためのテー...
おすすめ情報