プロが教えるわが家の防犯対策術!

Oracleで同一インスタンスの別スキーマに同じテーブル構成を作り開発環境としています。

そこで下記のSQL文を実行しようとすると、あるスキーマでは正常に検索されるけど別のスキーマでは
「ORA-01861 リテラルがフォーマット文字列と一致しません」
とのエラーメッセージが出力されます。
また困ったことに別マシンから同様の検索を行うとどのスキーマでも正常に検索が行われます。
Net8とかOracleクライアントの設定の問題でしょうか?

DBサーバはOracle10g、クライアントは前者のマシンがOracle8i、後者のマシンにOracle9iがインストールされています。

【対象SQL文】
SELECT *
FROM
(SELECT
TEMP.*,
ROWNUM AS RM
FROM
(SELECT
TEST.COL1,
TEST.COL2
FROM
TEST
WHERE
(COL1 = 'Dummy') AND
COL2 = '1' AND
DATE_COL <= '2005-11-04 12:00:00.0' -- ※この行に対して「ORA-01861」が発生しています。
) TEMP
)
WHERE
RM >= 1 AND
RM <= 300
ORDER BY RM
/

A 回答 (2件)

DATE_COL は VARCHAR2 型ですか、それとも DATE 型ですか?



DATE 型であれば、基本的には比較するときに、

DATE_COL <= TO_DATE('2005-11-04 12:00:00', 'YYYY-MM-DD HH24:MI:SS')

と日付に変換して比較してあげるか、
SQL 文を実行する前に、

ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';

として、日付のフォーマットを Oracle に教えてあげなければなりません。

この回答への補足

回答ありがとうございます。
DATE_COLはDATE型です。
逆に比較式の時間の方に秒の小数点部まで含まれているからマシンによってうまくいくこと自体不思議だったりするんですが…。

補足日時:2005/11/07 16:53
    • good
    • 0

DATE_COL <= '2005-11-04 12:00:00.0'



小数部があり、9i で動作するところから予想すると
DATE_COL はTIMESTAMP 型ではありませんか?
それと、SQLを実行したツールと表定義はどのようになっていますか ?

Oracle8i の環境は手元にないので確認しようがないのですが、
8i には TIMESTAMP型がありませんので、SQLPLUS ですと
デフォルトの NLS_TIMESTAMP_FORMATが存在しないためにエラーになっているのかもしれません。

暗黙変換は使用せず、ちゃんと TO_XXX 関数を使用してみてください。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
ツールによる自動生成SQLが表記したようになるための問題です。
ツールの見直しをしなければいけないようですね。

お礼日時:2005/11/11 13:53

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