时间:2021-07-01 10:21:17 帮助过:94人阅读
本文只是拂去了可以从Oracle数据字典视图中挖掘出的应用信息的一层表面。PL/SQL编辑器例如Oracle SQL Developer对很多 视图提供了
有时候,我们在PL/SQL开发过程中会遇到以下问题:
1)我的程序到底依赖于哪些数据库对象?
2)哪个包中调用了一个其他包中的子程序或变量?
3)我的哪个子程序的参数使用了不合适的数据类型?
4)我的所有子程序是否都使用了适当的优化级别?
傻一点的做法是到代码里搜。。。
聪明的人会使用以下数据字典视图:
【USER_ARGUMENTS】:包含某模式中所有过程和函数的参数。
【USER_DEPENDENCIES】:包含你拥有的对象间依赖。这个视图最常被Oracle用来标识失效的数据库对象(当该对象依赖的对象发生改变后)。
【USER_ERRORS】:包含你拥有的所有已存储的对象的编译错误。这个视图可被SQL*Plus命令:SHOW ERRORS读取。
【USER_IDENTIFIERS】:11g引入并由PL/Scope编译工具填充。一旦填充,这个视图将包含所有标识符-程序名称,变量等。
【USER_OBJECT_SIZE】:包含对象的大小。事实上,这个视图展示了原始,解析和编译的代码大小。尽管是被编译器和运行时殷勤使用,你也可以用来找到环境中的大程序。
【USER_OBJECTS】:包含一个模式下所有对象信息。可查看对象是否valid,找出所有包含EMP名称的包等。
【USER_PLSQL_OBJECT_SETTINGS】:Information about the characteristics—such as the optimization level and debug settings—of a PL/SQL object that can be modified through the ALTER and SET DDL commands.
【USER_PROCEDURES】: 包含关于存储程序信息,例如AUTHID设置,程序是定义为DETERMINISTIC等特性。
【USER_SOURCE】:包含所有对象的文本源代码。一个非常便利的视图,因为你可以对源代码进行各种分析。
【USER_STORED_SETTINGS】:PL/SQL编译器标记。使用这个视图查看哪个程序用了原生编译(native compilation)。
【USER_TRIGGERS】 和【USER_TRIGGER_COLS】:The database triggers you own (including the source code and a description of the triggering event) and any columns identified with the triggers, respectively. You can write programs against USER_TRIGGERS to enable or disable triggers for a particular table.
1、数据字典基础
数据字典是由多个实例创建的表和视图组成,用户通常只有对数据字典查询权限。
绝大多数的数据字段有三个版本组成:
1)用户视图,USER_开头,包含当前已登录用户拥有的数据库对象信息。
2)全部视图,,ALL_开头,包含当前已登录用户已读取的数据库对象信息。
3)管理员视图,DBA_开头,这类视图包含一个实例中所有数据库对象信息,普通用户通常无权访问。
例如:
SELECT * FROM user_objects; –我拥有的所有数据库对象信息
SELECT * FROM all_objects; –我有权读取的数据库对象信息
SELECT * FROM dba_objects; –管理员可访问的整个数据库的对象信息
2、显示存储对象的信息 USER_OBJECTS
包含列介绍(英文太简单不翻译了):
OBJECT_NAME: Name of the object
OBJECT_TYPE: Type of the object, such as PACKAGE, FUNCTION, or TRIGGER
STATUS: Status of the object—VALID or INVALID
LAST_DDL_TIME: Time stamp indicating the last time this object was changed
来看几个例子:
1)显示我模式下所有表:
SELECT object_name FROM user_objects object_name;2)显示所有失效的对象名:
SELECT object_type, object_name FROM user_objects object_type, object_name;3)显示所有今天修改的对象:
SELECT object_type, object_name, last_ddl_time FROM user_objects WHERE last_ddl_time >= TRUNC (SYSDATE) ORDER BY object_type, object_name3、搜索和展现源代码 USER_SOURCE
列介绍:
NAME: Name of the object
TYPE: Type of the object (ranging from PL/SQL program units to Java source and trigger source)
LINE: Number of the line of the source code
TEXT: Text of the source code
例如: 我需要改变包SALES_MGR中CALC_TOTALS过程的参数列表。我想找到哪些地方对该过程进行了调用。
SELECT name, line, text FROM user_source WHERE UPPER (text) name, line当然,这个查询可能连注释也查出来,还有就是不符合LIKE格式的字符串将无法检索出来,例如:
SALES_MGR.
CALC_TOTALS
那么假设,我们的代码都是比较标准的,这个查询还是做了一个不错的工作。
另外,对于11g而言,你可以使用PL/Scope特性。
4、存储代码的编译设置 USER_PLSQL_OBJECT_SETTINGS
PLSQL_OPTIMIZE_LEVEL: 编译对象的优化级别
PLSQL_CODE_TYPE: 对象的编译模式
PLSQL_DEBUG: Whether or not the object was compiled for debugging 对象是否为调试而编译
PLSQL_WARNINGS: 编译对象的编译警告设置
NLS_LENGTH_SEMANTICS: NLS length semantics that were used to compile the object 编译对象的语义长度设置
找出所有没有采用有效编译时优化的程序单元:
SELECT name
FROM user_plsql_object_settings
WHERE plsql_optimize_level < 2
0级表示未采取任何优化。1表示最低限度的优化。2者都不应该存在于生产环境。
找出那些禁用了编译时警告的程序。
SELECT name, plsql_warnings FROM user_plsql_object_settings WHERE plsql_warnings LIKE '%DISABLE%';5、关于过程和函数的详细信息 USER_PROCEDURES
AUTHID: Shows whether a procedure or a function is defined as an invoker rights (CURRENT_USER) or definer rights (DEFINER) program unit 调用者权限或是定义者权限