我创建了一个包,其中包含我计划从单独的应用程序调用的存储过程.存储过程将返回架构中所有视图和表的排序列表.为此,它对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的新手,所以请耐心等待.如果你能提供一些线索,或指出我正确的方向,我真的很感激.
提前致谢!
使用ALL_TABLES和ALL_VIEWS而不是DBA_TABLES和DBA_VIEWS.所有用户都应该可以访问ALL_%视图.