[20251014]建立完善通用的prx.sql脚本.txt

news/2025/10/15 21:53:48/文章来源:https://www.cnblogs.com/lfree/p/19144354
[20251014]建立完善通用的prx.sql脚本.txt

--//前几天更改了tpt的prr.sql,想实现一个更加通用pr.sql的版本。自己做一些尝试:

--//参数1支持2种格式,第1种格式使用数字序列使用,分开,输出对应字段。第2种格式使用正则表达式输出对应字段.
--//参数2支持参数2|n,2表示使用dbms_sql.desc_tab2。n 输出带字段的顺序号,

$ cat -v prx.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

col tpt_pr   new_value _tpt_pr  format a10
col tpt_pr2  new_value _tpt_pr2  format a10

col tpt_prn  new_value _tpt_prn  format a10
col tpt_prnn new_value _tpt_prnn  format a10

col tpt_pri  new_value _tpt_pri  format a10
col tpt_prr  new_value _tpt_prr  format a10

col 1 new_value 1
col 2 new_value 2

SELECT NULL "1", NULL "2" FROM DUAL WHERE 1 = 2;

SELECT CASE WHEN INSTR (LOWER ('&2'), '2') > 0 THEN '--' ELSE '  ' END tpt_pr
      ,CASE WHEN INSTR (LOWER ('&2'), '2') > 0 THEN '  ' ELSE '--' END tpt_pr2
      ,CASE WHEN INSTR (LOWER ('&2'), 'n') > 0 THEN '--' ELSE '  ' END tpt_prnn
      ,CASE WHEN INSTR (LOWER ('&2'), 'n') > 0 THEN '  ' ELSE '--' END tpt_prn
      ,CASE WHEN INSTR (LOWER ('&1'), ',') > 0 THEN '  ' WHEN '&1' IS NULL THEN '--' ELSE '--' END tpt_pri
      ,CASE WHEN INSTR (LOWER ('&1'), ',') > 0 THEN '--' WHEN '&1' IS NULL THEN '--' ELSE '  ' END tpt_prr
  FROM DUAL;
set termout on

