我有这个存储过程:
CREATE OR REPLACE PROCEDURE "LIQUIDACION_OBTENER" (
p_Cuenta IN NUMBER,
p_Fecha IN DATE,
p_Detalle OUT LIQUIDACION.FILADETALLE%TYPE
) IS
BEGIN
SELECT FILADETALLE
INTO p_Detalle
FROM Liquidacion
WHERE (FILACUENTA = p_Cuenta)
AND (FILAFECHA = p_Fecha);
END;
/
...和我的c#代码:
string liquidacion = string.Empty;
OracleCommand command = new OracleCommand("Liquidacion_Obtener");
command.BindByName = true;
command.Parameters.Add(new OracleParameter("p_Cuenta", OracleDbType.Int64));
command.Parameters["p_Cuenta"].Value = cuenta;
command.Parameters.Add(new OracleParameter("p_Fecha", OracleDbType.Date));
command.Parameters["p_Fecha"].Value = fecha;
command.Parameters.Add("p_Detalle", OracleDbType.Varchar2, ParameterDirection.Output);
OracleConnectionHolder connection = null;
connection = this.GetConnection();
command.Connection = connection.Connection;
command.CommandTimeout = 30;
command.CommandType = CommandType.StoredProcedure;
OracleDataReader lector = command.ExecuteReader();
while (lector.Read())
{
liquidacion += ((OracleString)command.Parameters["p_Detalle"].Value).Value;
}
当我尝试将值放入参数“Fecha”(即日期)时,代码会给我这个错误(当行command.ExecuteReader();
被执行时)
Oracle.DataAccess.Client.OracleException : ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SYSTEM.LIQUIDACION_OBTENER", line 9
ORA-06512: at line 1
我尝试使用日期时间而不是问题,我曾经尝试过没有输入参数和输出,但仍然得到了相同的错误。显然问题在于输出参数。 我已经尝试将p_Detalle OUT VARCHAR2而不是p_Detalle OUT LIQUIDACION.FILADETALLE%TYPE但是它无法正常工作
我希望我的帖子是可以理解的.. 感谢!!!!!!!!!!
答案 0 :(得分:2)
来自:
的输出是什么DESC LIQUIDACION
你有的out参数表示法是正确的:
p_Detalle OUT LIQUIDACION.FILADETALLE%TYPE
...在将Oracle数据类型转换为.NET兄弟时,将问题留在C#代码中。我以前见过它,当使用Java时......
如果LIQUIDACION.filafecha
的数据类型是VARCHAR2 / etc(不是DATE),请使用:
SELECT la.filadeetaile
INTO p_Detalle
FROM LIQUIDACION la
WHERE la.filacuenta = p_Cuenta
AND la.filafecha = TO_CHAR(p_Fecha, 'YYYY-MON-DD');
...或者您可以更改参数以匹配数据类型:
p_Fecha IN LIQUIDACION.filafecha%TYPE
...并更正C#代码以传递正确的信息。
理想情况下,日期列应为DATE数据类型...
答案 1 :(得分:0)
设置参数时尝试使用to_date(p_fecha,'yyyy-mmm-dd'):
command.Parameters["p_Fecha"].Value = to_date(fecha, 'yyyy-MON-dd');
答案 2 :(得分:0)
可能......这可能是问题所在。尝试使用Oracle to_date函数来匹配日期格式。
如果这不起作用,作为最后的手段将参数更改为varchar并将日期作为字符串传递给存储过程。在Oracle内部使用to_date。
这样你的存储过程就是:
CREATE OR REPLACE PROCEDURE "LIQUIDACION_OBTENER" (
p_Cuenta IN NUMBER,
p_Fecha IN VARCHAR,
p_Detalle OUT LIQUIDACION.FILADETALLE%TYPE
) IS
BEGIN
SELECT
FILADETALLE
INTO
p_Detalle
FROM
Liquidacion
WHERE
(FILACUENTA = p_Cuenta)
AND (FILAFECHA = to_date(p_Fecha, 'yyyy-MON-dd'));
END;
答案 3 :(得分:0)
您似乎没有定义输出参数的大小:
command.Parameters.Add("p_Detalle", OracleDbType.Varchar2, ParameterDirection.Output);
我不知道ADO默认的是什么,但它明显小于LIQUIDACION.FILADETALLE%TYPE
的长度。当接收变量太小或数据类型错误时,Oracle会抛出ORA-06502。尝试类似(调整大小以匹配数据库列定义):
command.Parameters["p_Detalle"].Size = 20;