查找綁定儲存過程參數的參數名稱
出於單元測試的目的,我試圖通過使用名稱綁定的參數來呼叫該
DBMS_OUTPUT.PUT_LINE
過程。c#
由於這個DBMS_OUTPUT
包似乎是 Oracle 數據庫的標準,所以我用它來測試我編寫的程式碼。我已經能夠
DBMS_OUTPUT.ENABLE
在OraleCommand.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_OUTPUT
item
的 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
值
SYS
、DBMS_OUTPUT
和PUT_LINE
可以替換為您要查找的儲存過程的值。