尝试从 dotnet 调用 oracle 函数在返回值时出错
Trying to call oracle function from dotnet getting error while returning value
我正在尝试从 asp.net mvc 端调用 oracle 函数并 returning 一个值但出现错误“{"ORA-06502: PL/SQL: numeric or value error: character string buffer too small\nORA-06512: at line 1"}。
在 Oracle 端,我编写了一个 return 连接值的函数,然后在 dotnet 端,我正在检索该值。
Oracle 函数
CREATE OR REPLACE FUNCTION func_multi_val(PROD_DATE in varchar2)
RETURN varchar2
is
var_value varchar2(200);
x varchar2 (200);
cursor age_val is
SELECT AGE_CD,
decode(AGE_CD,'04','CL LINE(R','05','CR ','A',NULL,STAGE_DESC) STAGE_DESC ,
STAGE_SEQ
FROM DBPROD.PROD_AGE_MST
WHERE STAGE_SEQ < 15
AND STAGE_CD NOT IN ('ZA','05')
ORDER BY 3;
BEGIN
FOR i IN age_val LOOP
SELECT To_Char(Round(NVL(SUM(NVL(WF_PROD_WT, 0)), 0), 0))
INTO X
FROM DBPROD.Prod_age_wp_gs_cur
WHERE WF_DATE BETWEEN trunc(to_date(PROD_DATE,'dd-MM-YYYY')) AND trunc(to_date(OD_DATE,'dd-MM-YYYY')+1)
AND WF_STAGE_CD=i.AGE_CD;
var_value := var_value || X||'~';
END LOOP;
return var_value;
END;
Asp.net MVC
try
{
conn.Open();
OracleCommand command = new OracleCommand();
command.Connection = conn;
command.CommandText = "func_multi_val";
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("PROD_DATE", OracleDbType.Varchar2).Value = DateTime.Now.ToString("dd-MM-yyyy");
command.Parameters.Add("var_value", OracleDbType.Varchar2).Direction = ParameterDirection.ReturnValue;
command.ExecuteScalar();
object o = command.ExecuteScalar();
}
catch(Exception ex)
{
}
预期:连接值应该是 return 从 dotnet 的 Oracle 端检索。
Actual:Getting 绑定“{"ORA-06502: PL/SQL: numeric or value error: character string buffer too small\nORA-06512: at line 1"}”时 dotnet 端出错。任何想法都将不胜感激
VAR_VALUE
包含串联结果。如果它(结果)超过 200 个字符,它就不能放入 VARCHAR2(200)
变量中,因为 VAR_VALUE
是这样声明的。
因此,放大它。
另一种回答方式我只是从 oracle 查询中删除参数并使用 sysdate 函数而不是使用 PROD_DATE 变量
CREATE OR REPLACE FUNCTION func_multi_val
RETURN varchar2
is
var_value varchar2(200);
x varchar2 (200);
cursor age_val is
SELECT AGE_CD,
decode(AGE_CD,'04','CL LINE(R','05','CR ','A',NULL,STAGE_DESC) STAGE_DESC ,
STAGE_SEQ
FROM DBPROD.PROD_AGE_MST
WHERE STAGE_SEQ < 15
AND STAGE_CD NOT IN ('ZA','05')
ORDER BY 3;
BEGIN
FOR i IN age_val LOOP
SELECT To_Char(Round(NVL(SUM(NVL(WF_PROD_WT, 0)), 0), 0))
INTO X
FROM DBPROD.Prod_age_wp_gs_cur
WHERE PSWF_DATE BETWEEN sysdate AND sysdate+1
AND WF_STAGE_CD=i.AGE_CD;
var_value := var_value || X||'~';
END LOOP;
return var_value;
END;
在 dotnet 方面我做了以下修改
try
{
conn.Open();
OracleCommand command = new OracleCommand();
command.Connection = conn;
command.CommandText = "func_multi_val";
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("var_value", OracleDbType.Varchar2,200).Direction = ParameterDirection.ReturnValue;
command.ExecuteScalar();
object o = command.Parameters["var_value"].Value;
}
catch(Exception ex)
{
}
我正在尝试从 asp.net mvc 端调用 oracle 函数并 returning 一个值但出现错误“{"ORA-06502: PL/SQL: numeric or value error: character string buffer too small\nORA-06512: at line 1"}。
在 Oracle 端,我编写了一个 return 连接值的函数,然后在 dotnet 端,我正在检索该值。
Oracle 函数
CREATE OR REPLACE FUNCTION func_multi_val(PROD_DATE in varchar2)
RETURN varchar2
is
var_value varchar2(200);
x varchar2 (200);
cursor age_val is
SELECT AGE_CD,
decode(AGE_CD,'04','CL LINE(R','05','CR ','A',NULL,STAGE_DESC) STAGE_DESC ,
STAGE_SEQ
FROM DBPROD.PROD_AGE_MST
WHERE STAGE_SEQ < 15
AND STAGE_CD NOT IN ('ZA','05')
ORDER BY 3;
BEGIN
FOR i IN age_val LOOP
SELECT To_Char(Round(NVL(SUM(NVL(WF_PROD_WT, 0)), 0), 0))
INTO X
FROM DBPROD.Prod_age_wp_gs_cur
WHERE WF_DATE BETWEEN trunc(to_date(PROD_DATE,'dd-MM-YYYY')) AND trunc(to_date(OD_DATE,'dd-MM-YYYY')+1)
AND WF_STAGE_CD=i.AGE_CD;
var_value := var_value || X||'~';
END LOOP;
return var_value;
END;
Asp.net MVC
try
{
conn.Open();
OracleCommand command = new OracleCommand();
command.Connection = conn;
command.CommandText = "func_multi_val";
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("PROD_DATE", OracleDbType.Varchar2).Value = DateTime.Now.ToString("dd-MM-yyyy");
command.Parameters.Add("var_value", OracleDbType.Varchar2).Direction = ParameterDirection.ReturnValue;
command.ExecuteScalar();
object o = command.ExecuteScalar();
}
catch(Exception ex)
{
}
预期:连接值应该是 return 从 dotnet 的 Oracle 端检索。 Actual:Getting 绑定“{"ORA-06502: PL/SQL: numeric or value error: character string buffer too small\nORA-06512: at line 1"}”时 dotnet 端出错。任何想法都将不胜感激
VAR_VALUE
包含串联结果。如果它(结果)超过 200 个字符,它就不能放入 VARCHAR2(200)
变量中,因为 VAR_VALUE
是这样声明的。
因此,放大它。
另一种回答方式我只是从 oracle 查询中删除参数并使用 sysdate 函数而不是使用 PROD_DATE 变量
CREATE OR REPLACE FUNCTION func_multi_val
RETURN varchar2
is
var_value varchar2(200);
x varchar2 (200);
cursor age_val is
SELECT AGE_CD,
decode(AGE_CD,'04','CL LINE(R','05','CR ','A',NULL,STAGE_DESC) STAGE_DESC ,
STAGE_SEQ
FROM DBPROD.PROD_AGE_MST
WHERE STAGE_SEQ < 15
AND STAGE_CD NOT IN ('ZA','05')
ORDER BY 3;
BEGIN
FOR i IN age_val LOOP
SELECT To_Char(Round(NVL(SUM(NVL(WF_PROD_WT, 0)), 0), 0))
INTO X
FROM DBPROD.Prod_age_wp_gs_cur
WHERE PSWF_DATE BETWEEN sysdate AND sysdate+1
AND WF_STAGE_CD=i.AGE_CD;
var_value := var_value || X||'~';
END LOOP;
return var_value;
END;
在 dotnet 方面我做了以下修改
try
{
conn.Open();
OracleCommand command = new OracleCommand();
command.Connection = conn;
command.CommandText = "func_multi_val";
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add("var_value", OracleDbType.Varchar2,200).Direction = ParameterDirection.ReturnValue;
command.ExecuteScalar();
object o = command.Parameters["var_value"].Value;
}
catch(Exception ex)
{
}