2

私はこのストアドプロシージャを持っています:

CREATE OR REPLACE PROCEDURE "LIQUIDACION_OBTENER" (
  p_Cuenta IN NUMBER, 
  p_Fecha IN DATE,
  p_Detalle OUT LIQUIDACION.FILADETALLE%TYPE
) IS

BEGIN 

  SELECT FILADETALLE
    INTO p_Detalle
    FROM Liquidacion
   WHERE (FILACUENTA = p_Cuenta)
     AND (FILAFECHA = p_Fecha);

END;
/

...そして私のc#コード:

string liquidacion = string.Empty;

OracleCommand command = new OracleCommand("Liquidacion_Obtener");            

command.BindByName = true;
command.Parameters.Add(new OracleParameter("p_Cuenta", OracleDbType.Int64));
command.Parameters["p_Cuenta"].Value = cuenta;
command.Parameters.Add(new OracleParameter("p_Fecha", OracleDbType.Date));
command.Parameters["p_Fecha"].Value = fecha;

command.Parameters.Add("p_Detalle", OracleDbType.Varchar2, ParameterDirection.Output);            

OracleConnectionHolder connection = null;

connection = this.GetConnection();
command.Connection = connection.Connection;
command.CommandTimeout = 30;
command.CommandType = CommandType.StoredProcedure;
OracleDataReader lector = command.ExecuteReader();

while (lector.Read())
{
    liquidacion += ((OracleString)command.Parameters["p_Detalle"].Value).Value;
}

パラメータ「Fecha」(つまり日付)に値を入れようとすると、コードでこのエラーが発生します(行command.ExecuteReader();が実行されたとき) 。

Oracle.DataAccess.Client.OracleException : ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SYSTEM.LIQUIDACION_OBTENER", line 9
ORA-06512: at line 1

日時を試してみましたが、問題はありませんでした。入力パラメーターなしで出力のみを試してみましたが、同じエラーが発生しました。どうやら問題は出力パラメータにあります。p_Detalle OUTLIQUIDACION.FILADETALLE%TYPEの代わりにp_Detalle OUT VARCHAR2を入れてみましたが、どちらも機能しませんでした

私の投稿が理解できることを願っています..ありがとう!!!!!!!!!!

4

4 に答える 4

2

からの出力は何ですか:

DESC LIQUIDACION

あなたが持っている出力パラメータ表記は正しいです:

p_Detalle OUT LIQUIDACION.FILADETALLE%TYPE

...そのため、Oracle データ型を .NET 兄弟に変換するときに、問題は C# コードに残ります。Javaを使用しているときに、以前に見たことがあります...

以前


のデータ型LIQUIDACION.filafechaが VARCHAR2/etc (DATE ではない) の場合は、次を使用します。

SELECT la.filadeetaile
  INTO p_Detalle
  FROM LIQUIDACION la
 WHERE la.filacuenta = p_Cuenta
   AND la.filafecha = TO_CHAR(p_Fecha, 'YYYY-MON-DD');

...または、データ型に一致するようにパラメーターを変更できます。

p_Fecha IN LIQUIDACION.filafecha%TYPE

...そして、適切な情報を渡すように C# コードを修正します。

理想的には、日付列は DATE データ型である必要があります...

于 2010-03-30T19:49:04.477 に答える
0

パラメータを設定するときは、to_date(p_fecha、'yyyy-mmm-dd')を使用してみてください。

  command.Parameters["p_Fecha"]。Value=to_date(fecha、'yyyy-MON-dd');
于 2010-03-30T19:23:12.313 に答える
0

おそらく...これが問題になる可能性があります。Oracleのto_date関数を使用して、日付形式と一致させてください。

それが機能しない場合は、最後の手段として、パラメーターをvarcharに変更し、日付をストリングとしてストアード・プロシージャーに渡します。Oracle内でto_dateを使用します。

このように、ストアドプロシージャは次のようになります。

CREATE OR REPLACE PROCEDURE "LIQUIDACION_OBTENER" (
p_Cuenta IN NUMBER, 
p_Fecha IN VARCHAR,
p_Detalle OUT LIQUIDACION.FILADETALLE%TYPE
) IS

BEGIN 

    SELECT 
        FILADETALLE
    INTO
        p_Detalle
    FROM 
        Liquidacion
    WHERE 
        (FILACUENTA = p_Cuenta)
        AND (FILAFECHA = to_date(p_Fecha, 'yyyy-MON-dd'));

END;

Oracle / PLSQL:To_Date関数

于 2010-03-30T19:26:21.733 に答える
0

出力パラメータのサイズを定義していないようです:

command.Parameters.Add("p_Detalle", OracleDbType.Varchar2, ParameterDirection.Output);            

ADO のデフォルトが何なのかはわかりませんが、LIQUIDACION.FILADETALLE%TYPE. 受け取る変数が小さすぎるか、データ型が間違っている場合、Oracle は ORA-06502 をスローします。次のようなことを試してください(データベースの列定義に合わせてサイズを調整します):

command.Parameters["p_Detalle"].Size = 20;
于 2010-04-01T11:44:48.183 に答える