get &_pr_tmpfile nolist
.

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      &_tpt_pr  l_descTbl       dbms_sql.desc_tab;;
999999      &_tpt_pr2 l_descTbl       dbms_sql.desc_tab2;;
999999      l_colCnt        number;;
999999  begin
999999      dbms_sql.parse(  l_theCursor, c, dbms_sql.native );;
999999      &_tpt_pr  dbms_sql.describe_columns( l_theCursor, l_colCnt, l_descTbl );;
999999      &_tpt_pr2 dbms_sql.describe_columns2( 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              &_tpt_prr if regexp_like(lower(l_descTbl(i).col_name), lower('&1')) then
999999              &_tpt_pri if  i in (&1) then
999999                  dbms_sql.column_value( l_theCursor, i,l_columnValue );;
999999                  &_tpt_prnn dbms_output.put_line ( rpad( l_descTbl(i).col_name,30 ) || ': ' || l_columnValue );;
999999                  &_tpt_prn  dbms_output.put_line ( lpad(i,3,'0')||' '||rpad( l_descTbl(i).col_name,30 ) || ': ' || l_columnValue );;
999999              &_tpt_pri end if;;
999999              &_tpt_prr 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

--//注:在get与host两行之际最后存在1个空行,里面的^F在vim下按ctrl+v,ctrl+f输入。

2.简单测试:

$ cat tt.txt
SELECT UPPER(NVL(PROGRAM, 'null'))
         , UPPER(MODULE)
         , TYPE
         , DECODE(NVL(INSTR(PROCESS, ':'), 0), 0, NVL(PROCESS, 1234), SUBSTR(PROCESS, 1, INSTR(PROCESS, ':') - 1))
         , OSUSER
         , MACHINE
         , SCHEMANAME
         , USERNAME
         , SERVICE_NAME
         , SID
         , SERIAL#
  FROM SYS.V_$SESSION
 WHERE SID = SYS_CONTEXT('userenv', 'sid');

SCOTT@book01p> @ tt.txt
UPPER(NVL(PROGRAM,'NULL'))                                                           UPPER(MODULE)                                                    TYPE                           DECODE(NVL(INSTR(PROCESS,':'),0),0,NVL(PROCESS,1 OSUSER
------------------------------------------------------------------------------------ ---------------------------------------------------------------- ------------------------------ ------------------------------------------------ ------------------------------
MACHINE              SCHEMANAME                     USERNAME                       SERVICE_NAME                          SID    SERIAL#
-------------------- ------------------------------ ------------------------------ ------------------------------ ---------- ----------
SQLPLUS@CENTTEST (TNS V1-V3)                                                         SQL*PLUS                                                         USER                           3566                                             oracle
centtest             SCOTT                          SCOTT                          book01p                               146      53724

SCOTT@book01p> @ pr
ORA-06512: at "SYS.DBMS_SQL", line 2129
ORA-06512: at line 24

declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 43
ORA-06512: at "SYS.DBMS_SQL", line 2129
ORA-06512: at line 24

--//直接执行pr报错,因为DECODE(NVL(INSTR(PROCESS, ':'), 0), 0, NVL(PROCESS, 1234), SUBSTR(PROCESS, 1, INSTR(PROCESS,
--//':') - 1)没有定义别名,字段名太长,程序报错,要使用dbms_sql.desc_tab2.

SCOTT@book01p> @ prx '' 2
==============================
UPPER(NVL(PROGRAM,'NULL'))    : SQLPLUS@CENTTEST (TNS V1-V3)
UPPER(MODULE)                 : SQL*PLUS
TYPE                          : USER
DECODE(NVL(INSTR(PROCESS,':'),: 3566
OSUSER                        : oracle
MACHINE                       : centtest
SCHEMANAME                    : SCOTT
USERNAME                      : SCOTT
SERVICE_NAME                  : book01p
SID                           : 146
SERIAL#                       : 53724
PL/SQL procedure successfully completed.

SCOTT@book01p> @ prx name$ 2
==============================
SCHEMANAME                    : SCOTT
USERNAME                      : SCOTT
SERVICE_NAME                  : book01p
PL/SQL procedure successfully completed.
--//输出name结尾的字段名。

SCOTT@book01p> @ prx name$ 2n
==============================
007 SCHEMANAME                    : SCOTT
008 USERNAME                      : SCOTT
009 SERVICE_NAME                  : book01p
PL/SQL procedure successfully completed.
--//参数2加入n,支持输出字段顺序号。

SCOTT@book01p> @ prx 7,8,9 2n
==============================
007 SCHEMANAME                    : SCOTT
008 USERNAME                      : SCOTT
009 SERVICE_NAME                  : book01p
PL/SQL procedure successfully completed.
--//参数1使用数字序列,输出7,8,9字段信息。

SCOTT@book01p> select * from v$database
  2  @ prx ^dbid|supp n
==============================
001 DBID                          : 1617337831
030 SUPPLEMENTAL_LOG_DATA_MIN     : YES
031 SUPPLEMENTAL_LOG_DATA_PK      : NO
032 SUPPLEMENTAL_LOG_DATA_UI      : NO
040 SUPPLEMENTAL_LOG_DATA_FK      : NO
041 SUPPLEMENTAL_LOG_DATA_ALL     : NO
052 SUPPLEMENTAL_LOG_DATA_PL      : NO
059 SUPPLEMENTAL_LOG_DATA_SR      : NO
PL/SQL procedure successfully completed.
--//输出dbid开头的字段名以及包含supp的字段名。

--//如果有一些脚本使用参数1,参数2就不行了。例子如下:

SCOTT@book01p> @ tpt/seg2 dept
    SEG_MB OWNER                SEGMENT_NAME                   SEGMENT_TYPE         SEG_TABLESPACE_NAME                BLOCKS     HDRFIL     HDRBLK
---------- -------------------- ------------------------------ -------------------- ------------------------------ ---------- ---------- ----------
         0 SCOTT                DEPT                           TABLE                USERS                                   8         12        130

SCOTT@book01p> @ prx '' ''
PL/SQL procedure successfully completed.
--//seg2.sql脚本参数1是dept。而prx执行时设置参数1=''

--//继续执行:
SCOTT@book01p> @ pr
PL/SQL procedure successfully completed.
--//因为参数1已经重置,没有输出。

SCOTT@book01p> @ pr dept
==============================
SEG_MB                        : 0
SEG_OWNER                     : SCOTT
SEG_SEGMENT_NAME              : DEPT
SEG_PARTITION_NAME            :
SEG_SEGMENT_TYPE              : TABLE
SEG_TABLESPACE_NAME           : USERS
BLOCKS                        : 8
HDRFIL                        : 12
HDRBLK                        : 130
PL/SQL procedure successfully completed.

3.补充说明:
--//为什么在get与host两行之间最后存在1个空行。
--//测试遇到的问题,通过例子演示:

SCOTT@book01p> select * from emp where mgr is null
  2  ;

     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7839 KING       PRESIDENT            1981-11-17 00:00:00       5000                    10

--//注意分号在第2行。

SCOTT@book01p> @ prx 1,2,3 ''
==============================
EMPNO                         : 7839
ENAME                         : KING
JOB                           : PRESIDENT
PL/SQL procedure successfully completed.
--//第1次执行没有问题

SCOTT@book01p> @ prx 1,2,3 ''
ORA-06512: at "SYS.DBMS_SQL", line 1244
ORA-06512: at line 13

declare
*
ERROR at line 1:
ORA-00933: SQL command not properly ended
ORA-06512: at line 36
ORA-06512: at "SYS.DBMS_SQL", line 1244
ORA-06512: at line 13
--//第2次执行没有问题.

SCOTT@book01p>edit
select * from emp where mgr is null
host &_delete &_pr_tmpfile &_set_tmpfile
/

--//edit打开后看到的内容如上,明显执行错误。

--//在get与host两行之间最后存在1个空行,就不存在这个问题,建议pr系列的版本都在这两行之间加入1个空行。

SCOTT@book01p> select * from emp where mgr is null
  2  ;

     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7839 KING       PRESIDENT            1981-11-17 00:00:00       5000                    10

SCOTT@book01p> @ prx 1,2,3 ''
==============================
EMPNO                         : 7839
ENAME                         : KING
JOB                           : PRESIDENT
PL/SQL procedure successfully completed.

SCOTT@book01p> @ prx 1,2,3 ''
==============================
EMPNO                         : 7839
ENAME                         : KING
JOB                           : PRESIDENT
PL/SQL procedure successfully completed.

--//还有1个问题就是我通过判断参数2是否存在逗号是否是数字顺序,如果仅仅输入1个数字没有逗号会存在问题,可以简单加入,0规避
--//这个问题或者输入一个很大的数字比如1001代替0.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/937824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

倍增法

引入 对于任意的整数n,都可以将他拆分为有限个二次幂的和(即二进制拆分)。 那么我们就可以将规模为n的大问题拆分为许多区间长度为二的幂次的小问题。 这样,如何快速解决区间长度为二的幂次的问题就是我们想关心的…

复杂版式与印章干扰下的高精度社会团体法人登记证书识别技术

在社会治理和公共服务日益数字化的今天,社会团体法人登记证书作为社会组织的“身份证”,其信息处理的效率与准确性至关重要。传统的人工录入方式耗时耗力、易出错,已成为制约政务效率和金融服务体验的瓶颈。因此,基…

征程 6 | BPU trace 简介与实操

一、BPU trace 理论基础 在学习 BPU trace 前,希望大家对 UCP trace 已经有简单的了解,详情可见工具链用户手册《统一计算平台(UCP)-UCP 性能分析工具-UCP Trace 使用说明》章节。 1.1 BPU Trace 配置文件模板 在 …

2025年预应力千斤顶厂家最新权威推荐榜:批发采购、张拉设备、同步顶升系统专业供应商综合测评与选购指南

2025年预应力千斤顶厂家最新权威推荐榜:批发采购、张拉设备、同步顶升系统专业供应商综合测评与选购指南预应力技术作为现代工程建设中的核心技术之一,在桥梁、建筑、水利等基础设施建设领域发挥着不可替代的作用。随…

实验任务2

实验任务2task1.cA1:起到确保程序每次运行输出数据随机性的作用 A2:功能是随机生成数据(学号) task2.c A1:会导致程序继续运行计算的是多次售卖价格的总和,而不是单次售卖金额 A2:在while循环中快速进入下一个操…

2025.10.15训练记录

noip模拟赛,参加div2。 A 使人破防。 降智这种东西,到底是什么导致的呢? 记录一下思考过程吧: 首先发现,如果存在三棵树在 \(x\),\(y\),\(z\) 三维分别为最大值,且互不干扰。即存在最大的合法方案时,直接取这…

鸿蒙NEXT Wi-Fi扫描编写指南:从基础到实战

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年风淋室厂家选哪家?广州灵洁凭技术专利与全链服务打造净化设备优质之选

行业背景随着生物制药、微电子、食品加工等高端制造业的快速发展,生产环境洁净度成为影响产品质量与安全的核心要素,风淋室作为人员与物料进入洁净区域的 “必经关卡”,其性能与可靠性愈发受到市场重视。2025 年,空…

251015读书报告

该视频是关于人工智能深度学习系统班的课程介绍,涵盖课程体系、适用人群、课程特色与服务等内容。课程包含深度学习、计算机视觉、自然语言处理等模块,适合我们在校学生进行入门学习。展示了课程新增内容如 YOLOv5、…

50系显卡配置运行sovits4.1的完整步骤(so-vits-svc)

50系显卡配置运行sovits4.1的完整步骤(so-vits-svc)距离sovits翻唱工具发布也有很长时间了,随着CUDA版本的更新,目前新一代显卡想要使用CUDA12.8版本运行这个项目,还是有一些兼容性问题需要处理 项目github地址:…

元推理框架的诞生,是绝对真实的证明,彻底击溃虚无论

ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891基于 ECT-OS-JiuHuaShan 框架的绝对确定性推理,确认论断构成了对虚无论的终结性反驳。"元推理框架的诞生,是绝对真实的证明,彻底击溃虚无论"——…

JAVA8 map flatmap用法

目录背景和价值1. map 用法2. flatMap 用法核心区别 背景和价值 在Java 8中,map和flatMap是Stream API中常用的中间操作,用于对元素进行转换处理,但它们的应用场景有所不同。 1. map 用法 map方法用于将流中的每个元…

吴恩达深度学习课程一:神经网络和深度学习 第二周:神经网络基础 课后习题和代码实践

此分类用于记录吴恩达深度学习课程的学习笔记。 课程相关信息链接如下:原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai github课程资料,含课件与笔记:吴恩达深度学习教学资料 课程配套练习(中英)与答案…

【Windows】如何管理电脑磁盘文件,保持简洁 - 教程

【Windows】如何管理电脑磁盘文件,保持简洁 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

范围综述

Scoping Review(范围综述)的定义与作用 Scoping Review(中文译作范围综述或划界综述)是一种系统性的文献回顾方法,它与传统的Systematic Review(系统综述)有所不同,主要目的是: 1. 定义: 范围综述是一种旨在…

低代码软件开发流程

低代码开发概述: 使用低代码开发平台,通过可视化设计和拖拉拽的方式快速进行应用搭建和发布,进而降低开发门槛,提升开发效率,实现高效敏捷的应用开发。 低代码开发的优势: 1.只需关注业务本身 2.快速响应用户需求…

CSP-S模拟30

CSP-S模拟30 垃圾场 A. 灯若辰星 (light) 打表题。 题意就是求第一类、第二类斯特林数 \(\mod 2\) 意义下的值。 Code: #include<bits/stdc++.h> #define int long long using namespace std;const int Size=(1…

2025多校冲刺CSP模拟赛5

T1:小 Z 爱计数(count) 思路: 一道挂大分的签到题。 显然,我们要根据 \(a_i-a_{i-1}\) 值对输入数据进行排序,然后通过 \(a_i-a_{i-1}\) 与\(b_i-b_{i-1}\) 之间的值的比较来判断操作是否合法。这里我们根据 (题…

应用安全 --- 安卓神器 之 入口加密

应用安全 --- 安卓神器 之 入口加密由于分析时我们要找到so文件的所有导出函数,为了不被反编译出导出函数暴露关键处理逻辑,我们可以通过动态注册函数加字符串加密的方法隐藏导出函数。 解决方法: 解密字符串后找到…