`

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)得到空格可以使用的原因是什么。也希望能够得到大家的帮助。
  • 大小: 34.5 KB
分享到:
评论

相关推荐

    在Oracle写入Date类型的Sql语句

    Oracle中日期转换 to_date参数含义 日期转换写入实例

    Oracle数据库SQL基本应用与介绍

    Oracle数据库内部的数据操作可以通过sql语句执行处理,sql与C、Basic等语言不通,数据的访问方法和操作顺序不用正确指定,是要告诉数据库引擎要做什么就可以了。Oracle不仅可以通过基本的sql进行简单的数据操作,还...

    Oracle–查询时间段内执行的sql、Produce

    1.查询时间段内执行的sql、Produce select * from v$sqlarea a where 1=1 and a.LAST_ACTIVE_TIME >= to_date( '2013-02-21 18:23:00','yyyy-MM-dd HH24:mi:ss') and a.LAST_ACTIVE_TIME < to_date( '2013-...

    oracle导出时间格式转换

    大家都知道,从oracle数据库中导出数据时,如果其中有字段类型为date,那么导出时将会变成to_date('29-12-2010 10:20:30', 'hh24:mi:ss'),如果你要将这导出的数据在oracle客户端中执行,应该是没什么问题的,但是...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:...

    oracle执行update语句时卡住问题分析及解决办法

    这种只有update无法执行其他语句可以执行的其实是因为记录锁导致的,在oracle中,执行了update或者insert语句后,都会要求commit,如果不commit却强制关闭连接,oracle就会将这条提交的记录锁住。由于我的java程序...

    Oracle Pl/sql By Example

    Oracle® PL/SQL™ by Example, Third Edition By Benjamin Rosenzweig, Elena Silvestrova Publisher : Prentice Hall PTR Pub Date : September 10, 2003 ISBN : 0-13-117261-1 Pages : 768

    oracle-sql基本语法例子,包括to_date,to_char

    总结的sql语法,其中包括一些函数的用法,to_date,to_char,to_number等等函数

    MYSQL,SQLSERVER,ORACLE常用的函数

    SQL> select instr('oracle traning','ra',1,2) instring from dual; INSTRING --------- 9 6.LENGTH 返回字符串的长度; SQL> select name,length(name),addr,length(addr),sal,length(to_char(sal)) from ....

    ORACLE数据库sql语言 、函数及常用命令

    DATE:包含日期和时间。 INTEGER:有符号全长二进制整数(31位精度)。 SMALLINT:有符号半长二进制整数(15位精度)。 DECIMAL (p[,q]): 有符号的封装了的十进制小数,最多有 p 位数,并假设有 q 位在小数点右边...

    ORACLE,mysql,sqlserver,sybase数据库装文本软件

    注意:如果设置了此参数,每到此行数会执行一次commit,如果是外部调用此过程要注意所有数据会被提交 -ac all commit 0.插入成功的都提交,失败的登记文本,默认0; 1.全部插入成功后才提交(有失败则回滚并结束) -a ...

    oracle存储过程

    存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。 定义总是很抽象。存储过程其实就是能完成一定操作的一组SQL语句,只不过这组语句是放在数据库中的(这里我们只谈SQL Server)。如果我们通过创建存储...

    Oracle点滴积累

    expimp导出导入工具的使用.doc,Oracle 单记录函数.doc,...SQLServer和Oracle常用函数对比.doc,关系型数据库及其设计方法.doc,视图、同义词和序列.doc,索引与约束.doc,详细讲述Oracle中的to_date参数含义.doc

    Oracle实现动态SQL的拼装要领

    虽说Oracle的动态SQL语句使用起来确实很方便,但是其拼装过程却太麻烦。尤其在拼装语句中涉及到date类型字段时,拼装时要加to_char先转换成字符,到了sql中又要使用to_date转成date类型和原字段再比较。 例如有这样...

    oracle期末作业PL、SQL实现股票分析.zip

    第一步: 先将档案中两个Tabs的灰色背景数据(Date, Open, High, Low, Close)汇入Oracle数据库(两个Tabs的灰色背景数据相同,汇入其一即可),而其他数据必须要由PL/SQL来产生(黄底红字部分为关键输出数据)。...

    Oracle date 和 timestamp 区别详解

    Oracle date 和 timestamp 区别详解 1.DATE数据类型  这个数据类型我们实在是太熟悉了,当我们需要表示日期和时间的话都会想到date类型。它可以存储月,年,日,世纪,时,分和秒。它典型地用来表示什么时候事情...

    ORACLE常用SQL命令.pdf

    命令行工具基本操作及 SQL 命令 1. 基本概念 1.1.数据类型 基本数据类型(NUMBER,VARCHAR2,DATE) O RACEL 支持下列内部数据类型: VARCHAR2 变长字符串,最长为 2000 字符。 NUMBER 数值型。 LONG 变长字符数据,...

    Oracle SQL 函数使用说明

    Oracle SQL function 包含了大部分的函数说明,如DECODE、LPAD、TO_DATE、TO_CHAR等

    Oracle to_char(date)用法总结

    Oracle to_char(date)用法总结 个人认为还是比较齐全的

Global site tag (gtag.js) - Google Analytics