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

[20251010]建立完善tpt的prr.sql脚本.txt

[20251010]建立完善tpt的prr.sql脚本.txt

--//昨天在测试时不小心输入pr命令时多输入一个r,没想到居然执行了,说明在本目录或者SQLPATH环境目录下存在prr.sql脚本。
--//当时忙着处理其他事情,先把这件事情放一放,今天上班优先做一个探究。

1.环境:
SCOTT@book01p> @ ver2
==============================
PORT_STRING                   : x86_64/Linux 2.4.xx
VERSION                       : 21.0.0.0.0
BANNER                        : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
BANNER_FULL                   : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
BANNER_LEGACY                 : Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 - Production
CON_ID                        : 0
PL/SQL procedure successfully completed.

$ echo $SQLPATH
/home/oracle/sqllaji:/home/oracle/sqllaji/tpt

$ locate prr.sql
/home/oracle/sqllaji/tpt-oracle-master/prr.sql
/home/oracle/sqllaji/tpt-oracle-master.20250702/prr.sql

--//很明显确实存在1个prr.sql脚本。仔细查看prr.sql脚本发现存在如下内容:
regexp_like(lower(l_descTbl(i).col_name), lower('&1'))

--//也就是可以根据参数1,输入正则表达式显示仅仅显示需要的字段。不过我估计作者也很少使用,存在一些小问题,根据pr.sql脚本
--//做一些改动.

2.改动后脚本如下:
$ cat -v tpt/pr.sql
.
-- Notes:   This script is based on Tom Kyte's original printtbl code ( http://asktom.oracle.com )
--          For coding simplicity (read: lazyness) I'm using custom quotation marks ( q'\ ) so
--          this script works only from Oracle 10gR2 onwards

def _pr_tmpfile=&_tpt_tempdir/pr_&_tpt_tempfile..tmp
def _set_tmpfile=&_tpt_tempdir/set_&_tpt_tempfile..sql

@@saveset
set serverout on size 1000000 termout off
save &_pr_tmpfile replace
set termout on

0 c clob := q'^F
0 declare

999999      ^F';;
999999      l_theCursor     integer default dbms_sql.open_cursor;;
999999      l_columnValue   varchar2(4000);;
999999      l_status        integer;;
999999      l_descTbl       dbms_sql.desc_tab;;
999999      l_colCnt        number;;
999999  begin
999999      dbms_sql.parse(  l_theCursor, c, dbms_sql.native );;
999999      dbms_sql.describe_columns( l_theCursor, l_colCnt, l_descTbl );;
999999      for i in 1 .. l_colCnt loop
999999          dbms_sql.define_column( l_theCursor, i,
999999                                  l_columnValue, 4000 );;
999999      end loop;;
999999      l_status := dbms_sql.execute(l_theCursor);;
999999      while ( dbms_sql.fetch_rows(l_theCursor) > 0 ) loop
999999          dbms_output.put_line( '==============================' );;
999999          for i in 1 .. l_colCnt loop
999999                  dbms_sql.column_value( l_theCursor, i,
999999                                         l_columnValue );;
999999                  dbms_output.put_line
999999                      ( rpad( l_descTbl(i).col_name,
999999                        30 ) || ': ' || l_columnValue );;
999999          end loop;;
999999      end loop;;
999999  exception
999999      when others then
999999          dbms_output.put_line(dbms_utility.format_error_backtrace);;
999999          raise;;
999999 end;;
/

set serverout off term on
@@loadset

get &_pr_tmpfile nolist
host &_delete &_pr_tmpfile &_set_tmpfile

--//注:里面的^F在linux下的插入模式按ctrl+v,ctrl+f输入,这样SQL语句里基本不存在^F字符,不会遇到冲突的可能。
--//另外注意脚本开始的. 不是多余的字符。

3.测试:
SCOTT@book01p> select * from emp where sal>3400;
     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7839 KING       PRESIDENT            1981-11-17 00:00:00       5000                    10

--//@ prr * 相当于执行@ pr ,结果我不贴出了。

SCOTT@book01p> @ prr e
==============================
EMPNO                         : 7839
ENAME                         : KING
HIREDATE                      : 1981-11-17 00:00:00
DEPTNO                        : 10
PL/SQL procedure successfully completed.
--//输入E表示输出仅仅含有e字符的字段。

SCOTT@book01p> @ prr ^e
==============================
EMPNO                         : 7839
ENAME                         : KING
PL/SQL procedure successfully completed.
--//输入E开头的字段。

