PL/SQL相关的数据字典
http://www.oracle.com/technetwork/issue-archive/2012/12-nov/o62plsql-1851968.html

有时候,我们在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
WHERE object_type = 'TABLE'
ORDER BY object_name;

2)显示所有失效的对象名:

SELECT object_type, object_name
FROM user_objects
WHERE status = 'INVALID'
ORDER BY 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)
LIKE '%SALES_MGR.CALC_TOTALS%'
ORDER BY 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 调用者权限或是定义者权限

DETERMINISTIC: Set to YES if the function is defined to be deterministic, which theoretically means that the value returned by the function is determined completely by the function’s argument values 是否确定性

PIPELINED: Set to YES if the function is defined as a pipelined function, which means that it can be executed in parallel as part of a parallel query 是否管道函数

OVERLOAD: Set to a positive number if this subprogram is overloaded, which means that there are at least two subprograms with this name in the same package 是否重载

找出所有运行在调用者权限下的过程和函数

SELECT object_name
, procedure_name
FROM user_procedures
WHERE authid = 'CURRENT_USER'
ORDER BY object_name, procedure_name

显示所有声明为确定性的函数:

SELECT object_name
, procedure_name
FROM user_procedures
WHERE deterministic = 'YES'
ORDER BY object_name, procedure_name

6、分析和修改触发器状态 USER_TRIGGERS
TRIGGER_NAME: The name of the trigger

TRIGGER_TYPE: A string that shows if this is a BEFORE or AFTER trigger and whether it is a row- or statement-level trigger (in a trigger that is fired before an INSERT statement, for example, the value of this column is BEFORE STATEMENT)

TRIGGERING_EVENT: The type of SQL operation—such as INSERT, INSERT OR UPDATE, DELETE OR UPDATE—that will cause the trigger to fire

TABLE_NAME: The name of the table on which the trigger is defined

STATUS: The status of the trigger—ENABLED or DISABLED

WHEN_CLAUSE: An optional clause you can use to avoid unnecessary execution of the trigger body

TRIGGER_BODY: The code executed when the trigger fires

找出所有已禁用的触发器:


SELECT *
FROM user_triggers
WHERE status = 'DISABLED'

找出所有定义在EMPLOYEES表上的行级触发器:

SELECT *
FROM user_triggers
WHERE table_name = 'EMPLOYEES'
AND trigger_type LIKE '%EACH ROW'

Find all triggers that fire when an UPDATE operation is performed:
找出所有包含update操作触发的触发器

SELECT *
FROM user_triggers
WHERE triggering_event LIKE '%UPDATE%'

7、对象依赖分析 USER_DEPENDENCIES
NAME: Name of the object

TYPE: Type of the object

REFERENCED_OWNER: Owner of the referenced object 被引用对象的所有者

REFERENCED_NAME: Name of the referenced object 被引用对象的名称

REFERENCED_TYPE: Type of the referenced object 被引用对象的类型

找出所有依赖于EMPLOYEES表的对象:

SELECT type, name
FROM user_dependencies
WHERE referenced_name = 'EMPLOYEES'
ORDER BY type, name

找出当前模式下ORDER_MGR包依赖的所有对象

SELECT referenced_type
, referenced_name
FROM user_dependencies
WHERE name = 'ORDER_MGR'
AND referenced_owner = USER
ORDER BY referenced_type,
referenced_name

8、分析参数信息 USER_ARGUMENTS
OBJECT_NAME: The name of the procedure or function

PACKAGE_NAME: The name of the package in which the procedure or function is defined

ARGUMENT_NAME: The name of the argument

POSITION: The position of the argument in the parameter list (if 0, this is the RETURN clause of a function)

IN_OUT: The mode of the argument—IN, OUT, or IN OUT

DATA_TYPE: The datatype of the argument

DATA_LEVEL: The nesting depth of the argument for composite types (for example, if one of your arguments’ datatypes is a record, USER_ARGUMENTS will have a row for this argument with a DATA_LEVEL of 0 and then a row for each field in the record with a DATA_LEVEL of 1)

1)找出所有包含LONG参数的程序

SELECT object_name
, package_name
, argument_name
FROM user_arguments
WHERE data_type = 'LONG'
;

2)找出所有带有OUT或IN OUT参数的函数。这个地方要注意一下:有经验的编程专家都会告诉我们不要在函数中仅使用IN 参数,
原因是带有OUT 和 IN OUT参数函数不能在SQL中被调用,并且不能用在函数索引中。如果你需要函数返回多块信息,那么请使用
一个存储过程或返回一个RECORD类型。下面的例子找出了违反这个条件的函数:

SELECT ua.object_name,
2 ua.package_name,
3 ua.argument_name,
4 ua.in_out
5 FROM (SELECT *
6 FROM user_arguments
7 WHERE position = 0) funcs,
8 user_arguments ua
9 WHERE ua.in_out IN ('OUT', 'IN OUT')
10 AND ua.position > 0
11 AND ua.data_level = 0
12 AND funcs.object_name = ua.object_name
13 AND funcs.package_name = ua.package_name
14 AND ( funcs.overload = ua.overload
15 OR (funcs.overload IS NULL
16 AND ua.overload IS NULL));

9 总结:这儿有座金矿
This article merely scratches the surface of the application information that can be mined from the data dictionary views in Oracle Database. PL/SQL editors such as Oracle SQL Developer provide user interfaces to many of these views, making it easier to browse their contents.

