注册
文本表试验类CLS_TXTTAB
专栏/技术分享/ 文章详情 /

文本表试验类CLS_TXTTAB

Hanson.T 2025/06/06 155 1 0
摘要

之前做 SQL执行信息辅助工具 ET2 时,在脚本中实现了一个简单的文本表格功能。现在将这个功能提取成独立的类对象,调用起来比之前嵌入式的能方便些,也清爽些。

在使用前,先要注意显示字体问题,如果使用非等宽字体,在输出结果时会出现表格错位问题,类似于下面图中的样子就没法看了
image.png

我这里常用的等宽字体为 Courier New 或 Consolas,个人感觉 Consolas 更合用些。
image.png

源码:
达梦文本表实验_TXTTAB_202506051004.sql

调用方式比较简单,可以参考以下代码:

DECLARE V_TAB CLS_TXTTAB; --声明文本表变量 BEGIN V_TAB := NEW CLS_TXTTAB(); --实例化 V_TAB.SHOW_ROWNO := TRUE; --显示行号,默认为FALSE V_TAB.ROW_LINE := TRUE; --显示行间分割线,默认为FALSE --声明文本表结构 V_TAB.REGCOL('Col1','VARCHAR2','Column 1'); V_TAB.REGCOL('Col2','VARCHAR2','Column 2'||chr(10)||'Multiline'); V_TAB.REGCOL('Col3','INT','Column 3'||chr(10)||'Fixed Width',30); --最后参数为显示宽度,单位为字符宽,30即30个ASC字符宽度 --设置文本表数据内容 V_TAB.SETITEM(1,'Col1','test1'); V_TAB.SETITEM(1,'Col2','datatest'); V_TAB.SETITEM(1,'Col3',123); V_TAB.SETITEM(2,'Col1','test2'||chr(10)||'2 lines'); V_TAB.SETITEM(2,'Col2','datatest2'); V_TAB.SETITEM(2,'Col3',2342344); --可以通过列ID方式设置数据 V_TAB.SETITEM(3,1,'test3 one line'); V_TAB.SETITEM(3,'Col2','datatest3'||chr(10)||'datatest3 LINE 2'||chr(10)||'datatest3 LINE 3'||chr(10)||'datatest3 LINE 4'); V_TAB.SETITEM(3,3,3456351345); --格式化输出文本表 PRINT(V_TAB.GENTXT); END;

执行输出结果为:

+---+--------------+----------------+------------------------------+ |RN | Column 1 | Column 2 | Column 3 | | | | Multiline | Fixed Width | +---+--------------+----------------+------------------------------+ | 1|test1 |datatest | 123| +---+--------------+----------------+------------------------------+ | 2|test2 |datatest2 | 2342344| | |2 lines | | | +---+--------------+----------------+------------------------------+ | 3|test3 one line|datatest3 | 3456351345| | | |datatest3 LINE 2| | | | |datatest3 LINE 3| | | | |datatest3 LINE 4| | +---+--------------+----------------+------------------------------+

如果 SHOW_ROWNO 和 ROW_LINE 两参数均不设置或设置为FALSE,则输出结果为:

+--------------+----------------+------------------------------+ | Column 1 | Column 2 | Column 3 | | | Multiline | Fixed Width | +--------------+----------------+------------------------------+ |test1 |datatest | 123| |test2 |datatest2 | 2342344| |2 lines | | | |test3 one line|datatest3 | 3456351345| | |datatest3 LINE 2| | | |datatest3 LINE 3| | | |datatest3 LINE 4| | +--------------+----------------+------------------------------+

在实际使用过程中,可能需要同时记录多个文本表内容,这样就可以根据实际情况,把类对象组织成表类型使用。
例如:

DECLARE TYPE TT_TXTTAB IS TABLE OF CLS_TXTTAB INDEX BY INTEGER; V_TXTTABS TT_TXTTAB; V_TABCNT INT; V_COLCNT INT; V_ROWCNT INT; V_DATLEN INT; BEGIN V_TABCNT := 4; FOR IDX_TAB IN 1 .. V_TABCNT LOOP V_TXTTABS(IDX_TAB) := NEW CLS_TXTTAB(); --注意不要遗漏实例化操作 V_TXTTABS(IDX_TAB).SHOW_ROWNO := ROUND(SF_RANDOM_RAND); V_TXTTABS(IDX_TAB).ROW_LINE := ROUND(SF_RANDOM_RAND); V_COLCNT := ROUND(SF_RANDOM_RAND * 10 + 1); V_ROWCNT := ROUND(SF_RANDOM_RAND * 10 + 1); FOR IDX_COL IN 1 .. V_COLCNT LOOP V_TXTTABS(IDX_TAB).REGCOL('C'||IDX_COL,'VARCHAR2'); END LOOP; FOR IDX_ROW IN 1 .. V_ROWCNT LOOP FOR IDX_COL IN 1 .. V_COLCNT LOOP V_DATLEN := ROUND(SF_RANDOM_RAND * 20 + 1); V_TXTTABS(IDX_TAB).SETITEM(IDX_ROW,IDX_COL,SF_RANDOM_STRING('A',V_DATLEN)); END LOOP; END LOOP; END LOOP; FOR IDX_TAB IN 1 .. V_TABCNT LOOP PRINT('TAB'||IDX_TAB||':'); PRINT(V_TXTTABS(IDX_TAB).GENTXT); PRINT(' '); END LOOP; END;

