View V$FIXED_VIEW_DEFINITION
包含所有 V$
View 的定义。但是,数据类型是 VARCHAR2(4000)
,因此只显示 View 正文的前 4000 个字符:
SELECT column_name, data_type, data_length
FROM dba_tab_cols
WHERE table_name = 'V_$FIXED_VIEW_DEFINITION';
COLUMN_NAME DATA_TYPE DATA_LENGTH
--------------- --------- -----------
VIEW_NAME VARCHAR2 128
VIEW_DEFINITION VARCHAR2 4000
CON_ID NUMBER 22
这适用于较短的 View ,但对于其他 View ,如 V$SESSION
,查询文本会在字符 4000 之后停止:
SELECT * FROM v$fixed_view_definition WHERE view_name = 'GV$SESSION';
VIEW_NAME VIEW_DEFINITION
---------- --------------------------------------------
GV$SESSION select s.inst_id, ... ,decode(bitand(s.ksuse
here it stops abruptly ^
现在,显然,Oracle 已将全文存储在某处,函数 DBMS_UTILITY. EXPAND_SQL_TEXT T
重建完整的查询,但并非没有对查询做一些奇怪的事情,比如引用所有列、引入别名等:
DECLARE
c CLOB;
i NUMBER := 1;
linelen CONSTANT NUMBER := 100;
BEGIN
DBMS_UTILITY.EXPAND_SQL_TEXT('SELECT * FROM V$SESSION', c);
LOOP
EXIT WHEN i > DBMS_LOB.GETLENGTH(c);
DBMS_OUTPUT.PUT_LINE(DBMS_LOB.SUBSTR(c, linelen, i));
i := i + linelen;
END LOOP;
END;
/
SELECT "A1"."SADDR" "SADDR","A1"."SID" "SID","A1"."SERIAL#" "SERIAL#","A1"."AUDS
ID" "AUDSID","A1"."PADDR" "PADDR","A1"."USER#" "USER#","A1"."USERNAME" "USERNAME
...
那么,其余的 V$ 查询主体在哪里?
最佳答案
为了得到一个清晰的答案,听起来您发现了使用编译到 Oracle 二进制文件中的完整固定 View 源查询
strings $ORACLE_HOME/bin/oracle
并搜索特定 View 的输出。
Burleson had provided a hint固定 View 同义词是由 $ORACLE_HOME/rdbms/admin/
目录脚本(特别是 cdfixed.sql
)创建的。
关于oracle - Oracle 的其余 V$ View 定义在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66991236/