1

Oracle.DataAccessを使用してVisualStudio2012(c#)からOracleデータベースに接続し、PACKAGEの一部であるFUNCTIONを実行しようとしています。以下はSQLです。

FUNCTION TEST (test_name in varchar2,
   test_year in number,
   test_outmessage out varchar2)
RETURN NUMBER IS
   test_exists     VARCHAR2(1) := 'N';
BEGIN
   BEGIN
      SELECT 'Y' INTO test_exists
        FROM Test_Table
       WHERE table_name = test_name
         AND table_year = test_year;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN
         test_exists := 'N';
      WHEN OTHERS THEN
         test_outmessage := 'error'
         DBMS_OUTPUT.put_line (test_outmessage);
         RETURN -1;
   END;

   IF test_exists = 'Y' THEN
      RETURN 1;
   ELSE
      RETURN 0;
   END IF;

END TEST;

私は自分のアプリからこの関数を実行するためのc#コードを書きました:

 using (OracleConnection connection = new OracleConnection("Data Source=Database; User ID=user; Password=pass"))
{
  OracleCommand command = connection.CreateCommand();
  command.CommandType = System.Data.CommandType.StoredProcedure;
  command.CommandText = "USER.PACKAGE.TEST";


   OracleParameter test_name = new OracleParameter();
   test_name.ParameterName = "test_name";
   test_name.OracleDbType = OracleDbType.NVarchar2;
   test_name.Direction = System.Data.ParameterDirection.Input;
   test_name.Value = "myname";
   command.Parameters.Add(test_name);

   OracleParameter test_year = new OracleParameter();
   test_year.ParameterName = "test_year";
   test_year.OracleDbType = OracleDbType.Decimal;
   test_year.Direction = System.Data.ParameterDirection.Input;
   test_year.Value = 2004;
   command.Parameters.Add(test_year);

   OracleParameter test_outmessage = new OracleParameter();
   test_outmessage.ParameterName = "test_outmessage ";
   test_outmessage.OracleDbType = OracleDbType.NVarchar2;
   test_outmessage.Direction = System.Data.ParameterDirection.Output;
   command.Parameters.Add(test_outmessage);

   OracleParameter result = new OracleParameter();
   result.ParameterName = "ReturnValue";
   result.OracleDbType = OracleDbType.Decimal;
   result.Direction = System.Data.ParameterDirection.ReturnValue;
   command.Parameters.Add(result);
   try
   {
         connection.Open();

         command.ExecuteNonQuery();
         string r = result.Value.ToString();
         string r1 = test_outmessage.Value.ToString();
   }
   catch (Exception)
   {

   }
   finally
   {
          connection.Close();

    }
 }

このコードを実行しても例外はありませんが、戻り値(rとr1の両方)はnullです。関数の場合と同様に、文字列rには-1、1、または0を期待する必要があります。

4

1 に答える 1

1

答えが見つかりました。Oracleは、パラメータが追加される順序を考慮します。戻り値は、 OracleCommandに追加される最初のパラメータである必要があります。

于 2013-01-15T23:42:15.497 に答える