查询数据库系统参数可以使用“show parameter”,也可以使用V$PARAMETER视图进行查询。本文我们使用v$fixed_view_definition视图辅助获得V$PARAMETER视图真正获得途径(即探索构造这个视图的真实的SQL语句和访问的底层视图)。
1.使用desc命令查看一下V$PARAMETER“视图”列基本信息
sys@ora10g> desc V$PARAMETER
Name Null? Type
------------------------- -------- ------------------------------
NUM NUMBER
NAME VARCHAR2(80)
TYPE NUMBER
VALUE VARCHAR2(512)
DISPLAY_VALUE VARCHAR2(512)
ISDEFAULT VARCHAR2(9)
ISSES_MODIFIABLE VARCHAR2(5)
ISSYS_MODIFIABLE VARCHAR2(9)
ISINSTANCE_MODIFIABLE VARCHAR2(5)
ISMODIFIED VARCHAR2(10)
ISADJUSTED VARCHAR2(5)
ISDEPRECATED VARCHAR2(5)
DESCRIPTION VARCHAR2(255)
UPDATE_COMMENT VARCHAR2(255)
HASH NUMBER
2.使用v$fixed_view_definition视图得到V$PARAMETER视图的查询语句
sys@ora10g> col VIEW_DEFINITION for a70
sys@ora10g> select view_definition from v$fixed_view_definition a where a.VIEW_NAME='V$PARAMETER';
VIEW_DEFINITION
----------------------------------------------------------------------
select NUM , NAME , TYPE , VALUE , DISPLAY_VALUE, ISDEFAULT , ISSES_M
ODIFIABLE , ISSYS_MODIFIABLE , ISINSTANCE_MODIFIABLE, ISMODIFIED , ISA
DJUSTED , ISDEPRECATED, DESCRIPTION, UPDATE_COMMENT, HASH from GV$PAR
AMETER where inst_id = USERENV('Instance')
格式化这个SQL语句后的结果:
SELECT NUM,
NAME,
TYPE,
VALUE,
DISPLAY_VALUE,
ISDEFAULT,
ISSES_MODIFIABLE,
ISSYS_MODIFIABLE,
ISINSTANCE_MODIFIABLE,
ISMODIFIED,
ISADJUSTED,
ISDEPRECATED,
DESCRIPTION,
UPDATE_COMMENT,
HASH
FROM GV$PARAMETER
WHERE inst_id = USERENV ('Instance')
/
可见,V$PARAMETER是通过GV$PARAMETER创建的。
3.继续追溯GV$PARAMETER的创建语句
sys@ora10g> select view_definition from v$fixed_view_definition a where a.VIEW_NAME='GV$PARAMETER';
VIEW_DEFINITION
----------------------------------------------------------------------
select x.inst_id,x.indx+1,ksppinm,ksppity,ksppstvl, ksppstdvl, ksppstd
f, decode(bitand(ksppiflg/256,1),1,'TRUE','FALSE'), decode(bitand(ks
ppiflg/65536,3),1,'IMMEDIATE',2,'DEFERRED',
3,'IMMEDIATE','FALSE'), decode(bitand(ksppiflg,4),4,'FALSE',
decode(bitand(ksppiflg/65536,3), 0,
'FALSE', 'TRUE')), decode(bitand(ksppstvf,7),1,'MODIFIED',4,'SYST
EM_MOD','FALSE'), decode(bitand(ksppstvf,2),2,'TRUE','FALSE'), decod
e(bitand(ksppilrmflg/64, 1), 1, 'TRUE', 'FALSE'), ksppdesc, ksppstcmn
t, ksppihash from x$ksppi x, x$ksppcv y where (x.indx = y.indx) and
((translate(ksppinm,'_','#') not like '##%') and ((translate(ksppin
m,'_','#') not like '#%') or (ksppstdf = 'FALSE') or (bitand
(ksppstvf,5) > 0)))
格式化后的SQL:
SELECT x.inst_id,
x.indx + 1,
ksppinm,
ksppity,
ksppstvl,
ksppstdvl,
ksppstdf,
DECODE (BITAND (ksppiflg / 256, 1), 1, 'TRUE', 'FALSE'),
DECODE (BITAND (ksppiflg / 65536, 3),
1, 'IMMEDIATE',
2, 'DEFERRED',
3, 'IMMEDIATE',
'FALSE'),
DECODE (BITAND (ksppiflg, 4),
4, 'FALSE',
DECODE (BITAND (ksppiflg / 65536, 3), 0, 'FALSE', 'TRUE')),
DECODE (BITAND (ksppstvf, 7), 1, 'MODIFIED', 4, 'SYSTEM_MOD', 'FALSE'),
DECODE (BITAND (ksppstvf, 2), 2, 'TRUE', 'FALSE'),
DECODE (BITAND (ksppilrmflg / 64, 1), 1, 'TRUE', 'FALSE'),
ksppdesc,
ksppstcmnt,
ksppihash
FROM x$ksppi x, x$ksppcv y
WHERE (x.indx = y.indx)
AND ( (TRANSLATE (ksppinm, '_', '#') NOT LIKE '##%')
AND ( (TRANSLATE (ksppinm, '_', '#') NOT LIKE '#%')
OR (ksppstdf = 'FALSE')
OR (BITAND (ksppstvf, 5) > 0)))
/
4.宝贵结果
图穷匕见,幕后“魁首”终于出现,它们就是“x$ksppi”和“x$ksppcv”两个X$表。
使用“x$ksppi”和“x$ksppcv”两个X$表可以完成更多的任务,在下一篇文章中给大家展示一下使用这两个X$表获得隐含参数及其描述信息。
5.日常访问到的V$PARAMETER是“表”?“视图”?还是“同名”?
真实身份是“同名”。
论据请查看catalog.sql创建脚本中关于该视图的创建过程。
相关内容引用在此,供参考。
create or replace view v_$parameter as select * from v$parameter;
create or replace public synonym v$parameter for v_$parameter;
grant select on v_$parameter to select_catalog_role;
6.小结
v$fixed_view_definition视图是研究视图定义的有效工具,本文通过该视图追溯到了V$PARAMETER的底层查询表。
有兴趣的朋友可以进一步去研究其他视图的查询定义。
Good luck.
secooler
10.03.26
-- The End --