`
mikixiyou
  • 浏览: 1100513 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
C3c8d188-c0ab-3396-821d-b68331e21226
Oracle管理和开发
浏览量:353626
社区版块
存档分类
最新评论

Oracle动态SQL的拼装要领

阅读更多

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

select '=========   and (t.created>=to_date('''||to_char(sysdate,'yyyy-mm-dd')||''',''yyyy-mm-dd'') AND t.created< to_date('''||to_char(sysdate+1,'yyyy-mm-dd')||''',''yyyy-mm-dd''))' from dual;

 

它就是将sysdate转成字符串,再在生成的SQL中将字符串转换成date。

拼装出来的结果如下:

=========   and (t.created>=to_date('2012-11-08','yyyy-mm-dd') AND t.created< to_date('2012-11-09','yyyy-mm-dd'))
 

字符串2012-11-08是我们使用to_char(sysdate,'yyyy-mm-dd')生成的,语句中涉及到的每一个单引号,都要写成两个单引号来转义。

虽然拼装过程很烦人,但只要掌握好三点,就应能拼装出能用的SQL语句。

 

(miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1720563 )


一,先确定目标。应保证拼装出来的SQL应该是什么样子,然后再去配置那个动态SQL

二,拼装SQL的时候,所有使用连接符||连接的对象都应是varchar2类型,这种类型的对象以单引号开头,以单引号结尾。数字会自动转,但date需要我们手工使用to_char函数转。

三,遇到有引号的,就写成两个单引号。

' I am a SQL developer '' '||v_name||' '' in China. telephone is '||v_number||' .' 
 

v_name是字符型的,所以拼装它是需要前后加单引号。

这种转换很烦人,但从10g开始有一个新功能,可以让人不用这么烦。它就是q'[xxxxx]'
示例如下:

select q'[ I'm a SQL developer ' ]'||to_char(sysdate,'yyyy')||q'[' in China. telephone is ]'||1990||'.'  from dual;
 

结果如下:

I'm a SQL developer '2012' in China. telephone is 1990.


I'm使用一个单引号在q'[]'中就可以。
to_char(sysdate,'yyyy')转成的是2012,前后是要加单引号的。所以在q'[xxx ']'的结尾加了一个单引号。
这样就使得我们不用想以前那样使用 ''''表示一个单引号了。

简而言之,掌握这三点,就应该能拼装出能用的SQL。至于如果使用绑定变量输入输出,则需要使用into using关键字。

 

set serveroutput on;

 

declare
incoming date:=sysdate-10;
outgoing int;
begin
execute immediate 'select COUNT(*) FROM user_objects where created > :incoming' into outgoing using incoming ;
dbms_output.put_line(' count is: ' || outgoing);
end;
/

 

使用using的好处,就是不用去转date类型为varchar类型,再转回去date类型这种繁琐的操作。

 

declare
incoming date:=sysdate-10;
outgoing int;
begin
execute immediate 'insert into t_object(a)  select COUNT(*) FROM user_objects where created > :incoming' into outgoing using incoming ;
dbms_output.put_line(' count is: ' || outgoing);
end;
 
ORA-01007: 变量不在选择列表中
ORA-06512: 在 line 6

 

tom这样解释这个错误:Followup    November 24, 2004 - 7am Central time zone:

you have to use DBMS_SQL when the number of outputs is not known until run time. 

 

declare
v_cursor number; --定义游标
v_string varchar2(2999);
v_row number;
begin
v_string := 'insert into t_object(a)  select COUNT(*) FROM user_objects where created > :incoming';--操作语句,其中:name是语句运行时才确定值的变量



v_cursor:=dbms_sql.open_cursor;--打开处理游标

dbms_sql.parse(v_cursor,v_string,dbms_sql.native);--解释语句

dbms_sql.bind_variable(v_cursor,':incoming',sysdate-30);  --给变量赋值

v_row := dbms_sql.execute(v_cursor);--执行语句

dbms_sql.close_cursor(v_cursor);--关闭游标
--dbms_output.put_line(v_row);
commit;

exception
when others then
dbms_sql.close_cursor(v_cursor); --关闭游标
rollback;

end;

分享到:
评论

相关推荐

    Oracle实现动态SQL的拼装要领

    以下是对Oracle实现动态SQL拼装要领的详细说明: 1. **目标明确**: 在开始拼装SQL之前,首先明确最终要生成的SQL语句应有的结构和内容。这包括确定查询的表、字段、条件以及可能的排序和分组等元素。了解这些基础...

    oracle 动态SQL

    Oracle 动态SQL是数据库编程中的一个重要概念,它允许在运行时构建和执行SQL语句,从而提高了灵活性和适应性。动态SQL的使用通常在处理不确定的查询结构、执行基于条件的DML操作或者需要根据运行时信息生成SQL语句时...

    Oracle和SqlServer语法区别

    Oracle和SqlServer语法区别 Oracle和SqlServer是两种流行的关系型数据库管理系统,它们之间存在着一些语法区别。了解这些区别对于开发者来说非常重要,因为它可以帮助他们更好地迁移到新的数据库管理系统。下面将...

    oracle SQL查询工具

    oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具oracle SQL查询工具...

    基于Oracle高性能动态SQL程序开发

    ### 基于Oracle高性能动态SQL程序开发 #### 一、引言 在现代数据库管理系统中,Oracle以其强大的功能和广泛的适用性而受到许多企业和开发者的青睐。在Oracle的编程环境中,动态SQL作为一种灵活的解决方案,能够...

    Oracle与SQLServer的SQL语法差异

    Oracle与SQLServer的SQL语法差异,用简单易懂的语言和实例对Oracle和Sql Server语法之间的差异进行了对比分析,更加适用于入门的人

    ORACLE_SQLDeveloper使用教程

    ### Oracle SQL Developer 使用教程 #### 一、Oracle Database Home Page 的使用 在开始介绍 Oracle SQL Developer 的使用之前,我们先来看看如何使用 Oracle Database Home Page。这部分内容非常重要,因为它是...

    ORACLE数据库SQL语句美化器

    对ORACLE-SQL进行一些布局优化,更新它的格式

    Oracle数据库sql语句 跟踪器

    Oracle数据库SQL语句跟踪器,通常被称为SQL Monitor,是一种强大的工具,用于监控和分析数据库中的SQL语句执行情况。在Oracle环境中,理解SQL语句的行为是优化数据库性能的关键。SQL Monitor提供实时视图,帮助DBA...

    weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB 类型转换解决办法

    这是因为 WebLogic 服务器为了更好地管理和操作数据库连接,会使用自己的包装类 `weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB` 来表示 CLOB 类型的数据,而不是直接使用 Oracle 提供的标准 `oracle.sql.CLOB` 类。...

    Oracle动态SQL之本地动态SQL的使用.pdf

    Oracle数据库系统提供了对动态SQL的支持,这是一种在程序运行时构建和执行SQL语句的编程技术,对于实现数据库操作的灵活性具有重要作用。本文将探讨Oracle本地动态SQL的使用方法和技巧。 动态SQL的使用场景广泛,它...

    SqlDbx连接oracle

    1. oraociei11.dll:这是Oracle Call Interface (OCI) 的动态链接库,是Oracle数据库访问接口的核心,用于应用程序与Oracle数据库交互。 2. orannzsbb11.dll:这是Oracle Net Services的缓冲区管理器,负责数据在...

    oracle动态sql例子

    oracle动态sql例子,适用于存储过程中拼接sql

    Oracle动态SQL4方法分析与应用.pdf

    根据给定文件的信息,以下是对“Oracle动态SQL4方法分析与应用.pdf”文档中所涉及知识点的详细说明: Oracle动态SQL技术: 动态SQL技术允许在程序执行时根据用户的输入构造SQL语句,它在编写程序时不需要确定具体的...

    Oracle动态SQL之DBMS_SQL系统包的使用.pdf

    Oracle数据库作为当前企业级应用中广泛使用的数据库系统之一,其提供的动态SQL功能允许开发者在程序运行时构造和执行SQL语句,这种灵活性为程序开发提供了极大的便利。本文将探讨Oracle中的动态SQL实现机制,重点...

    oracle到sqlserver 跨库查询

    .oracle 到 SQL Server 跨库查询 Oracle 到 SQL Server 跨库查询是指通过网关工具将数据从 SQL Server 数据库中抽取到 Oracle 数据库中。这个过程需要安装和配置网关软件,并进行相应的设置和配置。 一、网关软件...

    Oracle Sql语句转换成Mysql Sql语句

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

    数据库开发 Oracle数据库 SQL开发教程 全套PPT课件 共20个章节.rar

    数据库开发 Oracle数据库 SQL开发教程 第01章 Oracle数据库基础(共60页).pdf 数据库开发 Oracle数据库 SQL开发教程 第02章 编写简单的查询语句(共34页).pdf 数据库开发 Oracle数据库 SQL开发教程 第03章 限制...

Global site tag (gtag.js) - Google Analytics