質問

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 いつも. 。最初は日付の値もプレースホルダーでしたが、リテラルのような値を与えても '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');

サーバー内:戻り値:「バンコワン」
OCI アプリの場合:「BancoOne」を返します

重要なのは、両方が同じ DB サーバーにアクセスしている場合に、なぜ OCI アプリが異なる結果を与えるのかということです。

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

役に立ちましたか?

解決

あなたのコラム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'を使用したい。

他のヒント

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

日付フィールドは、ストアの時間情報を行うと、SYSDATEを使用してレコードを挿入するときにこのように、日付フィールドは、その日の内のレコードごとに異なる「値」が含まれています。あなたはdate_proc = '05 -JUL-08' を実行するとdate_procは12時01分〇〇秒で正確に2008年7月5日に等しく、あなたが言っています。あなたはSYSDATEと12時01分にレコードを挿入した場合、それが返されることはありません。あなたは、間、または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

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

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');

私達はちょうどこのエラー(OCI_NO_DATAは)自分のPC上で一日の時間を変更する誰かによって引き起こされます持っていました。彼らは右の時間に戻って日付/時刻を入れると、アプリケーションはOK仕事を始めます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top