当前位置: 代码迷 >> Oracle开发 >> PL/SQL的接口设计,该如何解决
  详细解决方案

PL/SQL的接口设计,该如何解决

热度:122   发布时间:2016-04-24 06:26:25.0
PL/SQL的接口设计
假设有这样的存储过程,其主要功能为调用execute immediate sql来完成语句的执行。

     procedure proc2(sql in varchar2(50));


在应用层通过OracleCommand,OracleParameter调用此存储过程

      OracleConnection oc = new OracleConnection(strConnection);
       oc.Open();
       OracleCommand om = oc.CreateCommand();
       om.CommandType = CommandType.StoredProcedure;
       om.CommandText = "proc2";
       om.Parameters.Add("sql", OracleType.Number).Direction = ParameterDirection.Input;
       om.Parameters["sql"].Value = "select * from table1";


现在的问题是:如何在执行动态sql语句的时候传入参数?
比如:sql="insert into table values(:x,:y,:z)";此时需要传入3个参数。

那么在传入的参数类型不确定,个数也不确定的情况下又该怎么做?

存储过程可以修改,C#中的类可以继承。望各位大侠帮帮忙啊
------解决思路----------------------
最简单的,不用那个存储过程了,直接在程序中构造整个
execute immediate sql_state using var1,var2,...
语句,然后传过去执行不就行了.
------解决思路----------------------
把这几个参数都动态的拼接到字符串中。
------解决思路----------------------
为了解决这个问题:
1、把存储过程的参数都定义为varchar2类型
2、c#用参数数值来调用
#region  调用存储过程 public int ExecuteProcedure(string ProcedureName,string[][] Params)
        /// <summary>
        /// 调用存储过程(参数类型都为input,并且皆为varchar,请在存储过程内转换为您所需的类型)
        /// 调用方式如下:
        ///string[][] Params = new string[][]
        /// {
        /// new string[] {"kssj","2006-01-01"},
        /// new string[] {"Ygdl","45.2584"}
        /// };
        ///int res = ExecuteProcedure("Pro_Test",Params);
        ///
        /// </summary>
        /// <param name="ProcedureName">存储过程名称</param>
        /// <param name="Params">存储过程参数数组</param>
        /// <returns></returns>
        public int ExecuteProcedure(string ProcedureName, string[][] Params)
        {
            int res = -1;
            try
            {
                this.DBConnection();
                this.cmd.BindByName = true;
                this.cmd.CommandText = ProcedureName;
                this.cmd.CommandType = CommandType.StoredProcedure;
                int count = Params.Length;
                for (int i = 0; i < count; i++)
                {
                    this.cmd.Parameters.Add(Params[i][0], OracleDbType.Varchar2).Value = Params[i][1];

                }
                res = this.cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                throw (e);
            }
            finally
            {
                this.DBDisconnection();
                this.conn.Dispose();
            }
            return res;
        }

        #endregion
  相关解决方案