• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >oracle > Oracle实现动态SQL的拼装要领

Oracle实现动态SQL的拼装要领

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了oracle 执行动态sql,oracle 动态sql,oracle动态sql语句,oracle 动态sql into,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; 

</div>

它就是将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')) 

</div>

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

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

一、先确定目标。应保证拼装出来的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; 

</div>

结果如下:

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

</div>

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;
</div>

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

SQL代码如下: 

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;
</div>

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.
 
Sql代码如下:

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; 
</div>

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Oracle实现动态SQL的拼装要领
  • Oracle提高SQL执行效率的3种方法
  • Oracle提高sql执行效率的心得建议
  • oracle中动态SQL使用详细介绍

相关文章

  • 2017-05-11oracle impdp network_link参数使用介绍
  • 2017-05-11Oracle数据库 DGbroker三种保护模式的切换
  • 2017-05-11oracle group by语句实例测试
  • 2017-05-11Oracle中获取执行计划的几种方法分析
  • 2017-05-11Oracle表空间查看sql使用情况
  • 2017-05-11Oracle常见错误诊断
  • 2017-05-11Oracle9i在Win2k环境下的完全卸载
  • 2017-05-11Oracle9iPL/SQL编程的经验小结
  • 2017-05-11深刻理解Oracle数据库的启动和关闭
  • 2017-05-11ORACLE应用经验(2)

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • oracle 合并查询 事务 sql函数小知识学习
    • Oracle创建主键自增表(sql语句实现)及触发器应用
    • oracle表空单清理常用代码段整理
    • [Oracle] dbms_metadata.get_ddl 的使用方法总结
    • Oracle计算时间差为毫秒的实现代码
    • oracle中的trim函数使用介绍
    • oracle复习笔记之PL/SQL程序所要了解的知识点
    • Oracle 创建用户及数据表的方法
    • Oracle to_date()函数的用法介绍
    • Oracle数据库密码重置、导入导出库命令示例应用

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有