2

OCI でコンパイルされたクライアント: 10.2.0.4.0
サーバー: Oracle9i Enterprise Edition リリース 9.2.0.4.0

問題のあるクエリは次のとおりです。

SELECT CODIGO FROM LOG WHERE TEL = :telnumber AND DATE_PROC = '05-JUL-08'

テーブルの説明:

SQL>describe LOG;

TEL NOT NULL VARCHAR2(15)
CODIGO NOT NULL VARCHAR2(20)
DATE_PROC NOT NULL DATE

シンプルに見えるかもしれませんが、SQLPlus を使用してサーバー上で直接実行すると結果が返されますが、OCI を使用するアプリから実行すると、このクエリはOCI_NO_DATA always を返します。最初は、日付の値もプレースホルダーでしたが、リテラル like を指定しても機能しないことがわかりました'05-JUL-08'。私は次のことを試しました:

  • 私は基本を試しました: クライアントから DB にクエリを実行すると機能します。困ったのはこいつだ
  • 以下は機能します:

    SELECT CODIGO FROM LOG WHERE TEL = :telnumber
    
  • ALTER SESSION SET NLS_DATE_FORMAT="DD-MM-YYYY";サーバーとクライアントの両方でクエリの前に実行します。同じ結果: サーバーはデータを返し、クライアントはOCI_NO_DATA

  • DATE_PROCこれを の使用と組み合わせて、フォーマットを変更しようとしましたTO_DATE()。同じ結果です。
  • 探した、探した、探した。答えがありません

答えを見つけるのに少し必死です。助けていただければ幸いです。必要に応じて、さらに多くの詳細を提供できます。ありがとう。

---詳細情報---

update log set DATE_PROC = TO_DATE('20080705162918', 'YYYYMMDDHH24MISS') where CODIGO='BancoOne';

trunc() と「alter session set nls_date_format」を使用してさまざまな組み合わせを試しました...これが得られるものです:

SELECT CODIGO FROM LOG WHERE TEL = 11223344 AND DATE_PROC = TO_DATE('20080705162918', 'YYYYMMDDHH24MISS');

サーバー: 戻り値: "BancoOne" (適切な値)
OCI アプリ:戻り値 OCI_NO_DATA

SELECT CODIGO FROM LOG WHERE TEL = 11223344 AND trunc(DATE_PROC) = TO_DATE('20080705', 'YYYYMMDD');

サーバー内: 戻り値: "BancoOne"
OCI アプリ内: 戻り値 "BancoOne"

要点は、両方が同じ DB サーバーにアクセスしている場合、OCI アプリが異なる結果を出すのはなぜですか?

また、OCI アプリの目的を明確にするために、ユーザーが構成するクエリがあります。アイデアは、ユーザーが必要に応じてクエリを調整して、宛先 DB に存在する日付フィールドに適合させることです。そのため、日付形式がわからないため、「alter session set nls_date_format」ステートメントをコードに含めるべきではありません。このようにして、ユーザーに柔軟性を提供し、特定の日付形式に依存しないようにします。これは理にかなっていますか?助言がありますか?

4

4 に答える 4

2

列 DATE_PROC は DATE です。常に日付と比較し、暗黙的なデータ変換に頼らないでください

これを試して:

SELECT CODIGO FROM LOG WHERE TEL = :telnumber AND DATE_PROC = DATE '2008-07-05'

またはこれ:

SELECT CODIGO 
  FROM LOG 
 WHERE TEL = :telnumber 
   AND DATE_PROC = to_date('05-JUL-08', 'DD-MON-RR')

可能であれば、月に文字を使用し (既定の言語を変更するとコードが失敗するため)、年に 2 文字のみを使用する (世紀のあいまいさ)日付形式をコードで使用することは控えてください。この形式は元の日付としてソートされるため、使用したいです。'YYYY/MM/RR'

于 2010-01-15T13:27:04.620 に答える
0

このエラー (OCI_NO_DATA) は、誰かが PC の時刻を変更したために発生しました。日付/時刻を正しい時刻に戻すと、アプリケーションは正常に動作し始めました。

于 2013-04-26T13:52:03.320 に答える
0

レコードはどのように挿入されましたか?

日付フィールドには時間情報が格納されるため、sysdate を使用してレコードを挿入すると、日付フィールドにはその日のレコードの異なる「値」が含まれます。date_proc = '05-JUL-08' を実行すると、date_proc が 2008 年 7 月 5 日の 12:01:00 と正確に一致することになります。sysdate で 12:01 にレコードを挿入した場合、それは返されません。between または trunc を使用してみましたか?

以下に例を示します。

drop table test_date;
create table test_date (id number, ud date);

insert into test_date values (1, '15-jan-10');
insert into test_date values (2, '15-jan-10');
insert into test_date values (3, '15-jan-10');
insert into test_date values (6, sysdate);    -- sysdate as of writing is 15-JAN-2010 08:01:55
insert into test_date values (7, sysdate);    -- sysdate as of writing is 15-JAN-2010 08:01:55
insert into test_date values (8, '16-jan-10');
commit;

select id, ud, to_char(ud, 'dd-MON-yyyy HH:MM:SS') from test_date where ud = '15-jan-10';
---------------------- ------------------------- --------------------
1                      15-JAN-10                 15-JAN-2010 12:01:00                                                        
2                      15-JAN-10                 15-JAN-2010 12:01:00                                                        
3                      15-JAN-10                 15-JAN-2010 12:01:00      

select id, ud, to_char(ud, 'dd-MON-yyyy HH:MM:SS') from test_date where trunc(ud) = '15-jan-2010';
---------------------- ------------------------- --------------------
1                      15-JAN-10                 15-JAN-2010 12:01:00                                                        
2                      15-JAN-10                 15-JAN-2010 12:01:00                                                        
3                      15-JAN-10                 15-JAN-2010 12:01:00                                                        
6                      15-JAN-10                 15-JAN-2010 08:01:55                                                        
7                      15-JAN-10                 15-JAN-2010 08:01:55
于 2010-01-15T12:56:11.187 に答える
0

あなたは間違った質問をしていると思います。

Oracle はパフォーマンスのために SQL の共有に依存しており、'20080705' のように文字列を挿入すると、SQL を共有できません。詳細はこちら

したがって、データ値はプレースホルダーであり、正しいデータ型 (DATE) である必要があります。ここでの例は、それを行うのに役立つはずです。

とはいえ、これが機能する場合

SELECT CODIGO FROM LOG 
WHERE TEL = 11223344 AND 
trunc(DATE_PROC) = TO_DATE('20080705', 'YYYYMMDD');

しかし、これはそうではありません

SELECT CODIGO FROM LOG 
WHERE TEL = 11223344 
AND DATE_PROC = TO_DATE('20080705162918', 'YYYYMMDDHH24MISS');

私はしようとしていただろう

SELECT TO_CHAR(DATE_PROC,'DD-MM-YYYY HH24:MI:SS') FROM LOG 
WHERE TEL = 11223344 AND 
trunc(DATE_PROC) = TO_DATE('20080705', 'YYYYMMDD');
于 2010-01-17T21:59:49.683 に答える