本文只是拂去了可以从Oracle数据字典视图中挖掘出的应用信息的一层表面。PL/SQL编辑器例如Oracle SQL Developer对很多
视图提供了用户接口,从而更容易的浏览它们的内容。

PL/SQL相关的数据字典的更多相关文章

  1. 09 高效的PL/SQL程序设计

    程序包 Package 断开了依赖链 实验依赖关系: <1> 首先不使用包 -- 创建表 CREATE table t (x int); -- 创建视图 create view v as ...

  2. PL/SQL详细介绍,设置oracle相关

    1. 实现参照完整性      指若两个表之间具有主从关系(即主外键关系),当删除主表数据时,必须确保相关的从表数据已经被删除.  当修改主表的主键列数据时,必须确保相关从表数据已经被修改.为了实现级 ...

  3. PL/SQL Developer图形化窗口创建数据库(表空间和用户)以及相关查询sql

    前言:上一篇安装好oracle和pl/sql后,这篇主要讲如何创建数据库,因为接下来我的项目会连接数据库进行开发. 第一步.先用系统管理员登录pl/sql 我这里系统管理员用户名为system,密码为 ...

  4. PL/sql配置相关

    可以安装oracle之后,打开PL/sql之后,自动找到oracle的路径以及数据库连接.   或者:安装oracle客户端,手动在PL/sql中配置oic以及oracle主目录的位置,并且配置好C: ...

  5. PL/SQL存储过程编程

    PL/SQL存储过程编程 /**author huangchaobiao *Email:huangchaobiao111@163.com */ PL/SQL存储过程编程(上) 1. Oracle应用编 ...

  6. oracle PL/SQL高级特性

    触发器:存放在数据库中,并被隐含执行的存储过程. 由触发事件,触发条件,触发操作组成. DML触发器:指定触发器时机(before or after),触发事件(insert  , delete, u ...

  7. PL/SQL异常处理

    As we all known,程序的错误一般分为两类:编译错误和运行时错误.其中运行时错误被称为异常.PL/SQL语句块中处理异常的部分即为异常处理部分.在异常处理部分,可以指定当特定异常发生时所采 ...

  8. PL/SQL Transaction Control

    PL/SQL 基础 ( 下 )   1. PL/SQL中的 SQL语句 - END语句与COMMIT等内容,没有任何关系. - PL/SQL does not directly support dat ...

  9. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  10. PL/SQL之--包

    一.包 包是一组相关过程.函数.常量.变量.游标.异常等PL/SQL程序设计元素的组合.它类似于C++和Java中的类,其中变量相当于类中的成员变量,过程和函数相当于类中的方法.通过使用包,可以使开发 ...

随机推荐

  1. [转帖]堆表&索引组织表

    堆表&索引组织表 https://zhuanlan.zhihu.com/p/487271927   15 人赞同了该文章 很多大佬强调学习一定要看"原版英文材料". 比如再 ...

  2. [转帖]Linux nice和renice命令:改变进程优先级

    https://c.biancheng.net/view/1074.html 当 Linux 内核尝试决定哪些运行中的进程可以访问 CPU 时,其中一个需要考虑的因素就是进程优先级的值(也称为 nic ...

  3. [转帖]pyinstaller实现将python程序打包成exe文件

    https://www.cnblogs.com/blogzyq/p/13939739.html 如果我们想要在一个没有python以及很多库环境的电脑上使用我们的小程序该怎么办呢? 我们想到,在Win ...

  4. [转帖]CentOS7安装笔记:minio分布式集群搭建

    文章目录 准备机器 部署(所有机器均执行) 创建挂载磁盘路径 挂载磁盘路径到文件系统 创建minio目录 下载minio安装包 创建启动脚本 创建启动服务 启动测试(所有机器执行) 重新加载服务的配置 ...

  5. ABP-VNext 用户权限管理系统实战05----扩展授权类型(单点登录)

    一.适合场景: 1.我方系统在集成到别人的集成本台时一般是拿别的平台的用户名,在我方系统进行登录 2.我方系统是前后端分离,前端要拿到token 二.解决方案:自定义授权类型 我们知道Identity ...

  6. 紫 distance

    仅此纪念我爆掉的T3 紫,即RE,运行出错,梦幻,而又不失杀气 根据<雪distance>改编,分为提交前,评测前,评测时,评测后 你说我考试AK,可我却运行出错 任凭无尽的懊悔将我淹没, ...

  7. go中channel源码剖析

    channel 前言 设计的原理 共享内存 csp channel channel的定义 源码剖析 环形队列 创建 写入数据 读取数据 channel的关闭 优雅的关闭 M个receivers,一个s ...

  8. 【3】超级详细matplotlib使用教程,手把手教你画图!(多个图、刻度、标签、图例等)

    相关文章: 全网最详细超长python学习笔记.14章节知识点很全面十分详细,快速入门,只用看这一篇你就学会了! [1]windows系统如何安装后缀是whl的python库 [2]超级详细Pytho ...

  9. 解决:docker开启mongo镜像

    首先通过docker pull mongo拉取mongo镜像 (如果带版本,拉取为响应版本,若不带版本则拉取最新版本) 开启 mongodb 容器 可以选择将宿主机的mongo工作目录进行共享,作为d ...

  10. ElasticSearch7.3学习(三十三)----kibana之Grok Dubugger

    在ElasticSearch7.3学习(三十二)----logstash三大插件(input.filter.output)及其综合示例中学到logstash使用filter插件进行数据清洗,grok是 ...