博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]Show parameter & Table Not exists
阅读量:4670 次
发布时间:2019-06-09

本文共 5050 字,大约阅读时间需要 16 分钟。

本文转自:

问题描述

 

在尝试通过show parameter来查看一个参数的时候,遇到了ora-00942: table or view does not exist的错误提示,如下,

 

 

SQL> show user USER is "SCOTT"
SQL> show parameter nls_sort; ORA-00942: table or view does not exist

 

 

问题分析

 

乍看到这个错误,很是惊愕了一下,因为平时几乎没碰到这个问题。但是错误提示给出的信息意思很明显,show parameter的时候访问了某个不存在或者没权限访问的表或者视图。那么是哪个表或者视图呢? 因为还记得访问参数的值,可以直接访问动态新能视图v$parameter, 因此尝试访问了一下,结果也报出了同样的错误提示,

 

 

SQL> select value from v$parameter where name='nls_sort';
select value from v$parameter where name='nls_sort' * ERROR at line 1: ORA-00942: table or view does not exist

 

 

其实至此,上面的问题已经显而易见了,show parameter命令应该就是访问v$parameter。因为当前user scott没有权限访问这个视图,因此会报出table or view does not exist的错误信息。解决问题的方法也自然简单,给scott赋予相应的权限即可,

 

SQL> show user USER is "SYS"
SQL> grant select on v_$parameter to scott;
Grant succeeded.

 

现在重新尝试一下,发现问题没有了....

 

 

SQL> show user USER is "SCOTT" SQL> show parameter nls_sort;
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ nls_sort string SQL> select value from v$parameter where name='nls_sort';
VALUE -------------------------------------------------------------------------------

 

 

扩展

1。 SHOW 命令

sql*plus提供了很多SHOW命令来方便对一些设置的查看,比如show sga,这些应该也是对相应的视图的访问。关于sqlplus的SHOW命令,可以参见

 

2。 关于parameter 视图

Oracle 提供了几个parameter视图,如下

 

v$parameter / v$parameter2

v$system_parameter / v$system_parameter2

v$spparameter

 

其中v$parameter(2)反映的是当前session中各个参数的值,v$system_parameter(2)则是instance级别的参数的值,v$spparameter则是spfile中存储的参数的值。

v$parameter和v$parameter2的区别在于,对于那些值为多个的参数, v$parameter2会对将每个值都显示成独立的一行,而v$parameter则会将所有的值都显示在一行中。 v$system_parameter和v$system_parameter2类似。

 

select * from v$parameter where name='control_files'

select * from v$parameter2 where name='control_files'

 

 

新的疑问

 

注意到通过alter session命令更改了参数nls_sort之后,通过show parameter或者查询v$parameter却查询不到变化,如下所示...

 

 

SQL> show user USER is "SCOTT" SQL> show parameter nls_sort
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ nls_sort string SQL> alter session set nls_sort=binary_ci;
Session altered.
SQL> show parameter nls_sort
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ nls_sort string SQL> select value from v$parameter where name='nls_sort';
VALUE ---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------

 

 

这个岂不怪哉,难倒对nls_sort参数的改动没有任何效果,但是经过测试发现,当前session的行为确实变成了大小写不敏感了。那么为什么这个参数值的改变没有体现在v$parameter这个视图中间呢?

无意中发现有个视图叫v$nls_parameters (注意这个视图的名字是复数形式),那么查询这个这个视图看看怎么个情况...

 

SQL> show user USER is "SCOTT" SQL> select * from v$nls_parameters where parameter='nls_sort';
PARAMETER VALUE ---------------------------------------------------------------- ---------------- NLS_SORT BINARY_CI
SQL>

 

可以看到这个参数确实是起作用的,因为我查询v$nls_parameter的时候,用的是'nls_sort' 而不是'NLS_SORT'来做查询限制条件!那么由此可以推测出通过alter session来更改NLS相关的参数的时候,改变是通过v$nls_parameters这个动态视图体现出来的。

另外还注意到几个静态视图跟NLS相关,包括NLS_DATABASE_PARAMETERS, NLS_INSTANCE_PARAMETERS, NLS_SESSION_PARAMETERS. 根据视图的名字不难推断出这几个视图分别显示的是什么内容,NLS_SESSION_PARAMETERS 和 v$nls_parameters应该反映的是同样的信息,都是当前session的NLS参数的设置情况。

 

可以通过查看查询计划的方式来看一下这些视图究竟是建立在哪些表上的,如下...

 

(1) NLS_DATABASE_PARAMETERS

 

SQL> set autotrace traceonly explain SQL> select * from nls_database_parameters;
Execution Plan ---------------------------------------------------------- Plan hash value: 415205717
---------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 28 | 2 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| PROPS$ | 1 | 28 | 2 (0)| 00:00:01 | ---------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("NAME" LIKE 'NLS%')
SQL>

 

 

可以看到NLS_DATABASE_PARAMETERS是建立在表数据字典表PROP$之上的,从中只取出NLS相关的参数。

 

(2) NLS_INSTANCE_PARAMETERS & v$parameter

 

SQL> select * from nls_instance_parameters;
Execution Plan ---------------------------------------------------------- Plan hash value: 1128103955
------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | 358 | 1 (100)| 00:00:01 | |* 1 | HASH JOIN | | 1 | 358 | 1 (100)| 00:00:01 | |* 2 | FIXED TABLE FULL| X$KSPPI | 1 | 68 | 0 (0)| 00:00:01 | | 3 | FIXED TABLE FULL| X$KSPPCV | 100 | 29000 | 0 (0)| 00:00:01 | ------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 1 - access("X"."INDX"="Y"."INDX") filter(TRANSLATE("KSPPINM",'_','#') NOT LIKE '#%' OR "KSPPSTDF"='FALSE' OR BITAND("KSPPSTVF",5)>0) 2 - filter("KSPPINM" LIKE 'nls%' AND "X"."INST_ID"=USERENV('INSTANCE') AND

转载于:https://www.cnblogs.com/freeliver54/p/6605377.html

你可能感兴趣的文章
延时器弹窗
查看>>
5.1什么是视图
查看>>
WWDC 2015大会到来了
查看>>
JSP 入门 HTML嵌套Java脚步 显示时间
查看>>
【自爆系列】如何从整体上削弱一支队伍的技术水平
查看>>
MySQL实习训练1
查看>>
HDU 1166 敌兵布阵 【线段树-点修改--计算区间和】
查看>>
Hashtable几种常用的遍历方法
查看>>
hadoop 3.0.0 alpha3 安装、配置
查看>>
在Windows Server通过MMC导入客户证书的注意事项
查看>>
设计模式之“单例模式”
查看>>
iOS App上架流程(2016详细版)
查看>>
SpringMVC+Thymeleaf +HTML的简单框架
查看>>
mxnet系列 安装
查看>>
Flask - 基础
查看>>
导航栏主题
查看>>
堆排序
查看>>
Expm 1_2 实现快速排序的算法,并尝试采用不同的方法实现线性的划分过程.
查看>>
Spoon新建repository的时候
查看>>
Oracle XE http端口8080的修改
查看>>