Oracleストアドプロシージャの呼び出しに数時間を費やしましたが、私の努力はすべて失敗しました。Entity FrameworkとODACを使用したOracleストアドプロシージャの呼び出し:「不正な変数名/番号」
これは、Oracleパッケージヘッダである:一方
create or replace PACKAGE pqte_transacciones AS
PROCEDURE pr_creapedido
(
var_cliente IN NUMBER,
var_usuario IN NUMBER,
var_observacion IN VARCHAR2,
var_preciotot IN VARCHAR2,
var_fechaent IN VARCHAR2,
var_horaent IN VARCHAR2,
var_fpago IN VARCHAR2,
var_motivop IN NUMBER,
var_conser_pre IN NUMBER,
var_tipo_pedido IN VARCHAR2,
i_estado IN NUMBER,
var_tipofrustrado IN VARCHAR2,
var_cuotas IN NUMBER,
var_tventa IN VARCHAR2,
var_producto1 IN VARCHAR2,
var_cantidad1 IN NUMBER,
var_valoruni1 IN NUMBER,
var_porcini1 IN VARCHAR2,
var_porclle1 IN VARCHAR2,
var_producto2 IN VARCHAR2,
var_cantidad2 IN NUMBER,
var_valoruni2 IN NUMBER,
var_porcini2 IN VARCHAR2,
var_porclle2 IN VARCHAR2,
var_producto3 IN VARCHAR2,
var_cantidad3 IN NUMBER,
var_valoruni3 IN NUMBER,
var_porcini3 IN VARCHAR2,
var_porclle3 IN VARCHAR2,
var_producto4 IN VARCHAR2,
var_cantidad4 IN NUMBER,
var_valoruni4 IN NUMBER,
var_porcini4 IN VARCHAR2,
var_porclle4 IN VARCHAR2,
var_producto5 IN VARCHAR2,
var_cantidad5 IN NUMBER,
var_valoruni5 IN NUMBER,
var_porcini5 IN VARCHAR2,
var_porclle5 IN VARCHAR2,
var_producto6 IN VARCHAR2,
var_cantidad6 IN NUMBER,
var_valoruni6 IN NUMBER,
var_porcini6 IN VARCHAR2,
var_porclle6 IN VARCHAR2,
var_producto7 IN VARCHAR2,
var_cantidad7 IN NUMBER,
var_valoruni7 IN NUMBER,
var_porcini7 IN VARCHAR2,
var_porclle7 IN VARCHAR2,
var_producto8 IN VARCHAR2,
var_cantidad8 IN NUMBER,
var_valoruni8 IN NUMBER,
var_porcini8 IN VARCHAR2,
var_porclle8 IN VARCHAR2,
var_producto9 IN VARCHAR2,
var_cantidad9 IN NUMBER,
var_valoruni9 IN NUMBER,
var_porcini9 IN VARCHAR2,
var_porclle9 IN VARCHAR2,
var_producto10 IN VARCHAR2,
var_cantidad10 IN NUMBER,
var_valoruni10 IN NUMBER,
var_porcini10 IN VARCHAR2,
var_porclle10 IN VARCHAR2,
var_producto11 IN VARCHAR2,
var_cantidad11 IN NUMBER,
var_valoruni11 IN NUMBER,
var_porcini11 IN VARCHAR2,
var_porclle11 IN VARCHAR2,
var_producto12 IN VARCHAR2,
var_cantidad12 IN NUMBER,
var_valoruni12 IN NUMBER,
var_porcini12 IN VARCHAR2,
var_porclle12 IN VARCHAR2,
var_producto13 IN VARCHAR2,
var_cantidad13 IN NUMBER,
var_valoruni13 IN NUMBER,
var_porcini13 IN VARCHAR2,
var_porclle13 IN VARCHAR2,
var_producto14 IN VARCHAR2,
var_cantidad14 IN NUMBER,
var_valoruni14 IN NUMBER,
var_porcini14 IN VARCHAR2,
var_porclle14 IN VARCHAR2,
var_producto15 IN VARCHAR2,
var_cantidad15 IN NUMBER,
var_valoruni15 IN NUMBER,
var_porcini15 IN VARCHAR2,
var_porclle15 IN VARCHAR2,
var_medio_pago IN NUMBER,
var_orden_compra IN VARCHAR2,
var_ped_obs_sap IN VARCHAR2,
PEDIDO OUT NUMBER
);
end;
、これは、私はC#(これはOracleパラメータを作成し、実際の呼び出しを行う、完全な方法である)にしようとしている呼び出しです:
public static decimal CreaPedido(decimal clienteID, decimal usuarioID, double valorTotal, string fechaeEntrega, string horaEntrega,
string formaPago, int medioPago, string ordenCompra,
Producto[] productos)
{
decimal nuevoPedido = 0;
try
{
using (LipigasEntities db = new LipigasEntities())
{
((System.Data.Entity.Infrastructure.IObjectContextAdapter)db).ObjectContext.Connection.Open();
OracleParameter var_cliente = new OracleParameter("var_cliente", OracleDbType.Decimal);
var_cliente.Direction = System.Data.ParameterDirection.Input; var_cliente.Value = clienteID;
OracleParameter var_usuario = new OracleParameter("var_usuario", OracleDbType.Decimal);
var_usuario.Direction = System.Data.ParameterDirection.Input; var_usuario.Value = usuarioID;
OracleParameter var_observacion = new OracleParameter("var_observacion", OracleDbType.Varchar2);
var_observacion.Direction = System.Data.ParameterDirection.Input; var_observacion.Value = String.Empty;
OracleParameter var_preciotot = new OracleParameter("var_preciotot", OracleDbType.Varchar2);
var_preciotot.Direction = System.Data.ParameterDirection.Input; var_preciotot.Value = valorTotal.ToString();
OracleParameter var_fechaent = new OracleParameter("var_fechaent", OracleDbType.Varchar2);
var_fechaent.Direction = System.Data.ParameterDirection.Input; var_fechaent.Value = fechaeEntrega;
OracleParameter var_horaent = new OracleParameter("var_horaent", OracleDbType.Varchar2);
var_horaent.Direction = System.Data.ParameterDirection.Input; var_horaent.Value = horaEntrega;
OracleParameter var_fpago = new OracleParameter("var_fpago", OracleDbType.Varchar2);
var_fpago.Direction = System.Data.ParameterDirection.Input; var_fpago.Value = formaPago;
OracleParameter var_motivop = new OracleParameter("var_motivop", OracleDbType.Int32);
var_motivop.Direction = System.Data.ParameterDirection.Input; var_motivop.Value = (int)Constants.Motivos.SinInformacion;
OracleParameter var_conser_pre = new OracleParameter("var_conser_pre", OracleDbType.Int32);
var_conser_pre.Direction = System.Data.ParameterDirection.Input; var_conser_pre.Value = 0;
OracleParameter var_tipo_pedido = new OracleParameter("var_tipo_pedido", OracleDbType.Varchar2);
var_tipo_pedido.Direction = System.Data.ParameterDirection.Input; var_tipo_pedido.Value = String.Empty;
OracleParameter i_estado = new OracleParameter("i_estado", OracleDbType.Int32);
i_estado.Direction = System.Data.ParameterDirection.Input; i_estado.Value = (int)Constants.Estados.Tomado;
OracleParameter var_tipofrustrado = new OracleParameter("var_tipofrustrado", OracleDbType.Varchar2);
var_tipofrustrado.Direction = System.Data.ParameterDirection.Input; var_tipofrustrado.Value = String.Empty;
OracleParameter var_cuotas = new OracleParameter("var_cuotas", OracleDbType.Int32);
var_cuotas.Direction = System.Data.ParameterDirection.Input; var_cuotas.Value = 0;
OracleParameter var_tventa = new OracleParameter("var_tventa", OracleDbType.Varchar2);
var_tventa.Direction = System.Data.ParameterDirection.Input; var_tventa.Value = String.Empty;
OracleParameter[] var_productos = new OracleParameter[15];
OracleParameter[] var_cantidades = new OracleParameter[15];
OracleParameter[] var_valoresUnitarios = new OracleParameter[15];
OracleParameter[] var_porcinis = new OracleParameter[15];
OracleParameter[] var_porclles = new OracleParameter[15];
for(int i = 1; i <= 15; i++)
{
Producto producto = productos.Skip(i - 1).FirstOrDefault();
var_productos[i - 1] = new OracleParameter(String.Concat("var_producto", i), OracleDbType.Varchar2);
var_productos[i - 1].Direction = System.Data.ParameterDirection.Input; var_productos[i - 1].Value = producto == null ? DBNull.Value : (object)producto.Descripcion;
var_cantidades[i - 1] = new OracleParameter(String.Concat("var_cantidad", i), OracleDbType.Int32);
var_cantidades[i - 1].Direction = System.Data.ParameterDirection.Input; var_cantidades[i - 1].Value = producto == null ? DBNull.Value : (object)producto.Cantidad;
var_valoresUnitarios[i - 1] = new OracleParameter(String.Concat("var_valoruni", i), OracleDbType.Int32);
var_valoresUnitarios[i - 1].Direction = System.Data.ParameterDirection.Input; var_valoresUnitarios[i - 1].Value = producto == null ? DBNull.Value : (object)producto.ValorUnitario;
var_porcinis[i - 1] = new OracleParameter(String.Concat("var_porcini", i), OracleDbType.Varchar2);
var_porcinis[i - 1].Direction = System.Data.ParameterDirection.Input; var_porcinis[i - 1].Value = DBNull.Value;
var_porclles[i - 1] = new OracleParameter(String.Concat("var_porclle", i), OracleDbType.Varchar2);
var_porclles[i - 1].Direction = System.Data.ParameterDirection.Input; var_porclles[i - 1].Value = DBNull.Value;
}
OracleParameter var_medio_pago = new OracleParameter("var_medio_pago", OracleDbType.Int32);
var_medio_pago.Direction = System.Data.ParameterDirection.Input; var_medio_pago.Value = medioPago;
OracleParameter var_orden_compra = new OracleParameter("var_orden_compra", OracleDbType.Varchar2);
var_orden_compra.Direction = System.Data.ParameterDirection.Input; var_orden_compra.Value = ordenCompra;
OracleParameter var_ped_obs_sap = new OracleParameter("var_ped_obs_sap", OracleDbType.Varchar2);
var_ped_obs_sap.Direction = System.Data.ParameterDirection.Input; var_ped_obs_sap.Value = String.Empty;
OracleParameter p_pedido = new OracleParameter("PEDIDO", OracleDbType.Decimal);
p_pedido.Direction = System.Data.ParameterDirection.Output;
string sql = @"begin
pqte_transacciones_pr_creapedido
(:var_cliente, :var_usuario, :var_observacion, :var_preciotot,
:var_fechaent, :var_horaent, :var_fpago, :var_motivop, :var_conser_pre,
:var_tipo_pedido, :i_estado, :var_tipofrustrado, :var_cuotas, :var_tventa,
:var_producto1, :var_cantidad1, :var_valoruni1, :var_porcini1, :var_porclle1,
:var_producto2, :var_cantidad2, :var_valoruni2, :var_porcini2, :var_porclle2,
:var_producto3, :var_cantidad3, :var_valoruni3 :var_porcini3, :var_porclle3,
:var_producto4, :var_cantidad4, :var_valoruni4, :var_porcini4, :var_porclle4,
:var_producto5, :var_cantidad5, :var_valoruni5, :var_porcini5, :var_porclle5,
:var_producto6, :var_cantidad6, :var_valoruni6, :var_porcini6, :var_porclle6,
:var_producto7, :var_cantidad7, :var_valoruni7, :var_porcini7, :var_porclle7,
:var_producto8, :var_cantidad8, :var_valoruni8, :var_porcini8, :var_porclle8,
:var_producto9, :var_cantidad9, :var_valoruni9, :var_porcini9, :var_porclle9,
:var_producto10, :var_cantidad10, :var_valoruni10, :var_porcini10, :var_porclle10,
:var_producto11, :var_cantidad11, :var_valoruni11, :var_porcini11, :var_porclle11,
:var_producto12, :var_cantidad12, :var_valoruni12, :var_porcini12, :var_porclle12,
:var_producto13, :var_cantidad13, :var_valoruni13, :var_porcini13, :var_porclle13,
:var_producto14, :var_cantidad14, :var_valoruni14, :var_porcini14, :var_porclle14,
:var_producto15, :var_cantidad15, :var_valoruni15, :var_porcini15, :var_porclle15,
:var_medio_pago, :var_orden_compra, :var_ped_obs_sap, :PEDIDO);
end;";
db.Database.ExecuteSqlCommand(sql,
var_cliente, var_usuario, var_observacion, var_preciotot,
var_fechaent, var_horaent, var_fpago, var_motivop, var_conser_pre,
var_tipo_pedido, i_estado, var_tipofrustrado, var_cuotas, var_tventa,
var_productos[0], var_cantidades[0], var_valoresUnitarios[0], var_porcinis[0], var_porclles[0],
var_productos[1], var_cantidades[1], var_valoresUnitarios[1], var_porcinis[1], var_porclles[1],
var_productos[2], var_cantidades[2], var_valoresUnitarios[2], var_porcinis[2], var_porclles[2],
var_productos[3], var_cantidades[3], var_valoresUnitarios[3], var_porcinis[3], var_porclles[3],
var_productos[4], var_cantidades[4], var_valoresUnitarios[4], var_porcinis[4], var_porclles[4],
var_productos[5], var_cantidades[5], var_valoresUnitarios[5], var_porcinis[5], var_porclles[5],
var_productos[6], var_cantidades[6], var_valoresUnitarios[6], var_porcinis[6], var_porclles[6],
var_productos[7], var_cantidades[7], var_valoresUnitarios[7], var_porcinis[7], var_porclles[7],
var_productos[8], var_cantidades[8], var_valoresUnitarios[8], var_porcinis[8], var_porclles[8],
var_productos[9], var_cantidades[9], var_valoresUnitarios[9], var_porcinis[9], var_porclles[9],
var_productos[10], var_cantidades[10], var_valoresUnitarios[10], var_porcinis[10], var_porclles[10],
var_productos[11], var_cantidades[11], var_valoresUnitarios[11], var_porcinis[11], var_porclles[11],
var_productos[12], var_cantidades[12], var_valoresUnitarios[12], var_porcinis[12], var_porclles[12],
var_productos[13], var_cantidades[13], var_valoresUnitarios[13], var_porcinis[13], var_porclles[13],
var_productos[14], var_cantidades[14], var_valoresUnitarios[14], var_porcinis[14], var_porclles[14],
var_medio_pago, var_orden_compra, var_ped_obs_sap, p_pedido);
nuevoPedido = ((OracleDecimal)p_pedido.Value).Value;
((System.Data.Entity.Infrastructure.IObjectContextAdapter)db).ObjectContext.Connection.Close();
}
}
catch (Exception ex)
{
ErrorLog.Save(ex);
}
return nuevoPedido;
}
アプリケーションは、db.Database.ExecuteSqlCommandメソッド呼び出しで例外をスローします。
例外がある:「ORA-01036:不正な変数名/番号」
あなたは、このコードで間違って何を見ていますか?
Oracle.DataAccess.dllバージョンです:4.112.3.0
のベストはたぶん、あなたは[PL/SQL連想配列バインド]を使用して検討すべきである
の変更を持っています(http://docs.oracle.com/database/121/ODPNT/featOraCommand.htm#BABBDHBB)。それでは、5つのパラメータしか一度定義する必要があります。 –