dポイントプレゼントキャンペーン実施中!

■やりたいこと
フェッチして取得したデータを条件にカウントした結果を取得したい。

■事象
フェッチして取得したデータにダブルクウォートで囲まれている為、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件)

>カーソルおよびフェッチ時にダブルクウォートを削除、またはシングルクウォートに変換をすることが可能でしょうか。



なんか違う気がする。

>※※※上記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の件数を取得できる

ということかなと思いますがいかがでしょう?
    • good
    • 0

こんにちわ。



> カーソルおよびフェッチ時にダブルクウォートを削除または
> シングルクウォートに変換をすることが可能でしょうか
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 …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す