千家信息网

在SQL PLUS中格式化输出查询结果的方法是什么

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章主要讲解了"在SQL PLUS中格式化输出查询结果的方法是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"在SQL PLUS中格式化输出查询
千家信息网最后更新 2025年01月23日在SQL PLUS中格式化输出查询结果的方法是什么

这篇文章主要讲解了"在SQL PLUS中格式化输出查询结果的方法是什么",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"在SQL PLUS中格式化输出查询结果的方法是什么"吧!

一:过程代码

Create Or Replace Procedure Format_Sql(i_Sql In Varchar2) Is  i_Cursor       Integer Default Dbms_Sql.Open_Cursor();  Desc_Cols      Dbms_Sql.Desc_Tab;  i_Status       Integer; --执行状态  n_Colcnt       Number; --列数  i_Col_Width    Integer := 3; --列间距,如果觉得太小可以调大一些  n_Rowcnt       Number := 0; --记录结果行数  Vc_Columnname  Varchar2(4000); --列头名字  Vc_Col_Split   Varchar2(4000) := '---'; --记录和列头之间的分割线  Vc_Columnvalue Varchar2(4000); --列值  Type Typ_Collength Is Table Of Number Index By Binary_Integer;  Tab_Typ_Collength Typ_Collength; --存放每一列值的最大长度  l_Results         Long; --输出结果Begin  --第一次循环获取每列值的最大长度  i_Cursor := Dbms_Sql.Open_Cursor; --打开游标;  Dbms_Sql.Parse(i_Cursor, i_Sql, Dbms_Sql.Native);  Dbms_Sql.Describe_Columns(i_Cursor, n_Colcnt, Desc_Cols);  For i In 1 .. n_Colcnt Loop    Dbms_Sql.Define_Column(i_Cursor, i, Vc_Columnvalue, 4000);    Tab_Typ_Collength(i) := Length(Desc_Cols(i).Col_Name);  End Loop;  i_Status := Dbms_Sql.Execute(i_Cursor);  Loop    Exit When Dbms_Sql.Fetch_Rows(i_Cursor) < 1;    For i In 1 .. n_Colcnt Loop      Dbms_Sql.Column_Value(i_Cursor, i, Vc_Columnvalue);      If Length(Vc_Columnvalue) > Tab_Typ_Collength(i) Then        Tab_Typ_Collength(i) := Length(Vc_Columnvalue);      End If;    End Loop;  End Loop;  Dbms_Sql.Close_Cursor(i_Cursor);  --第二次循环拼接输出结果  i_Cursor := Dbms_Sql.Open_Cursor; --打开游标;  Dbms_Sql.Parse(i_Cursor, i_Sql, Dbms_Sql.Native);  Dbms_Sql.Describe_Columns(i_Cursor, n_Colcnt, Desc_Cols);  For i In 1 .. n_Colcnt Loop    Dbms_Sql.Define_Column(i_Cursor, i, Vc_Columnvalue, 4000);  End Loop;  i_Status := Dbms_Sql.Execute(i_Cursor);  Loop    Exit When Dbms_Sql.Fetch_Rows(i_Cursor) < 1;    n_Rowcnt  := n_Rowcnt + 1;    l_Results := l_Results || Rpad(n_Rowcnt, i_Col_Width + 3);    For i In 1 .. n_Colcnt Loop      Dbms_Sql.Column_Value(i_Cursor, i, Vc_Columnvalue);      l_Results := l_Results ||                   Rpad(Vc_Columnvalue || ' ',                        Tab_Typ_Collength(i) + i_Col_Width);    End Loop;    l_Results := l_Results || Chr(10);  End Loop;  --定义列头  Vc_Columnname := Rpad('NO', i_Col_Width + 3, ' ');  For i In 1 .. n_Colcnt Loop    Vc_Columnname := Vc_Columnname ||                     Rpad(Desc_Cols(i).Col_Name,                          Tab_Typ_Collength(i) + i_Col_Width,                          ' ');    Vc_Col_Split  := Rpad(Vc_Col_Split,                          Length(Vc_Col_Split) + i_Col_Width,                          ' ');    Vc_Col_Split  := Rpad(Vc_Col_Split,                          Length(Vc_Col_Split) + Tab_Typ_Collength(i),                          '-');  End Loop;  Dbms_Sql.Close_Cursor(i_Cursor);  --  Vc_Columnname := Vc_Columnname || Chr(10);  --输出结果  Dbms_Output.Put_Line('Total Row: ' || n_Rowcnt);  Dbms_Output.Put_Line(Vc_Columnname);  Dbms_Output.Put_Line(Vc_Col_Split);  Dbms_Output.Put_Line(l_Results);Exception  When Others Then    Dbms_Sql.Close_Cursor(i_Cursor);    Raise;End;

二:测试结果

TS@PROD> set serveroutput on size 999999TS@PROD> select sql_text,sql_id,child_number,hash_value from v$sql Where sql_text Like'select * from emp%';SQL_TEXT---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------SQL_ID        CHILD_NUMBER HASH_VALUE------------- ------------ ----------select * from empa2dk8bdn0ujx7            0 1745700775select * from empa2dk8bdn0ujx7            1 1745700775select * from emp e,dept d where e.deptno = d.deptno4cs33ya9vumkh            0 2478657104TS@PROD> exec Format_Sql('select sql_text,sql_id,child_number,hash_value from v$sql Where sql_text Like''select * from emp%''');Total Row: 3NO    SQL_TEXT                                               SQL_ID          CHILD_NUMBER   HASH_VALUE---   ----------------------------------------------------   -------------   ------------   ----------1     select * from emp                                      a2dk8bdn0ujx7   0              1745700775   2     select * from emp                                      a2dk8bdn0ujx7   1              1745700775   3     select * from emp e,dept d where e.deptno = d.deptno   4cs33ya9vumkh   0              2478657104   PL/SQL procedure successfully completed.

感谢各位的阅读,以上就是"在SQL PLUS中格式化输出查询结果的方法是什么"的内容了,经过本文的学习后,相信大家对在SQL PLUS中格式化输出查询结果的方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0