使用参数 VB.NET 调用 Oracle 函数
Call an Oracle function with parameters with VB.NET
首先,我来自阿根廷,抱歉我的英语不好!
我在 Visual.NET 2010 年工作,我正在尝试调用 Oracle 程序包中的函数,但出现此错误:
PLS-00306: 调用 'FN_FINDPRONOSTICO'
时参数的数量或类型错误
这是包定义:
create or replace
PACKAGE PKG_HOME AS
TYPE CR_ESTACIONREFERENCIA IS REF CURSOR;
TYPE CR_PRONOSTICO IS REF CURSOR;
TYPE CR_ALERTA IS REF CURSOR;
TYPE CR_ESTADIOSPREDOMINANTESZONA IS REF CURSOR;
TYPE CR_VARIEDADES IS REF CURSOR;
--FUNCTIONS
FUNCTION FN_FINDESTACIONREFERENCIA(PR_IDZONAFENO IN NUMERIC) RETURN CR_ESTACIONREFERENCIA;
FUNCTION FN_FINDPRONOSTICO(PR_IDESTACION IN NUMERIC) RETURN CR_PRONOSTICO;
FUNCTION FN_FINDALERTAMETEO(PR_IDESTACION IN NUMERIC) RETURN CR_ALERTA;
FUNCTION FN_FINDALERTAPLAGA(PR_IDZONAFENO IN NUMERIC) RETURN CR_ALERTA;
FUNCTION FN_FINDALERTAENFERMEDAD(PR_IDZONAFENO IN NUMERIC) RETURN CR_ALERTA;
PROCEDURE SP_ESTFENOPREDZONAVAR(pFechaDesde IN DATE, pFechaHasta IN DATE,pIdZona IN NUMBER ,pIdVariedad IN NUMBER);
FUNCTION FN_ESTADIOSFENOPREDZONA(pIdZona IN NUMBER) RETURN CR_ESTADIOSPREDOMINANTESZONA;
END;
这是 VB.NET
中的代码
Dim cmd As New OracleCommand("FRUTIC.PKG_HOME.FN_FINDPRONOSTICO", OraConn)
cmd.CommandType = CommandType.StoredProcedure
cmd.BindByName = True
Dim oparam0 As OracleParameter = cmd.Parameters.Add("PR_IDESTACION", OracleDbType.Int64)
oparam0.Value = 65
oparam0.Direction = ParameterDirection.Input
Dim oparam1 As OracleParameter = cmd.Parameters.Add("CR_PRONOSTICO", OracleDbType.RefCursor)
oparam1.Direction = ParameterDirection.Output
Dim reader As OracleDataReader
reader = cmd.ExecuteReader()
Do While reader.Read()
Dim obj As Object
obj = reader.GetValue(0)
Loop
如果我在 Oracle SQL Developer 中 运行 这个 SQL 语句(SELECT FRUTIC.PKG_HOME.FN_FINDPRONOSTICO(65) FROM DUAL),它 returns 结果正确。
问题出在哪里?
非常感谢您!
来自阿根廷的问候,卢卡斯
这是错误的:
Dim oparam1 As OracleParameter = cmd.Parameters.Add("CR_PRONOSTICO", OracleDbType.RefCursor)
oparam1.Direction = ParameterDirection.Output
一定是这样的:
Dim oparam1 As OracleParameter = cmd.Parameters.Add("CR_PRONOSTICO", OracleDbType.RefCursor)
oparam1.Direction = ParameterDirection.ReturnValue
也许您必须使用 "ReturnValue" 而不是 "Output"。这样做:
Dim oparam0 As OracleParameter = cmd.Parameters.Add("PR_IDESTACION", OracleDbType.Int64)
oparam0.Value = 65
oparam0.Direction = ParameterDirection.Input
Dim oparam1 As OracleParameter = cmd.Parameters.Add("CR_PRONOSTICO", OracleDbType.RefCursor)
oparam1.Direction = ParameterDirection.**ReturnValue**
首先,我来自阿根廷,抱歉我的英语不好!
我在 Visual.NET 2010 年工作,我正在尝试调用 Oracle 程序包中的函数,但出现此错误:
PLS-00306: 调用 'FN_FINDPRONOSTICO'
时参数的数量或类型错误这是包定义:
create or replace
PACKAGE PKG_HOME AS
TYPE CR_ESTACIONREFERENCIA IS REF CURSOR;
TYPE CR_PRONOSTICO IS REF CURSOR;
TYPE CR_ALERTA IS REF CURSOR;
TYPE CR_ESTADIOSPREDOMINANTESZONA IS REF CURSOR;
TYPE CR_VARIEDADES IS REF CURSOR;
--FUNCTIONS
FUNCTION FN_FINDESTACIONREFERENCIA(PR_IDZONAFENO IN NUMERIC) RETURN CR_ESTACIONREFERENCIA;
FUNCTION FN_FINDPRONOSTICO(PR_IDESTACION IN NUMERIC) RETURN CR_PRONOSTICO;
FUNCTION FN_FINDALERTAMETEO(PR_IDESTACION IN NUMERIC) RETURN CR_ALERTA;
FUNCTION FN_FINDALERTAPLAGA(PR_IDZONAFENO IN NUMERIC) RETURN CR_ALERTA;
FUNCTION FN_FINDALERTAENFERMEDAD(PR_IDZONAFENO IN NUMERIC) RETURN CR_ALERTA;
PROCEDURE SP_ESTFENOPREDZONAVAR(pFechaDesde IN DATE, pFechaHasta IN DATE,pIdZona IN NUMBER ,pIdVariedad IN NUMBER);
FUNCTION FN_ESTADIOSFENOPREDZONA(pIdZona IN NUMBER) RETURN CR_ESTADIOSPREDOMINANTESZONA;
END;
这是 VB.NET
中的代码Dim cmd As New OracleCommand("FRUTIC.PKG_HOME.FN_FINDPRONOSTICO", OraConn)
cmd.CommandType = CommandType.StoredProcedure
cmd.BindByName = True
Dim oparam0 As OracleParameter = cmd.Parameters.Add("PR_IDESTACION", OracleDbType.Int64)
oparam0.Value = 65
oparam0.Direction = ParameterDirection.Input
Dim oparam1 As OracleParameter = cmd.Parameters.Add("CR_PRONOSTICO", OracleDbType.RefCursor)
oparam1.Direction = ParameterDirection.Output
Dim reader As OracleDataReader
reader = cmd.ExecuteReader()
Do While reader.Read()
Dim obj As Object
obj = reader.GetValue(0)
Loop
如果我在 Oracle SQL Developer 中 运行 这个 SQL 语句(SELECT FRUTIC.PKG_HOME.FN_FINDPRONOSTICO(65) FROM DUAL),它 returns 结果正确。
问题出在哪里?
非常感谢您! 来自阿根廷的问候,卢卡斯
这是错误的:
Dim oparam1 As OracleParameter = cmd.Parameters.Add("CR_PRONOSTICO", OracleDbType.RefCursor)
oparam1.Direction = ParameterDirection.Output
一定是这样的:
Dim oparam1 As OracleParameter = cmd.Parameters.Add("CR_PRONOSTICO", OracleDbType.RefCursor)
oparam1.Direction = ParameterDirection.ReturnValue
也许您必须使用 "ReturnValue" 而不是 "Output"。这样做:
Dim oparam0 As OracleParameter = cmd.Parameters.Add("PR_IDESTACION", OracleDbType.Int64)
oparam0.Value = 65
oparam0.Direction = ParameterDirection.Input
Dim oparam1 As OracleParameter = cmd.Parameters.Add("CR_PRONOSTICO", OracleDbType.RefCursor)
oparam1.Direction = ParameterDirection.**ReturnValue**