C# oracle数据库,使用带参数的视图查询无法获得结果集

.Net技术 码拜 8年前 (2016-03-06) 1588次浏览
由于Oracle不支持带参数的视图,所以只能用包的方式来传参,目前的情况是在PL/SQL中执行SQL可以查询出结果(但有一个现象就是第一次查询不会出结果,第二次查询才有结果集出来),而在程序中调用始终没有结果。讨教高手们指点,不胜感激!在线等…..
下面是Oracle包代码

/* 定义视图参数:目前用到的三个参数(点检类型:DJLX,站点ID:SITEID,岗位代码:GWDM)*/
CREATE
OR REPLACE PACKAGE p_view_param IS --站点ID
FUNCTION set_siteId (siteId VARCHAR2) RETURN VARCHAR2 ; FUNCTION get_siteId RETURN VARCHAR2 ; --点检类型
FUNCTION set_djlx (djlx VARCHAR2) RETURN VARCHAR2 ; FUNCTION get_djlx RETURN VARCHAR2 ; --岗位代码
FUNCTION set_gwdm (gwdm VARCHAR2) RETURN VARCHAR2 ; FUNCTION get_gwdm RETURN VARCHAR2 ;
END p_view_param ; 
/*创建包体,处理get,set方法*/
CREATE OR REPLACE PACKAGE BODY p_view_param IS
paramSiteId VARCHAR2(20);  --站点ID
paramDjlx VARCHAR2(1); --点检类型
paramGwdm VARCHAR2(20); --岗位代码
/*站点ID赋值*/
FUNCTION set_siteId (siteId VARCHAR2) RETURN VARCHAR2 IS
BEGIN
  paramSiteId:= siteId; RETURN siteId;
END; /*站点ID取值*/
FUNCTION get_siteId RETURN VARCHAR2 IS
BEGIN
  RETURN paramSiteId;
END; /*点检类型赋值*/
FUNCTION set_djlx (djlx VARCHAR2) RETURN VARCHAR2 IS
BEGIN
  paramDjlx:= djlx; RETURN djlx;
END; /*点检类型取值*/
FUNCTION get_djlx RETURN VARCHAR2 IS
BEGIN
  RETURN paramDjlx;
END; /*岗位代码赋值*/
FUNCTION set_gwdm (gwdm VARCHAR2) RETURN VARCHAR2 IS
BEGIN
  paramGwdm:= gwdm; RETURN gwdm;
END; /*岗位代码取值*/
FUNCTION get_gwdm RETURN VARCHAR2 IS
BEGIN
  RETURN paramGwdm;
END;
END p_view_param;

下面是视图代码:

create or replace view v_wms_searchXMBZ as
with tmp as (  
  select DJ_SBXMB.*,  
  length(DJ_SBXMB.XMZQ)-length(regexp_replace(DJ_SBXMB.XMZQ, ",", ""))+1 len  
  from DJ_SBXMB  WHERE DJ_SBXMB.SITEID=p_view_param.get_siteId() and DJ_SBXMB.DJLX=p_view_param.get_djlx() and DJ_SBXMB.GWDM=p_view_param.get_gwdm()
  )  
  select a.*, regexp_substr(XMZQ, "[^,]+", 1, rn) ZQ  
  from tmp a, (select rownum rn from dual connect by level <= (select max(len) from tmp x)) b  
  where a.len>=b.rn  
  order by 1
     

下面是C#调用代码以及DBHelper方法代码

string sql =string.Format("select *  from V_WMS_SEARCHXMBZ  where p_view_param.set_siteId("{0}")="{1}" and p_view_param.set_djlx("{2}")="{3}" and p_view_param.set_gwdm("{4}")="{5}"",model.SiteId,model.SiteId,model.DJLX,model.DJLX,model.GWDM,model.GWDM);
var dt = OracleDbHelper.QueryTable(sql);
public static DataTable QueryTable(string sqlString)
        {
            using (var connection = new OracleProvider().GetConn(OracleDbHelper.CONNECTION_STRING_NAME))
            {
                var ds = new DataSet();
                try
                {
                    connection.Open();
                    var command = new OracleDataAdapter(sqlString, connection);
                    command.Fill(ds, "ds");
                    return ds.Tables.Count < 1 ? null : ds.Tables[0];
                }
                catch (Exception e)
                {
                    throw e;
                }
                finally
                {
                    if (connection.State == ConnectionState.Open)
                    {
                        connection.Close();
                    }
                }
            }
        }
解决方案

50

还是你的sql有问题吧。sql能够正常执行的话,用C#和你使用pl/sql中去执行效果一样

50

感觉SQL写的怪怪的。换思路吧。
with tmp感觉可以和下面的select合起来写。
with tmp中where的几个条件不能先省略么? 然后再查询视图的时候再加上。
视图的作用有时候不是为了生成一个全集,然后在查询的添加条件?标题的意思是“ C#调用oracle不支持给视图加上where条件”么,想想也不可能啊。
第一次调用的时候没有结果,第一次调用包函数的时候,直接get,get函数里的变量不是空的么?没见你给变量赋初值啊?

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C# oracle数据库,使用带参数的视图查询无法获得结果集
喜欢 (0)
[1034331897@qq.com]
分享 (0)