oracle结果窗口调整隐藏,查看oralce10g,11g隐含参数,并在SQLPLUS窗口格式化输出

```sql

/**

功能:用于在10g,11g中查询隐含参数的值,主要是可以在SQLPLUS窗口格式化输出

注意Cn_Batch_Length的值设置的没必要太大

作者:stotf

时间:2020/3/28

**/

Create Or Replace Function f_Imp_Param(Name In Varchar2) Return Varchar2 Is

Vc_Term Varchar2(100); --用于参数替换

Vc_Result Long; --返回查询结果

Vc_Sql Varchar2(4000); --定义sql

Cur_Kk Sys_Refcursor; --参考游标

Cn_Batch_Length Constant Pls_Integer := 300; --定义最多查询行数

v_Num Number := 0; --行号

--定义列头

Vc_Parameter Varchar2(100) := 'PARAMETER';

Vc_Session_Value Varchar2(100) := 'SESSION_VALUE';

Vc_Instance_Value Varchar2(100) := 'INSTANCE_VALUE';

Vc_Is_Session_Modifiable Varchar2(100) := 'IS_SESSION_MODIFIABLE';

Vc_Is_System_Modifiable Varchar2(100) := 'IS_SYSTEM_MODIFIABLE';

--用于记录列的最大实际长度

Type Length_Col Is Record(

Para Number := Length(Vc_Parameter),

Sess Number := Length(Vc_Session_Value),

Inst Number := Length(Vc_Instance_Value),

Is_Sess_Mod Number := Length(Vc_Is_Session_Modifiable),

Is_Sys_Mod Number := Length(Vc_Is_System_Modifiable));

Rec_Length Length_Col;

--定义和查询列匹配的record

Type Rec_Result Is Record(

Parameter X$ksppi.Ksppinm%Type,

Session_Value X$ksppcv.Ksppstvl%Type,

Instance_Value X$ksppsv.Ksppstvl%Type,

Is_Session_Modifiable Varchar2(10),

Is_System_Modifiable Varchar2(10));

--定义存放结果的table

Type Tab_Result Is Table Of Rec_Result;

Typ_Tab Tab_Result;

Begin

--处理参数,如果开头没有加下划线,则加上

If Substr(Name, 1, 1) = '_' Then

Vc_Term := '/' || Lower(Name);

Else

Vc_Term := '/_' || Lower(Name);

End If;

Vc_Sql := 'Select a.Ksppinm "Parameter",

b.Ksppstvl "Session Value",

c.Ksppstvl "Instance Value",

Decode(Bitand(a.Ksppiflg / 256, 1), 1, ''TRUE'', ''FALSE'') Is_Session_Modifiable,

Decode(Bitand(a.Ksppiflg / 65536, 3),

1,

''IMMEDIATE'',

2,

''Deferred'',

3,

''IMMEDIATE'',

''FALSE'') Is_System_Modifiable

From X$ksppi a, X$ksppcv b, X$ksppsv c

Where a.Indx = b.Indx

And a.Indx = c.Indx

And a.Ksppinm Like :name Escape ''/''';

Open Cur_Kk For Vc_Sql

Using Vc_Term || '%';

--循环结果,找出每一列实际值的最大长度

Fetch Cur_Kk Bulk Collect

Into Typ_Tab Limit Cn_Batch_Length;

For i In 1 .. Typ_Tab.Count Loop

If Length(Typ_Tab(i).Parameter) > Rec_Length.Para Then

Rec_Length.Para := Length(Typ_Tab(i).Parameter);

End If;

If Length(Typ_Tab(i).Session_Value) > Rec_Length.Sess Then

Rec_Length.Sess := Length(Typ_Tab(i).Session_Value);

End If;

If Length(Typ_Tab(i).Instance_Value) > Rec_Length.Inst Then

Rec_Length.Inst := Length(Typ_Tab(i).Instance_Value);

End If;

If Length(Typ_Tab(i).Is_Session_Modifiable) > Rec_Length.Is_Sess_Mod Then

Rec_Length.Is_Sess_Mod := Length(Typ_Tab(i).Is_Session_Modifiable);

End If;

If Length(Typ_Tab(i).Is_System_Modifiable) > Rec_Length.Is_Sys_Mod Then

Rec_Length.Is_Sys_Mod := Length(Typ_Tab(i).Is_System_Modifiable);

End If;

End Loop;

Close Cur_Kk;

Dbms_Output.Put_Line('总记录数:' || Typ_Tab.Count);

--输出列头

Vc_Result := 'NO ' || Rpad(Vc_Parameter, Rec_Length.Para + 2, ' ') ||

Rpad(Vc_Session_Value, Rec_Length.Sess + 2, ' ') ||

Rpad(Vc_Instance_Value, Rec_Length.Inst + 2, ' ') ||

Rpad(Vc_Is_Session_Modifiable,

Rec_Length.Is_Sess_Mod + 2,

' ') || Rpad(Vc_Is_System_Modifiable,

Rec_Length.Is_Sys_Mod + 2,

' ' || Chr(10));

--输出记录

For i In 1 .. Typ_Tab.Count Loop

v_Num := v_Num + 1;

--字符后连接一个空格的字符,防止null值对长度计算的影响

Vc_Result := Vc_Result || Rpad(To_Char(v_Num), 6, ' ') ||

Rpad(Typ_Tab(i).Parameter || ' ', Rec_Length.Para + 2, ' ') ||

Rpad(Typ_Tab(i).Session_Value || ' ',

Rec_Length.Sess + 2,

' ') || Rpad(Typ_Tab(i).Instance_Value || ' ',

Rec_Length.Inst + 2,

' ') ||

Rpad(Typ_Tab(i).Is_Session_Modifiable || ' ',

Rec_Length.Is_Sess_Mod + 2,

' ') || Rpad(Typ_Tab(i).Is_System_Modifiable || ' ',

Rec_Length.Is_Sys_Mod + 2,

' ') || Chr(10);

End Loop;

Dbms_Output.Put_Line(Vc_Result);

Return '总记录数:' || v_Num;

Exception

When Others Then

Return 'ERROR: ' || Sqlcode || Sqlerrm;

End;

```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值