之前做 SQL执行信息辅助工具 ET2 时,在脚本中实现了一个简单的文本表格功能。现在将这个功能提取成独立的类对象,调用起来比之前嵌入式的能方便些,也清爽些。
在使用前,先要注意显示字体问题,如果使用非等宽字体,在输出结果时会出现表格错位问题,类似于下面图中的样子就没法看了
我这里常用的等宽字体为 Courier New 或 Consolas,个人感觉 Consolas 更合用些。
源码:
达梦文本表实验_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 方法,能够从文本表中取出指定单元格数据内容,已前面脚本为例,可参考下图结果
这个文本表功能很简单,适用场景也有限,也就是在文本类数据格式化输出时能派上点用场。
如果有兴趣,可以根据自己的需要增加更多的接口,把文本表改造成一个数据存储类,比如增加以下功能:
增加空行、删除行、增删后行号重排、数据排序、查找、anydata类型引入、数据类型一致性验证/转换及异常抛出。。。。
如果能再进一步,更理想化的,可以研究如何能把文本表转换成程序运行时动态临时表。
不过,总而言之,理想与现实之间的距离有十万八千里,这个文本表确实也没啥用处,权当是个搬砖训练吧。。。。
文章
阅读量
获赞