Stored-Procedures

查找綁定儲存過程參數的參數名稱

  • September 19, 2014

出於單元測試的目的,我試圖通過使用名稱綁定的參數來呼叫該DBMS_OUTPUT.PUT_LINE過程。c#由於這個DBMS_OUTPUT包似乎是 Oracle 數據庫的標準,所以我用它來測試我編寫的程式碼。

我已經能夠DBMS_OUTPUT.ENABLEOraleCommand.BindByName標誌設置為的情況下成功呼叫true。但是,這是在不傳遞任何參數的情況下呼叫的。我還能夠通過傳遞一個按名稱綁定的引用游標來呼叫我自己創建的儲存過程。

當我嘗試以DBMS_OUTPUT.PUT_LINE類似方式撥打電話時,我收到以下消息:

錯誤詳情

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

我根據DBMS_OUTPUTitem的 10g 文件中定義過程的方式為參數指定綁定名稱。參數類型被定義為,即傳遞給過程的類型。當我將標誌設置為 false 時,我可以毫無問題地撥打電話。 item``VARCHAR2``OracleCommand.BindByName``DBMS_OUTPUT.PUT_LINE

這是我用來執行查詢的程式碼:

public bool ExecuteQuery(string procedureName, string[,] queryParameters, bool useReferenceCursor = false)
{
   bool returnStatus = false;

   if (ConnectionStatus() == false)
   {
       //message database connection was interrupted
       return false;
   }

   OracleCommand cmd = new OracleCommand();
   cmd.CommandText = procedureName;
   cmd.CommandType = CommandType.StoredProcedure;
   cmd.BindByName = true;

   cmd.Connection = databaseConnection;

   if (useReferenceCursor)
   {
       cmd.Parameters.Add("output_reference_cursor", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
   }

   for (int parameterSet = 0; parameterSet < queryParameters.GetLength(0); parameterSet++)
   {
       cmd.Parameters.Add(
           queryParameters[parameterSet, 0],
           OracleDbType.Varchar2,
           256,
           queryParameters[parameterSet, 1],
           ParameterDirection.Input
       );
   }

   if (ConnectionStatus() == false)
   {
       //message database connection was interrupted
       return false;
   }

   try
   {
       queryDataReader = cmd.ExecuteReader();
       queryHasRows = queryDataReader.HasRows;
       returnStatus = true;
   }
   catch (Oracle.DataAccess.Client.OracleException error)
   {
       switch (error.Number)
       {
           case 6550:
               Console.WriteLine("The stored procedure specified doesn't exist.");
               DatabaseErrorMessage("The stored procedure doesn't exist. Make sure that the procedure has been properly compiled and that the names match.");
               break;
           default:
               throw error;
       }
       Console.WriteLine(error.ToString());
       queryHasRows = false;
       returnStatus = false;
   }

   return returnStatus;
}

僅供參考,我們決定將所有參數傳遞給我們編寫的過程,OracleDbType.Varchar2並在我們定義的儲存過程中執行類型轉換。唯一的例外是引用游標。我也使用 OracleODP.net進行訪問,因為 Microsoft 的等效版本已過時。

任何回饋或建議將不勝感激。

我做了更多的研究,找到了問題的答案。

即使第一個參數在 DBMS_OUTPUT 的 10g 文件中DBMS_OUTPUT.PUT_LINE列出item。參數的實際名稱是A。您需要使用 綁定名稱DBMS_OUTPUT.PUT_LINE(A => 'random text')

可以使用以下查詢發現儲存過程的實際參數名稱:

SELECT 
   argument_name, 
   in_out, 
   data_type 
FROM 
   all_arguments 
WHERE 
   owner = 'SYS' --owner for said procedure
   AND package_name = 'DBMS_OUTPUT' --if procedure is in a package that name, null otherwise
   AND object_name = 'PUT_LINE' --procedure name

SYSDBMS_OUTPUTPUT_LINE可以替換為您要查找的儲存過程的值。

引用自:https://dba.stackexchange.com/questions/76770