当前位置: 首页 > news >正文

通过pl/sql来格式化sql(r4笔记第63天)

在之前的一篇博文中分享了通过java来格式化sql,http://blog.itpub.net/23718752/viewspace-1444910/今天突然想试试通过sql来格式化一把pl/sql试试,想起来容易,做起来难,自己捣鼓了半天,总算是弄出点雏形了。简单分享一下。我们还是格式化同一段sql语句。select /*+ leading(s) index(s TABLE_BPM_STEP_INST_5IX) use_nl(s pp step) */ s.ALLOW_CREATE, s.ASSIGNEE, s.ASYNC_RETURNED_PARAMS, s.ATTACHER2STEP_INST, s.COMMITTER, s.CONTROL_COUNT, s.CURR_FAULT2FAULT_INFO, s.DO_AVAIL_ON_RESUM, s.DO_FIN_ON_RESUM, s.HAS_DEPENDENTS, s.HAS_MARCH_REND, s.HAS_REND, s.INFLOW_BITS, s.ITER_COUNT, s.NUM_OR_PREREQS, s.NUM_PENDING, s.NUM_PENDING_PREREQS, s.OBJID, s.OUTFLOW_BITS, s.PARAMS, s.PARENT2PROC_INST, s.ROOT2PROC_INST, s.START_TIME, s.STATUS, s.STATUS_CHANGE_TIME, s.STEP2STEP, s.TARGETED_BY_ALARMS, s.TRIGGERS_ALARMS, s.WAIT_TIME, s.WORKER FROM TABLE_BPM_PROC_INST p, TABLE_BPM_STEP_INST s, TABLE_BPM_STEP step WHERE s.root2proc_inst = p.objid AND s.step2step = step.objid AND ( NOT (step.step_type = 4)) AND p.root_status in (0, 14) AND s.committer = :1 AND s.assignee in ('BpmInServer', 'BpmInServerSmThr', 'BpmJms') AND s.status in (50, 55) AND s.curr_fault2fault_info is null and ( p.EXEC_DOMAIN like :2 ) 自己尝试通过创建一个临时用的表,然后通过pl/sql来简单分析,从这个过程来看,pl/sql处理的思路和java还是差别很大。create table tmp_format_sql(text varchar2(200));首先得到一个sql文件,内容如上,我们假设为test.sql格式化成为insert 语句。[ora11g@rac1 ~]$ awk '{print "insert into tmp_format_sql values(" "'\''"$0"'\''" " );"}' test.shinsert into tmp_format_sql values('select /*+ leading(s) index(s TABLE_BPM_STEP_INST_5IX) use_nl(s p' );insert into tmp_format_sql values('p step) */ s.ALLOW_CREATE, s.ASSIGNEE, s.ASYNC_RETURNED_PARAMS, s' );insert into tmp_format_sql values('.ATTACHER2STEP_INST, s.COMMITTER, s.CONTROL_COUNT, s.CURR_FAULT2F' );insert into tmp_format_sql values('AULT_INFO, s.DO_AVAIL_ON_RESUM, s.DO_FIN_ON_RESUM, s.HAS_DEPENDEN' );insert into tmp_format_sql values('TS, s.HAS_MARCH_REND, s.HAS_REND, s.INFLOW_BITS, s.ITER_COUNT, s.' );insert into tmp_format_sql values('NUM_OR_PREREQS, s.NUM_PENDING, s.NUM_PENDING_PREREQS, s.OBJID, s.' );insert into tmp_format_sql values('OUTFLOW_BITS, s.PARAMS, s.PARENT2PROC_INST, s.ROOT2PROC_INST, s.S' );insert into tmp_format_sql values('TART_TIME, s.STATUS, s.STATUS_CHANGE_TIME, s.STEP2STEP, s.TARGETE' );insert into tmp_format_sql values('D_BY_ALARMS, s.TRIGGERS_ALARMS, s.WAIT_TIME, s.WORKER FROM TABLE_' );insert into tmp_format_sql values('BPM_PROC_INST p, TABLE_BPM_STEP_INST s, TABLE_BPM_STEP step WHERE' );insert into tmp_format_sql values(' s.root2proc_inst = p.objid AND s.step2step = step.objid AND ( NO' );insert into tmp_format_sql values('T (step.step_type = 4)) AND p.root_status in (0, 14) AND s.commit' );insert into tmp_format_sql values('ter = :1 AND s.assignee in ('BpmInServer', 'BpmInServerSmThr', 'B' );insert into tmp_format_sql values('pmJms') AND s.status in (50, 55) AND s.curr_fault2fault_info is n' );insert into tmp_format_sql values('ull and ( p.EXEC_DOMAIN like :2 )' );直接运行生成的Insert语句即可,使用sed先来把单引号‘替换成为'' 然后通过awk来拼接成需要的sql语句。然后使用pl/sql来直接解析tmp_format_sql中的数据即可,pl/sql的内容很简单,相比java的处理来说要简化很多。set feedback offset serveroutput ondeclarea varchar2(200);b varchar2(200);cursor tmp_sql is select substr(text,1,instr(text,' ',-1,1))left_part,substr(text,instr(text,' ',-1,1)) right_part from tmp_format_sql; --这是最重要的语句,以每行最后的一个空格为界,把每一行分成两部分,在循环中拼接。beginfor i in tmp_sql loopi.left_part:=a||i.left_part;a:=i.right_part;dbms_output.put_line(i.left_part);end loop;end;/

得到的结果如下:

预期结果和java格式化的一致,可以从这个过程中看出来,同一个功能有多种实现方式,oracle中对于字符处理的功能还是很强大的,可以根据自己的需要来灵活使用。

相关文章:

  • java中的序列化 (r4笔记第64天)
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • 通过shell脚本快速定位active session问题(r4笔记第65天)
  • 重温二分查找算法(r4笔记第66天)
  • 不要成为技术的奴隶(一) (r4笔记第67天)
  • 最简单的web服务器实现(一)(r4笔记第68天)
  • 通过编程控制CPU利用率(r4笔记第69天)
  • 通过图表简化sql语句的表关联(r4笔记第70天)
  • 巧用外部表避免大量的insert (r4笔记第71天)
  • 海量数据迁移之数据抽取流程 (r4笔记第72天)
  • 重温快速排序(r4笔记第73天)
  • 海量数据迁移之sqlldr和datapump的缺点分析(r4笔记第74天)
  • mongoDB初探第一篇(r4笔记第75天)
  • 通过单例模式模拟RAC连接 (r4笔记第76天)
  • 特殊的物化视图刷新 (r4笔记第77天)
  • 08.Android之View事件问题
  • Javascript弹出层-初探
  • JWT究竟是什么呢?
  • LintCode 31. partitionArray 数组划分
  • Mithril.js 入门介绍
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • php面试题 汇集2
  • React-redux的原理以及使用
  • SpringCloud集成分布式事务LCN (一)
  • Vue2 SSR 的优化之旅
  • windows下mongoDB的环境配置
  • 关于extract.autodesk.io的一些说明
  • 基于Android乐音识别(2)
  • 记录一下第一次使用npm
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (Java数据结构)ArrayList
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (笔试题)分解质因式
  • (二)springcloud实战之config配置中心
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)【Hibernate总结系列】使用举例
  • (转)socket Aio demo
  • (转)人的集合论——移山之道
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .bat文件调用java类的main方法
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET 中 GetProcess 相关方法的性能
  • .NET应用架构设计:原则、模式与实践 目录预览
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • [ SNOI 2013 ] Quare