最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:动视网 责编:小采 时间:2020-11-09 10:31:59
文档

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

Oracle动态sql参数带date类型无法执行的问题:之前在写存储过程时,我有一个目的是通过开始时间和结束时间来创建一个视图,于是我这么写了一个过程: procedure prc_CreateVie 之前在写存储过程时,我有一个目的是通过开始时间和结束时间来创建一个视图,于是我这么写了一个过程: procedure
推荐度:
导读Oracle动态sql参数带date类型无法执行的问题:之前在写存储过程时,我有一个目的是通过开始时间和结束时间来创建一个视图,于是我这么写了一个过程: procedure prc_CreateVie 之前在写存储过程时,我有一个目的是通过开始时间和结束时间来创建一个视图,于是我这么写了一个过程: procedure


之前在写存储过程时,我有一个目的是通过开始时间和结束时间来创建一个视图,于是我这么写了一个过程: 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)得到空格可以使用的原因是什么。也希望能够得到大家的帮助。

文档

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

Oracle动态sql参数带date类型无法执行的问题:之前在写存储过程时,我有一个目的是通过开始时间和结束时间来创建一个视图,于是我这么写了一个过程: procedure prc_CreateVie 之前在写存储过程时,我有一个目的是通过开始时间和结束时间来创建一个视图,于是我这么写了一个过程: procedure
推荐度:
标签: 问题 sql 的问题
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top