Error calling a function of Oracle

Discussion of open issues, suggestions and bugs regarding ADO.NET provider for Oracle
Post Reply
Susana

Error calling a function of Oracle

Post by Susana » Tue 11 Oct 2005 14:30

hello:

When I call a function of Oracle with parameters array object, oraDirect .NET shows me different errors. Why?

I send us script.

Thanks,

Susana


type EQA.t_reg_error is object (
codigo_error varchar2(10),
codigo_campo varchar2(10),
valor_campo varchar2(100),
vip varchar2(15)
)

type EQA.t_reg_bebe is object (
nombre varchar2 (40),
apellido_principal varchar2 (30),
apellido_secundario varchar2 (30),
fecha_nacimiento date,
sexo char (1),
nacimiento_futuro char (1)
)

type EQA.t_reg_operacion is object (
fecha_operacion date,
tipo_operacion char(1),
origen varchar2(10),
codigo_linea number(2),
codigo_accion number(5),
codigo_ocurrencia number(3),
codigo_plantilla number(2),
codigo_proveedor varchar2(15),
codigo_aa number(8),
email varchar2(50)
)

CREATE OR REPLACE TYPE EQA.T_TAB_BEBE AS
TABLE OF T_REG_BEBE



package body EQA.cop00004
as

function alta_modif_bebes (
reg_operacion in t_reg_operacion,
p_num_bebes in number,
tab_bebes in t_tab_bebe)
return t_reg_error
is
exception_error exception;
v_reg_error t_reg_error:=t_reg_error(null,null,null,null);
v_error mdp30110.reg_error;
v_codigo_fichero trabajo_cabecera.codigo_fichero%type;
v_numero_proceso resultado_procesos.numero_proceso%type;
v_estado resultado_procesos.estado%type;
v_nombre_fichero varchar2 (100);
begin

/*
...
*/
return v_reg_error;
exception
when exception_error
then
insert into historico_rechazos_online
(codigo_proceso,
codigo_rechazo,
codigo_campo,
valor_campo,
fecha_rechazo,
codigo_consumidora,
codigo_proveedor)
values ('ALTA_BEBE',
v_reg_error.codigo_error,
v_reg_error.codigo_campo,
v_reg_error.valor_campo,
sysdate,
reg_operacion.codigo_aa,
reg_operacion.codigo_proveedor);

commit;
return v_reg_error;
end;

end cop00004;


--------------------------------------------------------------------------------------

_
Public Function AltaModifBebes(ByVal reg_operacion As t_reg_operacion, ByVal p_num_bebes As Integer, ByVal tab_bebes() As t_reg_bebe) As t_reg_error
Dim oCon As New OracleConnection
Dim oCommand As New OracleCommand
Dim oResult As t_reg_error
oCon.ConnectionString = System.Configuration.ConfigurationSettings.AppSettings("ConnectionString").ToString()
Try
oCon.Open()
oCommand.Connection = oCon
oCommand.CommandType = CommandType.StoredProcedure
oCommand.CommandText = "EQA.COP00004.ALTA_MODIF_BEBES"

oCommand.CreateParameters()

Dim poOperacion As OracleObject = New OracleObject("EQA.T_REG_OPERACION", oCon)
With reg_operacion
poOperacion("FECHA_OPERACION") = .fecha_operacion
poOperacion("ORIGEN") = .origen
poOperacion("TIPO_OPERACION") = .tipo_operacion
poOperacion("CODIGO_LINEA") = .codigo_linea
poOperacion("CODIGO_ACCION") = .codigo_accion
poOperacion("CODIGO_OCURRENCIA") = .codigo_ocurrencia
poOperacion("CODIGO_PLANTILLA") = .codigo_plantilla
poOperacion("CODIGO_PROVEEDOR") = .codigo_proveedor
If .codigo_aa 0 Then
poOperacion("CODIGO_AA") = .codigo_aa
End If
poOperacion("EMAIL") = .email
End With
oCommand.Parameters("REG_OPERACION").Value = poOperacion

oCommand.Parameters("P_NUM_BEBES").Value = p_num_bebes

Dim poBebes() As OracleObject