输出结果为:

TAB1: +---+-------------------+--------------------+--------------------+----------------+-----------------+--------------------+--------------------+ |RN | C1 | C2 | C3 | C4 | C5 | C6 | C7 | +---+-------------------+--------------------+--------------------+----------------+-----------------+--------------------+--------------------+ | 1|kxFkWZ |lbXvoJIilyycNIf |DQBjteWrCah |nFWn |XuuEfpWykEn |rNu |AOLKCzvsVNTJLh | +---+-------------------+--------------------+--------------------+----------------+-----------------+--------------------+--------------------+ | 2|oXvxtbbfbzOUGvEi |zkbxTUWGuxqTkO |wrYKjlbFXuBHclPHGqPA|VMvjI |doeAmYN |oupudVyJoJCJrXHyFr |kzJJxjpdKFqs | +---+-------------------+--------------------+--------------------+----------------+-----------------+--------------------+--------------------+ | 3|Mow |PfMUBOTn |pMPkpXEroNihl |slYbdxahYeoPqYUo|BsUkmPbKljCi |mlHbwBoiUmZBnMGVlfrH|opvvl | +---+-------------------+--------------------+--------------------+----------------+-----------------+--------------------+--------------------+ | 4|lKFNwDpdv |gHG |xtdklfrC |TfoDPHdvhagC |utunx |zEuFbYfSCFvjbwPzrz |SGuGUOoolgwRvZGj | +---+-------------------+--------------------+--------------------+----------------+-----------------+--------------------+--------------------+ | 5|bzhBluwIxekIyjKtZJ |gFbU |WQ |xTqNDsjk |RBgERQOOiCzcch |gjpKEVEHvf |urmuRVOYgf | +---+-------------------+--------------------+--------------------+----------------+-----------------+--------------------+--------------------+ | 6|JMqqZvaoqyYdYZvZbao|LYFoHvilPeG |ZAII |CHVpAF |FPDcrvAWQGcD |Lc |tmPKSZdgcyfVTn | +---+-------------------+--------------------+--------------------+----------------+-----------------+--------------------+--------------------+ | 7|UmCeTceAb |ooMImQonnYPMtXqRQuVK|wJXNETbRqysavtmVS |wWoLPhiPcGdQoKti|gUoHzduzU |Ez |GJYjXsNEvVfiF | +---+-------------------+--------------------+--------------------+----------------+-----------------+--------------------+--------------------+ | 8|jz |pFuvCDOlNHE |PNrJu |MErGfTPvV |bw |hSBmTBhmvOsnuLamt |FhGYqPmfpoJKQdqCjiTs| +---+-------------------+--------------------+--------------------+----------------+-----------------+--------------------+--------------------+ | 9|XhYhMVHWzqDcclgwW |odFksQXspsVTMkon |ZdHkUFRxgLLGclCvXiVB|RrZFePxuBMG |TsEO |IwKSsC |xtZqC | +---+-------------------+--------------------+--------------------+----------------+-----------------+--------------------+--------------------+ | 10|NCaFcrTZTVLOSKg |nykrvANbwhTTMegLMzCQ|SEQIWvhJf |vQMHNSKEkfxIxwo |vaGIxvGeFDj |BNDgFfAbACRHWvc |QxBnWsLAHaEkiFmR | +---+-------------------+--------------------+--------------------+----------------+-----------------+--------------------+--------------------+ | 11|jaxgAw |gTeqFwW |Ern |nthmoph |jawaaZWLglPDqqmmZ|OGdfxamxOp |CDULbv | +---+-------------------+--------------------+--------------------+----------------+-----------------+--------------------+--------------------+ TAB2: +---------------------+-------------------+--------------------+ | C1 | C2 | C3 | +---------------------+-------------------+--------------------+ |BsmMVcyuTsv |EBA |AEbzgV | |SWTgOQhpGXkkkFRmTv |nToUCqivInWzVIXmdrY|Z | |iwWqUQWpkNQyztBwmBfHb|ddGxQodB |WqltZchWKqYdTJiQsNGf| +---------------------+-------------------+--------------------+ TAB3: +---+--------------------+-------------------+--------------------+------------------+-----------------+--------------------+ |RN | C1 | C2 | C3 | C4 | C5 | C6 | +---+--------------------+-------------------+--------------------+------------------+-----------------+--------------------+ | 1|BiBz |LUjXrqeLm |mXLlMamBE |ZLApTQclJfhfzybOE |OgbGqWxrjnX |STgqAVLnlLFgxXaED | +---+--------------------+-------------------+--------------------+------------------+-----------------+--------------------+ | 2|tQooDRVSLNMBUigAvBs |moKsjBCwKssQMiDK |YbzKeeKilHRy |NmgXayLR |sfiwgXCU |qjJMh | +---+--------------------+-------------------+--------------------+------------------+-----------------+--------------------+ | 3|xistjKrWWSODcZawnz |TIXkcuSgsTbwOZkqVT |uALnatsXmQIPOTqv |XoEuXARPVfZAKG |UNQ |YYFYgaXkQWzjSXcmLstI| +---+--------------------+-------------------+--------------------+------------------+-----------------+--------------------+ | 4|SMH |aTlw |NKTIwVUArNowj |WPepglG |rZZfMi |dSk | +---+--------------------+-------------------+--------------------+------------------+-----------------+--------------------+ | 5|uJdMeyECiNRXLagyEVjf|hEQwAQarzmCL |lWpWMcQvLxIJapbFBdJM|jYYgBrtofIsOsd |GbIdmlMwAdLk |Tv | +---+--------------------+-------------------+--------------------+------------------+-----------------+--------------------+ | 6|emErvl |gG |aEPcGNzFmXQlOdGxn |ARtZGOiUnMN |kqfLEdfcFxscnn |DkqEmYNrQ | +---+--------------------+-------------------+--------------------+------------------+-----------------+--------------------+ | 7|sjaJBNAW |IgmMsKJdJnnXljxpwUw|dLaSrDOHejbcCdQWznin|vxYHvrC |MbcjRgpDyOclk |NoiZRiFWPnuQkW | +---+--------------------+-------------------+--------------------+------------------+-----------------+--------------------+ | 8|AoNTaKtndt |OqDS |eybzPNluKXvK |KHpZRQynJgtqTIqFQk|DJuebvbFkLVuHSeQm|okRnXHc | +---+--------------------+-------------------+--------------------+------------------+-----------------+--------------------+ TAB4: +---+----------------+---------------------+--------------------+-------------------+---------------------+-------------+-----------------+--------------------+ |RN | C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 | +---+----------------+---------------------+--------------------+-------------------+---------------------+-------------+-----------------+--------------------+ | 1|nDcfAQMBukdJdHWW|SrlnMLCOpZLTLngtQtVFh|IxGaqgspptauPICAutVH|mkJIeJKZvgktiQVDNpO|fcwbUxRCfUMgccxHukFr |HwXrZnfZ |YXmqZAvzxcbduxBTs|YOObrhHWTdLMSwnKNCVm| | 2|WauYKqYxt |veGZpaYivz |hbZUaIsVNATbVLknvSB |NU |CXLczWXLgojcGlegrRngA|L |yRJj |nvGbTzuYFqZFRpMhb | | 3|EZlgaq |xPyyktaOsVO |VIZqPHt |ZlCGZpofgwWbFp |CoEmRVXLjZ |fnOcAFqAikaPa|rIaafHngZ |ydQpNvkC | +---+----------------+---------------------+--------------------+-------------------+---------------------+-------------+-----------------+--------------------+

另外,目前简单实现了 GETITEM 方法,能够从文本表中取出指定单元格数据内容,已前面脚本为例,可参考下图结果

image.png
这个文本表功能很简单,适用场景也有限,也就是在文本类数据格式化输出时能派上点用场。

如果有兴趣,可以根据自己的需要增加更多的接口,把文本表改造成一个数据存储类,比如增加以下功能:
增加空行、删除行、增删后行号重排、数据排序、查找、anydata类型引入、数据类型一致性验证/转换及异常抛出。。。。
如果能再进一步,更理想化的,可以研究如何能把文本表转换成程序运行时动态临时表。

不过,总而言之,理想与现实之间的距离有十万八千里,这个文本表确实也没啥用处,权当是个搬砖训练吧。。。。

9b7f44e15b35341c5b8792473abf47d.jpg

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服