2016-12-21 13 views
0

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

+0

のベストはたぶん、あなたは[PL/SQL連想配列バインド]を使用して検討すべきである

string sql = @"begin pqte_transacciones_pr_creapedido 

の変更を持っています(http://docs.oracle.com/database/121/ODPNT/featOraCommand.htm#BABBDHBB)。それでは、5つのパラメータしか一度定義する必要があります。 –

答えて

0

あなたは、具体的:var_valoruni3後、C#コードでsql文字列代入にカンマが欠落している - それが動作するかどうか、それを追加してご覧ください。そうでない場合は、他にも欠けていることがあります。

+0

ありがとう...コンマを追加したとき、エラーは変更されましたが、パッケージ名とプロシージャをアンダースコアで区切っていることを示しています。私は点に変わった。そうすれば、手続きが呼び出されます。 – jstuardo

0

パッケージ名とプロシージャ名の間には、呼び出すときにピリオドが必要です。今あなたの代わりに5回15個の個々のパラメータを定義すること

string sql = @"begin 
       pqte_transacciones.pr_creapedido 

に運

関連する問題