我创建了一个包,其中包含我计划从单独的应用程序调用的存储过程。存储过程将返回模式中所有视图和表的排序列表。为此,它对 DBA_TABLES 和 DBA_VIEWS 同义词执行简单的选择,如下所示:
CREATE OR REPLACE
PACKAGE BODY TITAN_ENTITY AS
PROCEDURE GETSCHEMAOBJECTS (RESULTS IN OUT T_CURSOR)
IS
V_CURSOR T_CURSOR;
BEGIN
OPEN V_CURSOR FOR
SELECT 'T' OBJECTTYPE, TABLE_NAME OBJECTNAME
FROM DBA_TABLES
WHERE OWNER = 'SONAR5'
UNION ALL
SELECT 'V' OBJECTTYPE, VIEW_NAME OBJECTNAME
FROM DBA_VIEWS
WHERE OWNER = 'SONAR5'
ORDER BY OBJECTNAME;
RESULTS := V_CURSOR;
END GETSCHEMAOBJECTS;
END TITAN_ENTITY;
我已经验证了有问题的同义词存在并且是公开的:
CREATE PUBLIC SYNONYM "DBA_TABLES" FOR "SYS"."DBA_TABLES"
CREATE PUBLIC SYNONYM "DBA_VIEWS" FOR "SYS"."DBA_VIEWS"
我的理解是,因为它们是公开的,所以我不需要任何进一步的权限即可访问它们。如果这种理解是不正确的,我希望有人能驳斥我的想法,并指出更准确的数据。
现在这是我的问题:我可以在 Oracle SQL Developer 中打开一个工作表并从这些表中进行选择就可以了。我得到有意义的数据就好了(事实上,567 行)。但是当我尝试执行存储过程时,Oracle报错编译错误,如下图:
Error(9,8): PL/SQL: SQL Statement ignored
Error(10,16): PL/SQL: ORA-00942: table or view does not exist
当我双击第二条错误消息时,SQL Developer 将我带到第一个 FROM 子句(“FROM DBA_TABLES”)。
所以我很困惑。我非常了解 SQL Server,而且我是 Oracle 的新手,所以请多多包涵。如果您能提供一些线索,或指出正确的方向,我将不胜感激。
提前致谢!