摘要:[ORACLE][ODP.NET] 執行 Procedure
執行 Procedure 時失敗,傳回錯誤訊息 "ORA-06502: PL/SQL: numeric or value error: character string buffer too small"
是由於 OUT 的參數是以 Value 方式處理,導致Oracle.DataAccess無法執行,有兩種方式可以解決:
(1) 在 Procedure 的 OUT 參數使用 NOCOPY,以 Reference 方式處理,
EX:
PROCEDURE MyProcedure(PARAM1 IN VARCHAR2,
PARAM2 OUT NUMBER,
PARAM3 OUT NOCOPY VARCHAR2)
Reference:
PL/SQL NOCOPY Tips
Using the NOCOPY Hint
(2) 在 .NET 產生 OracleParameter 時,多加入 size 參數,
EX:
OracleParameter param1 = new OracleParameter("param1 ", OracleDbType.Varchar2, 100);
Reference:
"ORA-06502: PL/SQL..."
Sample Code:
using Oracle.DataAccess.Client;
OracleCommand cmd;
String connectionString = "....";
OracleConnection con = new OracleConnection(connectionString);
OracleParameter param1 = new OracleParameter("param1 ", OracleDbType.Varchar2, 100);
OracleParameter param2 = new OracleParameter("param2 ", OracleDbType.Decimal);
OracleParameter param3 = new OracleParameter("param3 ", OracleDbType.Varchar2, 100);
con.Open();
cmd = con.CreateCommand();
cmd.Connection = con;
cmd.CommandText = MyProcedure";
cmd.CommandType = CommandType.StoredProcedure;
param1.Direction = ParameterDirection.Input;
param2.Direction = ParameterDirection.Output;
param3.Direction = ParameterDirection.Output;
cmd.Parameters.Add(param1);
cmd.Parameters.Add(param2);
cmd.Parameters.Add(param3);
cmd.Parameters["param1"].Value = "param1";
int affected = cmd.ExecuteNonQuery();
Decimal p2 = Convert.ToDecimal(cmd.Parameters["param2"].Value.ToString());
string p3 = Convert.ToDecimal(cmd.Parameters["param3"].Value.ToString());
cmd.Dispose();
con.Close();
Oracle.DataAccess.Client.OracleConnection.ClearPool(con);