`

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动态执行SQL四种方式的例子

    在Oracle数据库管理中,动态执行SQL语句是一种强大的功能,允许开发者在运行时构建和执行SQL语句,这对于处理不确定或变化的数据结构尤其有用。本文将深入探讨Oracle中动态执行SQL的四种主要方法,并通过具体示例...

    oracle与sql_server数据类型对应关系.doc

    2. **DATE数据类型限制**:SQL Server的datetime类型与Oracle的DATE类型在日期范围上有所不同,Oracle的DATE类型支持范围从公元前4712年到公元4712年,因此,在复制过程中,需确保SQL Server的datetime值在此范围内...

    sqlserver-oracle 数据类型对照

    本文将详细比较SQL Server和Oracle数据库之间的数据类型对应以及常用函数的转换。 首先,我们来看SQL Server和Oracle的数据类型对照: 1. **数值类型**: - `bigint`在SQL Server中对应Oracle的`NUMBER(19)`,...

    Oracle Sql语句转换成Mysql Sql语句

    在数据库管理领域,Oracle SQL和MySQL SQL是两种广泛使用的SQL方言,它们在语法和功能上存在一定的差异。当需要将一个基于Oracle SQL的应用程序迁移到MySQL环境时,就需要进行SQL语句的转换工作。本项目提供了一个...

    ORACLE入门基础,本地动态SQL执行语句

    ### ORACLE 入门基础:本地动态 SQL 执行语句 #### 一、概述 ...以上内容为 Oracle 入门基础中关于本地动态 SQL 执行语句、PL/SQL 数据类型等方面的知识点进行了详细介绍。希望对初学者有所帮助。

    在Oracle写入Date类型的Sql语句

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

    Oracle SQL(SQL for Oracle)

    1. **数据类型**:Oracle支持多种数据类型,包括数值型(如NUMBER)、字符串型(如VARCHAR2和CHAR)、日期/时间型(如DATE)、二进制大对象(BLOB)等。理解这些数据类型对于创建表结构和处理数据至关重要。 2. **...

    OracleSQL的优化.pdf

    Oracle SQL 优化 Oracle SQL 优化是数据库性能优化的关键部分。为了提高数据库的性能,我们需要从五个方面进行调整:去掉不必要的大型表的全表扫描、缓存小型表的全表扫描、检验优化索引的使用、检验优化的连接技术...

    Oracle Sql基础(beginning oracle sql中文版)

    Oracle SQL支持多种数据类型,如CHAR、VARCHAR2(可变长度字符串)、NUMBER(数字)、DATE(日期时间)、CLOB(大对象,用于存储文本)、BLOB(大对象,用于存储二进制数据)等。选择正确的数据类型对于数据的存储和...

    ORACLE和SQL语法区别归纳

    本文旨在为初学者提供关于Oracle与SQL Server在数据类型、函数及日期操作等方面的语法差异总结,帮助读者更好地理解这两种数据库管理系统的特点,并能够在实际应用中灵活选择合适的语法进行操作。 #### 数据类型...

    sql server 和oracle 中数据类型的区别

    5. **datetime**: 存储日期和时间信息,SQL Server中`datetime`类型占用8个字节,Oracle中的对应类型为`DATE`。 6. **decimal**: 存储十进制数,如`decimal(9)`,在Oracle中对应`NUMBER(18)`。 7. **float**: 浮点数...

    存储过程中怎么动态执行sql语句

    ### 动态执行SQL语句在Oracle中的应用 #### 标题解读 “存储过程中怎么动态执行SQL语句”这一标题表明文章将介绍如何在Oracle数据库的存储过程中编写能够动态执行的SQL语句。动态SQL是指在运行时才能确定其具体内容...

    Oracle数据库sql转换mysql数据库工具

    1. **数据类型映射**:确保Oracle的数据类型被正确地映射到MySQL对应的类型,如NUMBER到DECIMAL,DATE到DATETIME等。 2. **字符集**:Oracle和MySQL支持的字符集可能不同,需确保字符集设置的一致性,避免数据丢失...

    Sql语法转换为Oracle语法

    6. 数据类型:两者的数据类型有差异,例如SQL Server的 `NVARCHAR` 对应Oracle的 `NCLOB`,`DATE` 在Oracle中包含了时间信息,而在SQL Server中则不包含。 7. 连接操作:SQL Server使用 `JOIN ON`,Oracle也支持...

    Oracle TimesTen SQL 参考指南

    - **ANSI SQL数据类型**:这部分详细介绍了TimesTen支持的标准ANSI SQL数据类型,如数值类型(INTEGER、SMALLINT、DECIMAL)、日期/时间类型(DATE、TIME、TIMESTAMP)、字符类型(CHAR、VARCHAR)等。 - **向后兼容...

    实现ORACLE与SQLSERVER数据库间的数据抽取与转换工具

    例如,Oracle的`TO_DATE`函数在SQL Server中可能是`CONVERT`函数,`SUBSTR`在SQL Server中对应`SUBSTRING`。 文件"复件 zExtractor"可能是一个实现这个功能的源代码压缩包,包含具体的实现逻辑。在实际开发中,这个...

    oracle,sqlserver及mysql对比

    Oracle、SQL Server 及 MySQL 的查询语句执行顺序相同:开始->FROM 子句->WHERE 子句->GROUP BY 子句->HAVING 子句->ORDER BY 子句->SELECT 子句->LIMIT 子句。每个子句执行后都会产生一个中间结果,供接下来的子句...

    oracle_sql笔记

    Oracle支持多种数据类型,如VARCHAR2(可变长度字符串)、NUMBER(数值类型)、DATE(日期时间)、BLOB(二进制大对象)等。理解这些数据类型对于正确存储和处理数据至关重要。 三、表与索引 在Oracle中,表是数据...

    oracle和sql的语法区别大

    ### Oracle与SQL Server语法区别详解 #### 数据类型对比 **1. 字符数据类型** - **CHAR** - Oracle: 固定长度字符类型,最大长度2KB。 - SQL Server: 同样是固定长度字符类型,但最大长度达到了8KB。 **2. 变...

Global site tag (gtag.js) - Google Analytics