点击上方"蓝字"

关注我们,享更多干货!

在一些情况下,梳理复杂的SQL或PL/SQL代码逻辑时最好是格式化一下文本。

当然我们有Toad或PL/SQL Developer等其它第三方客户端程序作为辅助,但如果在数据库内容方面可以将SQL格式化则更佳。

当前数据库12c以后的软件安装介质中已经包含了Oracle/ SQLcl或Oracle SQL Developer,使用这两者任一自带工具中的JavaLib的dbtools-common.jar中的oracle.dbtools.app.Format函数就可以实现。

下面是实际安装步骤,环境为19.3

1、加载java

19.3中自带的发现无法使用:

[oracle@oel7db1 lib]$ loadjava -u anbob/anbob@cdb1pdb1 /u01/app/oracle/product/19.2.0/db_1/sqldeveloper/sqldeveloper/lib/dbtools-common.jar
[oracle@oel7db1 lib]$ sqlplus anbob/anbob@cdb1pdb1

创建3#的Java函数时会提示下面的错误:

Warning: Java created with compilation errors.SSQL> show error
Errors for JAVA SOURCE "SQLFORMATTER":LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0      Note: SQLFORMATTER uses or overrides a deprecated API.
0/0      ORA-29534: referenced object ANBOB.oracle/dbtools/app/Formatcould not be resolved0/0      Note: Recompile with -Xlint:deprecation for details.

下载新版的SQLcl:

https://www.oracle.com/tools/downloads/sqlcl-downloads.html

使用目录里的 dbtools-common.jar 可以解决。

我这里把SQLcl放到了$ORACLE_HOME下:

loadjava -u anbob/anbob@cdb1pdb1 /u01/app/oracle/product/19.2.0/db_1/sqlcl/lib/dbtools-common.jar

2、JAVA授权

SQL> exec dbms_java.grant_permission( 'ANBOB', 'SYS:java.lang.RuntimePermission', 'oracle.DbmsJavaScriptUser', '' );SQL> exec dbms_java.grant_permission( 'ANBOB', 'SYS:java.lang.RuntimePermission', 'accessClassInPackage.jdk.nashorn.internal.runtime', '' );SQL> exec dbms_java.grant_permission( 'ANBOB', 'SYS:java.lang.reflect.ReflectPermission', 'suppressAccessChecks', '' );SQL> exec dbms_java.grant_permission( 'ANBOB', 'SYS:java.util.PropertyPermission', 'polyglot.js.nashorn-compat', 'write' )

注意:如果不授权SYS:java.util.PropertyPermission 在后面执行时会提示无权限。

3、创建JAVA函数

