PL/SQL 过程 X 引用视图 Y [关闭]

Posted

技术标签:

【中文标题】PL/SQL 过程 X 引用视图 Y [关闭]【英文标题】:PL/SQL Procedure X references a view Y [closed] 【发布时间】:2013-03-30 17:43:00 【问题描述】:

“参考视图”是什么意思?程序中是否有任何陈述提到给定的观点。任何命令,例如“从 Y 中删除 ....”或类似的命令,好吗?这是否意味着引用是包含该视图 Y 的任何命令?

这是我在这里的问题和答案的一部分,答案之一是“Y 是 X 的直接依赖项”? 这是否意味着该过程创建了该视图?

这是完整的问题和答案。

考虑这种情况:过程 X 引用基于表 Z 的视图​​ Y。哪两个语句 是真的吗? (选择两项。)

Y 是一个被引用的对象。

Y 是 X 的直接依赖项。

【问题讨论】:

【参考方案1】:

如果一个过程引用了一个视图,这意味着 PL/SQL 编译器已确定该过程以某种方式使用该视图。

例如,以下过程引用了视图v_some_view,因此对其具有依赖关系:

PROCEDURE example (p_count OUT INTEGER)
IS
BEGIN
  SELECT COUNT(*) INTO p_count FROM v_some_view;
END;

如果视图不存在,该过程将无效。如果我们要删除视图,该过程将不再有效,因为它会尝试从不存在的视图中进行选择。如果视图不存在,PL/SQL 编译器将无法编译此过程。

视图存在是不够的;它也必须有效。视图中的错误会导致程序编译失败。

过程引用视图的唯一方法是使用视图使用SELECTINSERTUPDATEMERGEDELETE 语句。在没有EXECUTE IMMEDIATE 的情况下,无法在 PL/SQL 中 CREATE 视图,即使您这样做,该过程也无法随后引用新创建的视图,因为该视图在编译时将不存在。

例如,如果my_view 不存在,则以下过程将无法编译:

PROCEDURE invalid
IS
  p_count    INTEGER;
BEGIN
  EXECUTE IMMEDIATE 'CREATE VIEW my_view AS SELECT * FROM DUAL';
  SELECT COUNT(*) INTO p_count FROM my_view;
  dbms_output.put_line('Count was ' || p_count);
END;  

因此,考虑依赖关系的一种方式是“对象 Y 只有在 X 存在且有效时才有效吗?”。如果这个问题的答案是肯定的,那么 Y 依赖于 X。

如果您有权访问 Oracle 数据库,请查看数据字典视图 USER_DEPENDENCIESALL_DEPENDENCIES 以查看对象之间依赖关系的一些示例。

【讨论】:

以上是关于PL/SQL 过程 X 引用视图 Y [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在PL / SQL过程调用中使用DECODE

PL/SQL 打印出存储过程返回的引用游标

pl/sql 过程不允许将表名/视图名作为参数传递

PL/SQL Developer 替代方案 [关闭]

如何从 Oracle 10G PL/SQL 函数和过程中查找所有表引用? [复制]

PL/SQL 插入和分区