Oracle 动态sql参数带date类型无法执行的问题

php中文网
发布: 2016-06-07 17:34:33
原创
1108人浏览过

之前在写存储过程时,我有一个目的是通过开始时间和结束时间来创建一个视图,于是我这么写了一个过程: procedure prc_CreateVie

之前在写存储过程时,我有一个目的是通过开始时间和结束时间来创建一个视图,于是我这么写了一个过程:

 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)得到空格可以使用的原因是什么。也希望能够得到大家的帮助。

linux

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号