CREATE or replace AND COMPILE JAVA SOURCE NAMED SQLFormatter AS
/* Imports */
import oracle.dbtools.app.Format;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import oracle.sql.BLOB;
import oracle.sql.CLOB;
import java.io.StringWriter;
import java.io.PrintWriter;public class SQLFormatter {private static String getStackTrace(Exception e) {StringWriter writer = new StringWriter();PrintWriter printWriter = new PrintWriter( writer );e.printStackTrace( printWriter );printWriter.flush();return writer.toString();}public static Format getFormat() {oracle.dbtools.app.Format format = new oracle.dbtools.app.Format();format.options.put("singleLineComments", Format.InlineComments.CommentsUnchanged);format.options.put("kwCase", Format.Case.UPPER);format.options.put("idCase", Format.Case.NoCaseChange);                             // default: Format.Case.lowerformat.options.put("adjustCaseOnly", false);                                        // default: false (set true to skip formatting)format.options.put("formatThreshold", 1);                                           // default: 1 (disables deprecated post-processing logic)// Alignmentformat.options.put("alignTabColAliases", false);                                    // default: trueformat.options.put("alignTypeDecl", true);format.options.put("alignNamedArgs", true);format.options.put("alignEquality", false);format.options.put("alignAssignments", true);                                       // default: falseformat.options.put("alignRight", false);                                            // default: false// Indentationformat.options.put("identSpaces", 3);                                               // default: 4format.options.put("useTab", false);// Line Breaksformat.options.put("breaksComma", Format.Breaks.Before);                            // default: Format.Breaks.Afterformat.options.put("breaksProcArgs", false);format.options.put("breaksConcat", Format.Breaks.Before);format.options.put("breaksAroundLogicalConjunctions", Format.Breaks.Before);format.options.put("breaksAfterSelect", true);                                      // default: trueformat.options.put("commasPerLine", 1);                                             // default: 5format.options.put("breakOnSubqueries", true);format.options.put("breakAnsiiJoin", true);                                         // default: falseformat.options.put("breakParenCondition", true);                                    // default: falseformat.options.put("maxCharLineSize", 120);                                         // default: 128format.options.put("forceLinebreaksBeforeComment", false);                          // default: falseformat.options.put("extraLinesAfterSignificantStatements", Format.BreaksX2.Keep);   // default: Format.BreaksX2.X2format.options.put("flowControl", Format.FlowControl.IndentedActions);// White Spaceformat.options.put("spaceAroundOperators", true);format.options.put("spaceAfterCommas", true);format.options.put("spaceAroundBrackets", Format.Space.Default);//format.options.put("formatProgramURL", "default");return format;}public static String format(String str) {String res;try {//res = new Format().format(str);Format f = SQLFormatter.getFormat();res = f.format(str);}catch (Exception e){res = "Error: " + e.getMessage() + " [ " + SQLFormatter.getStackTrace(e) + " ]";}return res;}public static CLOB formatClob(oracle.sql.CLOB clob) throws SQLException{String str = clob.getSubString(1, (int) clob.length());String res = SQLFormatter.format(str);Connection conn = DriverManager.getConnection("jdbc:default:connection:");CLOB resClob = CLOB.createTemporary(conn, false, BLOB.DURATION_SESSION);resClob.setString(1L, res);return resClob;}
}
/

注:也可以从https://github.com/xtender/xt_scripts/blob/master/extra/SQLFormatte 下载最新版

4、创建PL/SQL PACKAGE

create or replace package SQLFormatter asFUNCTION Format(str in varchar2) RETURN VARCHAR2AS LANGUAGE JAVA NAME 'SQLFormatter.format(java.lang.String) return java.lang.String';FUNCTION FormatClob(str in clob) RETURN CLOBAS LANGUAGE JAVA NAME 'SQLFormatter.formatClob(oracle.sql.CLOB) return oracle.sql.CLOB';end;
/

5、测试

SQL> select anbob.SQLFormatter.formatclob(to_clob('select 1 a from dual')) qtext from dual;QTEXT
---------------------------------------------------------------------------------------
SELECT1 a
FROMdualSQL> select anbob.SQLFormatter.format('select 1 a,2 /*123 */ b,3 c, d from dual, dual d2') qtext from dual;QTEXT
----------------------------------------------------------------------------------------
SELECT1 a, 2 /*123 */ b, 3 c, d
FROMdual, dual d2

墨天轮原文链接:https://www.modb.pro/db/100274复制链接至浏览器或点击文末阅读原文查看)

关于作者

张维照,云和恩墨技术总监,Oracle ACE-A。2006年起从事数据库管理工作,2009年起从事O DBA维护工作,十余年来专注于Database技术和架构的研究,热衷于oracle数据库故障诊断、性能优化、内部原理、新特性的学习与分享,在BLOG分享大量的学习和案例经验。从事过多套TB级省级工商、医疗、交通、人社、政府、电信运营商等行业数据库项目从业经验。

END

推荐阅读:267页!2020年度数据库技术年刊

推荐下载:2020数据技术嘉年华PPT下载

2020数据技术嘉年华近50个PPT下载、视频回放已上传墨天轮平台,可在“数据和云”公众号回复关键词“2020DTC”获得!

你知道吗?我们的视频号里已经发布了很多精彩的内容,快去看看吧!↓↓↓

点击下图查看更多 ↓

云和恩墨大讲堂 | 一个分享交流的地方

长按,识别二维码,加入万人交流社群

请备注:云和恩墨大讲堂

  点个“在看”

你的喜欢会被看到❤

如何在Oracle数据库内格式化SQL或PL/SQL ?相关推荐

  1. oracle 的遍历语法,oracle pl/sql之pl/sql语法

    一.pl/sql基础 pl/sql分匿名块和命名块. 命名块:存储过程,函数,触发器,包等. pl/sql语句块分3部分: (1)声明部分 (2)可执行部分 (3)异常处理部分 其中可执行部分是语句块 ...

  2. ORACLE PL/SQL编程--PL/SQL块结构和组成元素

      本篇主要内容如下: 2.1   PL/SQL块 2.2   PL/SQL结构 2.3   标识符 2.4   PL/SQL 变量类型 2.4.1  变量类型 2.4.2  复合类型 2.4.2.1 ...

  3. 【PL/SQL】PL/SQL介绍

    一.PL/SQL的概述 PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/SQL是Oracle数据库对SQL语句的扩展.在普通SQL语句的使用 ...

  4. 线上分享丨自治时代DBA的技能库:SQL和PL/SQL的深度编程(附上期PPT和视频)-云和恩墨大讲堂201905...

    云和恩墨大讲堂又和大家见面了! 2018年云和恩墨大讲堂走过了祖国的大好河山,从大连到海口,从上海到昆明--不知道我们的课堂里有没有出现过你的身影. 2019我们也不会停下分享的脚步.不过这一次,我们 ...

  5. oracle pl sql注意问题,Oracle PL/SQL编写PL/SQL代码的注意事项

    (1)几个值得注意的关键字(2)变量常量赋值注意: ---------------------------------------------------------------------[@mor ...

  6. 用oracle怎么测试,oracle – 如何(单位)测试数据密集的PL / SQL应用程序

    有几种不同的PL / sql测试工具. Steven Feuerstein已经写了两个 utplsql和 Quest Code Tester for Oracle(以前的QUTE).我是utplsql ...

  7. Oracle杀事务数据库崩溃,关于pl/sql dev窗口崩溃导致锁表

    今天在用pl/sql dev写sql的时候,刚刚写到一个select XXX from table for update,打开了锁的按钮,进行了数据修改,这个时候没有commit,因为临时有事,所以先 ...

  8. oracle 调用java 类_oracle数据库PL SQL调用Java类程序代码

    作为JAVA程序员,对ORACLE的javasource一直是想找个机会下手的.呵呵!风高月夜,此时正下手之机. Oracle有提供一个叫"外部例程"来实现与其他编程语言的访问.例 ...

  9. Oracle学习笔记之五sp1,PL/SQL之BULK COLLECT

    Bulk Collect特性可以让我们在PL/SQL中能使用批查询,批查询在某些情况下能显著提高查询效率. BULK COLLECT 子句会批量检索结果,即一次性将结果集绑定到一个集合变量中,并从SQ ...

最新文章

  1. 前端/投资者能从阿里巴巴CACSC全球总决赛的项目路演中获得什么
  2. Windows上的原生Linux容器(盆盆的Kubecon课程分享)
  3. Android软件开发之盘点自定义View界面大合集(二)
  4. 通过URL传参数,然后第二个页面需要获取参数
  5. java 组合对象_Java 中组合模型之对象结构模式的详解
  6. python环境变量的配置_python基础教程-第一讲-带你进入python的世界
  7. 【转】Glut处理鼠标事件
  8. Install And Configure ColdFusion MX 6.1 on Windows
  9. 【Python】表格文件处理
  10. net use远程重启服务器
  11. Java程序设计(基础)- 概述
  12. Typora 下载及使用简介
  13. 用最通俗易懂的代码帮助新手理解javascript闭包
  14. google书签误删恢复(windows系统)
  15. 兔子、狼、狐狸、王八
  16. 计算机硬盘从盘的设置,图文解说:电脑硬盘的主从盘设置方法_清风一笑
  17. Github上一个优秀的Python学习资源:AwesomePythonResource
  18. 尼古拉·特斯拉,到底有多神?
  19. 构造和析构:construct,destory
  20. 再校大学生的电子产品清单

热门文章

  1. raspberry pi_在Raspberry Pi上使用Mathematica进行高级数学运算
  2. 分布式链接跟踪服务_微服务世界中的分布式跟踪
  3. 如何在Linux上运行Windows软件?
  4. 每天都有所收获_使技术保持最新状态会有所收获
  5. moodle 用户 权限_用户和社区反馈如何驱动Moodle
  6. 开源软件的安全性风险_开源安全性,Google惊喜等
  7. Docker容器真的安全吗?
  8. thinkphp 请求
  9. 五.激光SLAM框架学习之A-LOAM框架---项目工程代码介绍---3.laserOdometry.cpp--前端雷达里程计和位姿粗估计
  10. 视觉SLAM笔记(5) 编程基础