0

これが私の手順であり、PL/SQL Developerを介して機能します:

create or replace procedure CHECK_INFO_INS
(
    p_id_aircraft IN VARCHAR2,           
    p_id_check_type IN NUMBER,     
    p_last_check   IN DATE,             
    p_next_check   IN DATE,             
    p_expectedcost IN NUMBER,                             
    p_id_currency  IN NUMBER,
    p_currency_rate IN NUMBER                         
)             
is
Rate number;
CurrentDate Date;
catID Checkcategories.Id%type;
begin
select C.ID into catID from CHECKCATEGORIES C WHERE C.NAME='C' and C.CHECKTYPEID = p_id_check_type;

  Rate:=round(p_expectedcost/MONTHS_BETWEEN(p_next_check, p_last_check),3)*p_currency_rate;
  CurrentDate := SYSDATE;
  INSERT INTO CHECK_INFO
  (
      id_check_info,            
      id_aircraft,              
      id_check_categories,      
      last_check,               
      next_check,              
      expectedcost,             
      is_accumulation_complited,
      rate,                     
      id_currency,              
      current_date,             
      monthes_between,
      CURENCY_RATE             
 )
  values
  (
    CHECKS_INFO_SEQ.NEXTVAL,
    p_id_aircraft,
    catID,
    p_last_check,
    p_next_check,
    p_expectedcost,
    0,
    Rate,
    p_id_currency,
    CurrentDate,
    round(MONTHS_BETWEEN(p_next_check, p_last_check),1),
    p_currency_rate
  );
  commit;
    EXCEPTION
    WHEN OTHERS
    THEN
      DBMS_OUTPUT.PUT_LINE(SQLERRM);
      ROLLBACK;
end CHECK_INFO_INS;

ここに私のC#コードがあります:

        decimal expectedCost = Decimal.Parse(ExpCostTextBox.Text);
        DateTime lastCheck = DateTime.Parse(LastCheckdateTimePicker.Text);
        DateTime nextCheck = DateTime.Parse(NextCheckdateTimePicker.Text);
        int checkType = int.Parse(ChCmbx.SelectedValue.ToString());
        string AirCraft = AirCraftCmbx.SelectedValue.ToString();
        int curID = int.Parse(CurrComboBox.SelectedValue.ToString());
        decimal curRate = decimal.Parse(CurRateTextBox.Text.Replace('.',','));


        con = new OracleConnection(conStr);
        con.Open();
        cmd = con.CreateCommand();
        cmd.BindByName = true;
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = schema_name + ".CHECK_INFO_INS";

        cmd.Parameters.Add("p_id_aircraft", OracleDbType.NVarchar2, AirCraft, ParameterDirection.Input);
        cmd.Parameters.Add("p_id_check_categories", OracleDbType.Int32, checkType, ParameterDirection.Input);
        cmd.Parameters.Add("lastCheck", OracleDbType.Date, lastCheck, ParameterDirection.Input);
        cmd.Parameters.Add("nextCheck", OracleDbType.Date, nextCheck, ParameterDirection.Input);
        cmd.Parameters.Add("p_expectedcost", OracleDbType.Decimal, expectedCost, ParameterDirection.Input);
        cmd.Parameters.Add("p_id_currency", OracleDbType.Int32, curID, ParameterDirection.Input);
        cmd.Parameters.Add("p_currency_rate", OracleDbType.Decimal, curRate, ParameterDirection.Input);
        cmd.ExecuteNonQuery();

executeNonQuery 行で例外をスローします。

ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'CHECK_INFO_INS'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

手順を再作成しようとしましたが、うまくいきませんでした。C# コードの何が問題になっていますか?

4

3 に答える 3

2

私は Oracle にあまり詳しくありませんが、プロシージャの 2 番目のパラメーターの名前は「p_id_check_type」ですが、パラメーター コレクションにパラメーターを追加するときは「p_id_check_categories」という名前を使用します。それがあなたの問題かもしれませんか?

于 2012-09-20T15:38:10.117 に答える
0

Oracleパラメータ名は:p_currency_rate、パラメータリストとSQLステートメントの両方で、のようにコロンで始める必要があります。

于 2012-09-20T11:47:59.683 に答える
0

クリスは正しい、

ストアド プロシージャの呼び出しで間違ったパラメーター名を使用しています。

したがって、ここでの呼び出しで:

   cmd.Parameters.Add("p_id_check_categories", OracleDbType.Int32, checkType, ParameterDirection.Input);
cmd.Parameters.Add("lastCheck", OracleDbType.Date, lastCheck, ParameterDirection.Input);
        cmd.Parameters.Add("nextCheck", OracleDbType.Date, nextCheck, ParameterDirection.Input);

次のように、ストアドプロシージャで見つかったのと同じパラメーター値にする必要があります。

    cmd.Parameters.Add("p_id_check_type", OracleDbType.Int32, checkType, ParameterDirection.Input);
cmd.Parameters.Add("p_last_check", OracleDbType.Date, lastCheck, ParameterDirection.Input);
        cmd.Parameters.Add("p_next_check", OracleDbType.Date, nextCheck, ParameterDirection.Input);

少なくとも私がこの問題に遭遇したときはいつでも:

PLS-00306: 'CHECK_INFO_INS'のコールで、引数の数またはタイプが間違っています

パラメータの順序が間違っていない限り、これが通常、この問題に遭遇したときの理由です。

于 2012-09-20T18:48:21.740 に答える