SCOTT@book01p> @ prr deptno|ename|empno
==============================
EMPNO                         : 7839
ENAME                         : KING
DEPTNO                        : 10
PL/SQL procedure successfully completed.
--//输入deptno|ename|empno,表示输出deptno,ename,empno三个字段。

SCOTT@book01p> @ prr [^HIREdate|mgr]
==============================
EMPNO                         : 7839
ENAME                         : KING
JOB                           : PRESIDENT
SAL                           : 5000
COMM                          :
DEPTNO                        : 10
PL/SQL procedure successfully completed.
--//表示输出除HIREdate,mgr外其他字段。

SCOTT@book01p> @ prr e$
==============================
ENAME                         : KING
HIREDATE                      : 1981-11-17 00:00:00
PL/SQL procedure successfully completed.
--//表示输出e结尾的字段。

--//还可以像pr.sql那样调用prr.sql,例子如下:
SCOTT@book01p> select * from emp where sal>3400
  2  @ prr deptno|ename|empno
==============================
EMPNO                         : 7839
ENAME                         : KING
DEPTNO                        : 10
PL/SQL procedure successfully completed.

SCOTT@book01p> select * from v$database
  2  @ prr supp|^dbid
==============================
DBID                          : 1617337831
SUPPLEMENTAL_LOG_DATA_MIN     : YES
SUPPLEMENTAL_LOG_DATA_PK      : NO
SUPPLEMENTAL_LOG_DATA_UI      : NO
SUPPLEMENTAL_LOG_DATA_FK      : NO
SUPPLEMENTAL_LOG_DATA_ALL     : NO
SUPPLEMENTAL_LOG_DATA_PL      : NO
SUPPLEMENTAL_LOG_DATA_SR      : NO
PL/SQL procedure successfully completed.

--//注:该脚本还调用saveset.sql,loadset.sql脚本,如果你不想安装tpt的整个脚本集合。可以自己做一点点改动就可以实现相似的
--//功能。
--//注解saveset,loadset,自己定义_pr_tmpfile,_set_tmpfile,_delete满足需求就可以了。
http://www.hskmm.com/?act=detail&tid=28247

相关文章:

  • 第十一篇
  • testtest
  • 题解:AT_arc138_f [ARC138F] KD Tree
  • SP33 TRIP - Trip 个人题解
  • 经营不是老板一个人的事 - 智慧园区
  • Codeforces Round 1051 (Div. 2)[A ~E]
  • 如何在 Spring Boot 应用中配置多个 Spring AI 的 LLM 客户端
  • 使用eBPF技术保护FastAPI安全
  • 项目案例作业2:对案例进行面向对象分析
  • JavaSE
  • CF2064E Mycraft Sand Sort
  • Servlet笔记
  • 第一个博客
  • k8s 主节点重启后 从节点 get 异常 - 教程
  • 多维索引技术优化数据湖查询性能
  • Umi-OCR_文字识别工具 免安装使用教程(附下载安装包)!永久免费,开源离线OCR识别软件下载
  • 【汇总】OPPO r9m 分区名、分区功能
  • 04_线程池实现
  • #D251010D. 未命名 10 (unnamed)
  • 【JAVA】从入门到放弃-01-HelloWorld - 指南
  • 离线应用程序
  • 2025表面瑕疵检测厂家TOP5推荐:表面瑕疵检测,薄膜瑕疵检测,瑕疵检测设备,瑕疵在线检测,铝箔瑕疵在线检测,外观瑕疵检测机,薄膜瑕疵检测仪,陶瓷膜瑕疵检测各种类型检测,精准高效的质量守护
  • 表格识别:不仅能识别文字,更能理解表格的结构和逻辑关系,实现输出可编辑、可分析的结构化数据
  • 同步FIFO
  • P13274 [NOI2025] 三目运算符
  • Microsoft Office不小心卸载或重装系统后,如何重新安装 ... - sherlock
  • HTTPS 抓包乱码怎么办?原因剖析、排查步骤与实战工具对策(HTTPS 抓包乱码、gzipbrotli、TLS 解密、iOS 抓包) - 实践
  • 使用JaCoCo进行代码覆盖率分析
  • 计算机视觉专家入选德国国家科学院
  • 2025 年工程管理软件/软件系统/软件App/软件平台/工程管理软件和验房系统公司/企业推荐榜:数字化转型下的实用选型指南