欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

PL/SQL相关的数据字典

程序员文章站 2022-05-15 16:44:26
...

本文只是拂去了可以从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_name

3、搜索和展现源代码 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

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 调用者权限或是定义者权限