DB (Oracle 11g)에서 저장 프로 시저를 호출하는 ASP.NET 웹 서비스가 있습니다. 문제는 빈 문자열이 매개 변수 중 하나로 전달 될 때마다 프로 시저 호출이 끊어지는 것입니다. ORA-01084 오류가 표시됩니다.이 오류는 프로 시저가 실제로 실행되기 전에 호출이 실패했음을 나타냅니다. 여기 asp.net에서 Null/empty 문자열을 Oracle 저장 프로 시저에 전달
이 절차의 마이너스 내가 믿는 몇 가지 논리가되지 관련 : 여기PROCEDURE CreateReport
(
from_dt IN NVARCHAR2,
to_dt IN NVARCHAR2,
p_table_id IN NVARCHAR2,
p_column_id IN NVARCHAR2,
device_name IN NVARCHAR2,
ret_cursor OUT t_cursor
)
AS
v_cursor t_cursor;
dateStr NVARCHAR2(200);
sqlStmt VARCHAR2(10000);
extraColumns NVARCHAR2(10000);
BEGIN
/* SNIP Cut logic that builds the query statement based on inputs */
OPEN v_cursor FOR sqlStmt;
ret_cursor := v_cursor;
END CreateReport;
웹 서비스에서
CreateReport
의 호출입니다 :
public DataSet CreateReport(string fromDt, string toDate, string tableNames,
string columnNames, string deviceName)
{
DataSet dataSet;
string fmDateStr = String.IsNullOrEmpty(fromDt) ? String.Empty : fromDt.Trim();
string toDateStr = String.IsNullOrEmpty(toDate) ? String.Empty : toDate.Trim();
OracleCommand oleDBCmd = new OracleCommand();
oleDBCmd.CommandType = CommandType.StoredProcedure;
oleDBCmd.CommandText = "Web_Pkg.CreateReport";
oleDBCmd.Parameters.Add(new OracleParameter("from_dt", OracleType.NVarChar));
oleDBCmd.Parameters["from_dt"].Value = fmDateStr;
oleDBCmd.Parameters["from_dt"].Direction = ParameterDirection.Input;
oleDBCmd.Parameters.Add(new OracleParameter("to_dt", OracleType.NVarChar));
oleDBCmd.Parameters["to_dt"].Value = toDateStr;
oleDBCmd.Parameters["to_dt"].Direction = ParameterDirection.Input;
oleDBCmd.Parameters.Add(new OracleParameter("p_table_id", OracleType.NVarChar));
oleDBCmd.Parameters["p_table_id"].Value = tableNames;
oleDBCmd.Parameters["p_table_id"].Direction = ParameterDirection.Input;
oleDBCmd.Parameters.Add(new OracleParameter("p_column_id", OracleType.LongVarChar));
oleDBCmd.Parameters["p_column_id"].Value = columnNames;
oleDBCmd.Parameters["p_column_id"].Direction = ParameterDirection.Input;
oleDBCmd.Parameters.Add(new OracleParameter("device_name", OracleType.LongVarChar));
oleDBCmd.Parameters["device_name"].Value = deviceName;
oleDBCmd.Parameters["device_name"].Direction = ParameterDirection.Input;
oleDBCmd.Parameters.Add(new OracleParameter("ret_cursor", OracleType.Cursor));
oleDBCmd.Parameters["ret_cursor"].Direction = ParameterDirection.Output;
try
{
// Throws exception if any of the paramters are String.Emtpy
dataSet = DB.SQLSelect(oleDBCmd, connStr);
}
catch (Exception exp)
{
return null;
}
finally
{
if (oleDBCmd != null)
{
oleDBCmd.Dispose();
}
}
return dataSet;
}
실험으로, 나는 웹을 수정 서비스는 빈 문자열이 아닌 null
을 전달합니다. null
이 전달되면 'CREATEREPORT'에 대한 호출에서 잘못된 숫자 또는 인수 유형을 나타내는 오류가 표시됩니다.
DBNull.Value
를 통과했지만, 그 오류
Parameter 'p_column_id': No size set for variable length data type: String.
결과 (물론, p_column_id이 경우 빈 매개 변수를했다).
그럼 어떻게 빈 문자열을 매개 변수로 저장 프로 시저에 성공적으로 전달할 수 있습니까? 확실히 p_column_id 매개 변수를 비워 둘 수 있습니다.
대 NVARCHAR을 확인 그것은 참으로 형식이 일치했다. device_name 및 p_column_id 매개 변수가 웹 서비스에서 잘못된 유형을 사용 중입니다. 그것들은 OracleType.LongVarChar이지만 OracleType.NVarChar 여야합니다. 감사! – Odrade