1

私はオラクルで手続きをしています:

CREATE OR REPLACE 
PROCEDURE ONE
    (
    p_GUID IN ONE.GUID%TYPE,
    p_START_DATE IN ONE.START_DATE%TYPE,
    p_END_DATE IN ONE.END_DATE%TYPE,
    p_RETURN OUT INTEGER
    )
AS
BEGIN
    INSERT INTO ONETABLE (GUID, START_DATE, END_DATE)
  VALUES (p_GUID, to_date(p_START_DATE, 'YYYY-MM-DD HH24:MI:SS'), to_date(p_END_DATE, 'YYYY-MM-DD HH24:MI:SS'));
    COMMIT;
  EXCEPTION
        WHEN OTHERS THEN
        p_RETURN:= 1;
END;

編集、人々はこれを試すように言っているようです(これも機能しません。問題を解決するためにto_date(上記の例)を使用しようとしました):

CREATE OR REPLACE 
PROCEDURE ONE
    (
    p_GUID IN ONE.GUID%TYPE,
    p_START_DATE IN ONE.START_DATE%TYPE,
    p_END_DATE IN ONE.END_DATE%TYPE,
    p_RETURN OUT INTEGER
    )
AS
BEGIN
    INSERT INTO ONETABLE (GUID, START_DATE, END_DATE)
  VALUES (p_GUID, p_START_DATE, p_END_DATE);
    COMMIT;
  EXCEPTION
        WHEN OTHERS THEN
        p_RETURN:= 1;
END;

C#から呼び出すと(たとえば、DateTime.NOWを使用して)-失敗します。

開始日と終了日が 2013 年 4 月 5 日の形式の場合にのみ機能するようです。しかし、入力だけでなく、そこに時間を取得するにはどうすればよいですか?

交換したら

p_START_DATE, 'YYYY-MM-DD HH24:MI:SS'

'2013-05-13 12:13:14', 'YYYY-MM-DD HH24:MI:SS'

これは機能しますが、c# からプロシージャを呼び出すと失敗します。

また、手動で db クライアントから手順を実行する場合でも、2013 年 4 月 5 日を入力する必要があり、それのみが機能します。時刻を入力しようとすると失敗して入力できません。

開始日と終了日は、Oracle db の DATE 型です。

--

何をしようとしているかに応じて、さまざまなメッセージが表示されます。

調べてみると、以下のことが関係しているようです。

SELECT value FROM v$nls_parameters WHERE parameter ='NLS_DATE_FORMAT';

どちらが返されますか:

DD-MON-RR

そして、データベースの所有者ではないので、それを変更することはできません。

--

では、そこに時間部分を取得する方法は?

完全な SQL は次のとおりです。

select parameter, value from nls_session_parameters;

どちらが返されますか:

NLS_LANGUAGE    AMERICAN
NLS_TERRITORY   AMERICA
NLS_CURRENCY    $
NLS_ISO_CURRENCY    AMERICA
NLS_NUMERIC_CHARACTERS  . 
NLS_CALENDAR    GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE   AMERICAN
NLS_SORT    BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT    DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT  HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY   $
NLS_COMP    BINARY
NLS_LENGTH_SEMANTICS    BYTE
NLS_NCHAR_CONV_EXCP FALSE
4

2 に答える 2

1

DATE関数を型に変換する必要はありません。もうデートです。パラメータに渡された値を挿入するだけです:

    INSERT INTO ONETABLE (GUID, START_DATE, END_DATE)
  VALUES (p_GUID, p_START_DATE, p_END_DATE);

アップデート

ただし、上記のバリアントが機能せず、エラーが発生した場合は、ストアド プロシージャのパラメーター定義をクライアント側で確認する必要があります。p_START_DATEクライアント側のパラメーターが DateTime 型であることを確認できますか?

更新 2

クライアント側にエラーがあります。以下の例のように日付パラメーターを初期化してみてください。

OracleParameter p1 = new OracleParameter();
p1.DbType = DbType.DateTime;
p1.Value = System.DateTime.Now;

エラーの理由はおそらく、C# コンポーネントがパラメーターを文字列として扱い、それをデフォルトの OS 形式の文字列に変換してから、クエリで Oracle に渡しているためです。Oracle は、ストアド プロシージャの定義で指定された日付型にその文字列を解析しようとしましたONEが、NLS_DATE_FORMAT パラメータからデフォルトの形式を想定しているため、失敗します。

アップデート 3

コメントで @b0x0rz によって説明されたエラーの本当の原因 (間違った戻り値の型)。とにかく、それはクライアント側の間違いです...

于 2013-04-05T13:11:18.967 に答える