[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/prr.sql . -- Notes: This script is based on Tom Kyte's original printtbl code ( http://asktom.oracle.com ) -- For coding simplicity I'm using custom quotation marks ( q'\ ) so this script works -- 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 if regexp_like(lower(l_descTbl(i).col_name), lower('&1')) then 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 if;; 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满足需求就可以了。
[20251010]建立完善tpt的prr.sql脚本.txt
来源:这里教程网
时间:2026-03-03 22:45:05
作者:
编辑推荐:
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 商汤科技押注“1+X”:是破局利刃,还是盲目挣扎?
商汤科技押注“1+X”:是破局利刃,还是盲目挣扎?
26-03-03 - 数据库管理-第375期 26ai:除了改名,还有什么(20251015)
数据库管理-第375期 26ai:除了改名,还有什么(20251015)
26-03-03 - 数据库深夜革命,Oracle 26ai重磅发布!
数据库深夜革命,Oracle 26ai重磅发布!
26-03-03 - 位图索引的妙用
位图索引的妙用
26-03-03 - 数据库管理-第366期 Oracle 19c 多租户 ADG 环境的陷阱(20250911)
- 百奥赛图与中国创新药的全球突围
百奥赛图与中国创新药的全球突围
26-03-03 - 大洋集团未来或通过供股集资用于发展AI数字人、RWA架构及购买战略性数字资产
- 实战系列之外部表简化AI数据导入
实战系列之外部表简化AI数据导入
26-03-03 - 实战系列之自动优化向量搜索性能VECTOR_MEMORY_SIZE
实战系列之自动优化向量搜索性能VECTOR_MEMORY_SIZE
26-03-03 - 曹操出行勾勒未来出行的蓝图,开启“天地空一体化”时代
曹操出行勾勒未来出行的蓝图,开启“天地空一体化”时代
26-03-03
