Welcome 微信登录

首页 / 数据库 / MySQL / Oracle 动态sql参数带date类型无法执行的问题

之前在写存储过程时,我有一个目的是通过开始时间和结束时间来创建一个视图,于是我这么写了一个过程: procedure prc_CreateViewOBookTcert(p_startdate in date,        --统计的开始日期
                                      p_enddate in date)          --统计的结束日期
 is
 v_sql varchar2(2000);
 begin
   v_sql :=
   "create or replace view v_obook_tcert as
     select * from(
         select
         nvl(t11.region,nvl(t22.region,t33.region)) region,
         nvl(t11.site,0) site,
         nvl(t22.useland,0) useland,
         nvl(t33.project,0) project,
         nvl((nvl(t11.site,0)+nvl(t22.useland,0)+nvl(t33.project,0)),0) subtotal--统计某一区域选址、用地、工程的和
          from
            (select t1.项目所在区 region,count(t1.项目所在区) site--统计选址
           from ts_project t1
           where t1.ref_business_id=1 and t1.发证日期 between "||p_startdate||" and "||p_enddate||"
           group by t1.项目所在区) t11
          full join
            (select t2.项目所在区 region,count(t2.项目所在区) useland--统计用地
           from ts_project t2
           where t2.ref_business_id=3 and t2.发证日期 between "||p_startdate||" and "||p_enddate||"
           group by t2.项目所在区) t22
           on t11.region=t22.region
          full join
            (select t3.项目所在区 region,count(t3.项目所在区) project--统计工程
           from ts_project t3
           where t3.ref_business_id in(5,9,11) and t3.发证日期 between "||p_startdate||" and "||p_enddate||"
           group by t3.项目所在区) t33
          on t22.region=t33.region)";
      execute immediate v_sql;
 end prc_CreateViewOBookTcert;黄色区域是关键地方,这个过程语法是没有问题的,把参数变量值换成实际值也是有效的。可是就是在调用的时候无效。也就是说只要把实际值用变量来代替就无效了。其实这种情况经常会出现,在 集合查询的时候也会出现这样的错误。今天突然想是不是空格什么的没注意,于是我改成了这样的:  --一书两证视图
 procedure prc_CreateViewOBookTcert(p_startdate in date,        --统计的开始日期
                                      p_enddate in date)          --统计的结束日期
 is
 v_sql varchar2(2000);
 begin
   v_sql :=
   "create or replace view v_obook_tcert as
     select * from(
         select
         nvl(t11.region,nvl(t22.region,t33.region)) region,
         nvl(t11.site,0) site,
         nvl(t22.useland,0) useland,
         nvl(t33.project,0) project,
         nvl((nvl(t11.site,0)+nvl(t22.useland,0)+nvl(t33.project,0)),0) subtotal--统计某一区域选址、用地、工程的和
          from
            (select t1.项目所在区 region,count(t1.项目所在区) site--统计选址
           from ts_project t1
           where t1.ref_business_id=1 and t1.发证日期 between "||chr(39)||p_startdate||chr(39)||" and "||chr(39)||p_enddate||chr(39)||"
           group by t1.项目所在区) t11
          full join
            (select t2.项目所在区 region,count(t2.项目所在区) useland--统计用地
           from ts_project t2
           where t2.ref_business_id=3 and t2.发证日期 between "||chr(39)||p_startdate||chr(39)||" and "||chr(39)||p_enddate||chr(39)||"
           group by t2.项目所在区) t22
           on t11.region=t22.region
          full join
            (select t3.项目所在区 region,count(t3.项目所在区) project--统计工程
           from ts_project t3
           where t3.ref_business_id in(5,9,11) and t3.发证日期 between "||chr(39)||p_startdate||chr(39)||" and "||chr(39)||p_enddate||chr(39)||"
           group by t3.项目所在区) t33
          on t22.region=t33.region)";
      execute immediate v_sql;
 end prc_CreateViewOBookTcert;可以看到变化的地方就是在变量的前后各自加了一个chr(39)(之前的也是有空格的),这个函数就是通过ascii码得到对应的字符,而39对应的就是空格,这么修改后就能够正常动态创建视图了。很多时候大家要是遇到语法什么的一切都OK,但就是不能动态执行或者创建的时候就想一想是不是这里出了问题,比如再给游标动态传参后使用集合查询时也会出现这样的情况。目前我还不清楚在这样的情况下为什么直接按空格键输入的空格无法使用,而通过chr(39)得到空格可以使用的原因是什么。也希望能够得到大家的帮助。更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12关于Oracle 11gR2的相关配置问题Oracle中数据文件大小及数量限制初探相关资讯      Oracle SQL  Oracle sql参数 
  • Oracle高级SQL培训与讲解 PDF  (06月01日)
  • SQL在Oracle内部的具体处理流程  (05/06/2015 10:43:43)
  • Oracle使用WITH AS和HINT   (07/18/2014 15:55:31)
  • Oracle SQL语句追踪  (05/09/2015 09:42:25)
  • Oracle执行SQL查询语句的步骤  (09/26/2014 19:40:59)
  • 获取Oracle SQL语句中绑定变量值的  (07/17/2014 08:07:40)
本文评论 查看全部评论 (0)
表情: 姓名: 字数