Dim i As Integer = 0
While i < tab_bebes.Length
With tab_bebes(i)
Dim poBebe As OracleObject = New OracleObject("EQA.T_REG_BEBE", oCon)
poBebe("APELLIDO_PRINCIPAL") = .apellido_principal
poBebe("APELLIDO_SECUNDARIO") = .apellido_secundario
poBebe("FECHA_NACIMIENTO") = .fecha_nacimiento
poBebe("NACIMIENTO_FUTURO") = .nacimiento_futuro
poBebe("NOMBRE") = .nombre
poBebe("SEXO") = .sexo
ReDim Preserve poBebes(i)
poBebes(i) = New OracleObject("EQA.T_REG_BEBE", oCon)
poBebes(i) = poBebe
i += 1
End With
End While

oCommand.Parameters("TAB_BEBES").Value = poBebes

Dim myReturParam As OracleObject = New OracleObject("EQA.T_REG_ERROR", oCon)

Dim iRes As Integer = oCommand.ExecuteNonQuery()
myReturParam = CType(oCommand.Parameters("RESULT").Value, OracleObject)
'Rellenamos el objeto oResult con el valor devuelto de la función
oResult.codigo_campo = IIf(IsDBNull(myReturParam("CODIGO_CAMPO")), "", myReturParam("CODIGO_CAMPO"))
oResult.valor_campo = IIf(IsDBNull(myReturParam("VALOR_CAMPO")), "", myReturParam("VALOR_CAMPO"))
oResult.codigo_error = IIf(IsDBNull(myReturParam("CODIGO_ERROR")), "", myReturParam("CODIGO_ERROR"))
oResult.vip = IIf(IsDBNull(myReturParam("VIP")), "", myReturParam("VIP"))

Catch ex As FormatException
oResult.codigo_error = ex.Message
Catch ex As Exception
oResult.codigo_error = ex.Message
Finally
If Not oCommand Is Nothing Then oCommand.Dispose()
If Not oCon Is Nothing Then
If oCon.State = ConnectionState.Open Then oCon.Close()
oCon.Dispose()
End If
End Try
Return oResult
End Function
--------------------------------------------------------------------------------------

ERRORS
Message "ORA-59444: Message 59444 not found; product=RDBMS; facility=ORA"
Message "ORA-10420: Message 10420 not found; product=RDBMS; facility=ORA"
Message "ORA-43420: Message 43420 not found; product=RDBMS; facility=ORA"

TRACE
StackTrace " at CoreLab.Oracle.OracleCommand.a(CommandBehavior A_0, IDisposable A_1, Int32 A_2, Int32 A_3)
at CoreLab.Common.DbCommandBase.b(CommandBehavior A_0)
at CoreLab.Common.DbCommand.ExecuteReader()
at CoreLab.Common.DbCommandBase.ExecuteNonQuery()
at WSOraDirect.WSOraDirect.AltaModifBebes(t_reg_operacion reg_operacion, Int32 p_num_bebes, t_reg_bebe[] tab_bebes) in C:\Inetpub\wwwroot\WSOraDirect\ServiceOraDirect.asmx.vb:line 199"

Paul
Posts: 725
Joined: Thu 28 Oct 2004 14:06

Post by Paul » Wed 12 Oct 2005 07:20

You must create OracleTable object for TAB_BEBES parameter. Please use the following code.

Code: Select all

      Dim poBebes As OracleTable = New OracleTable("T_TAB_BEBE", oCon)

      Dim i As Integer = 0
      While i < tab_bebes.Length
        With tab_bebes(i)
          Dim poBebe As OracleObject = New OracleObject("T_REG_BEBE", oCon)
            poBebe("APELLIDO_PRINCIPAL") = .apellido_principal 
            poBebe("APELLIDO_SECUNDARIO") = .apellido_secundario 
            poBebe("FECHA_NACIMIENTO") = .fecha_nacimiento 
            poBebe("NACIMIENTO_FUTURO") = .nacimiento_futuro 
            poBebe("NOMBRE") = .nombre 
            poBebe("SEXO") = .sexo 
            poBebes.Add(poBebe)
            i += 1
        End With
      End While

Susana

Error calling a function of Oracle

Post by Susana » Fri 14 Oct 2005 10:45

Hello:

Now, I create an OracleTable object and I get call the function, but the parameter OracleTable arrives emptiness, with zero elements.
Why?

Thanks you,
Susana

Paul
Posts: 725
Joined: Thu 28 Oct 2004 14:06

Post by Paul » Tue 18 Oct 2005 08:38

You should specify correct OracleDbType for all object parameters
oCommand.Parameters("TAB_BEBES").OracleDbType = OracleDbType.Table

Post Reply