0

次のようにOracleでプロシージャを作成しました。

create or replace PROCEDURE SP_X_AVERAGE
(
    profile out SYS_REFCURSOR,
    rx out SYS_REFCURSOR,
)
as
BEGIN


  open profile for
        select
            avg(to_number(profile_netassets)) AS netassets
        from 
            fgp;


  open rx for
      select 
          avg(to_number(a_price)) as twr 
      from 
          r_x
      where 
            gq_date <= add_months(to_date(sysdate, 'mm/dd/yyyy'), -12);


END SP_X_AVERAGE;

実行されず、次のエラーが発生します。

ORA-01843: not a valid month

2 番目の SQL で where 条件を削除すると、正常に実行されます。

同じ手順で SQL を使用してセッションを変更しても機能しません。

助けてください。

この手順を sql-developer (ubuntu Oneiric 11) で実行しています。

4

1 に答える 1

3

SYSDATE はすでに DATE なので、TO_DATE() を適用する必要はありません。ただし、最近のバージョンの Oracle は、そのようなことに対して寛容であり、適切に処理します。

それで、問題は残りr_x.gq_dateます:それはどのデータ型ですか? 文字列の場合、日付にキャストされない値が含まれているか、最終的にデフォルトの NLS_FORMAT と一致しない可能性があります。


「「VARCHAR2(40 BYTE)」のままにしておく必要があります。日付は「1/2/2003」のようになります」

ビンゴ。それはあなたの NLS_DATE_FORMAT と同じですか? そうでない場合は、列をキャストする必要があります。

to_date(gq_date, 'mm/dd/yyyy')  <= add_months(sysdate, -12);

列にその形式ではない文字列が含まれている場合、これは問題を解決しない可能性があります。これは、文字列を使用して文字列ではないものを保持することの一般的な副作用です。

于 2013-03-06T13:40:02.203 に答える