存储过程和匿名块中的相同查询会产生不同的结果

时间:2014-05-20 10:44:41

标签: oracle stored-procedures plsql oracle11g anonymous-methods

存储过程(在Oracle中)

CREATE OR REPLACE PROCEDURE UPDATE_OBJ_COUNT
AS
BEGIN
    FOR v_record IN (SELECT OWNER, COUNT(*) NUM_OBJ FROM ALL_OBJECTS GROUP BY OWNER ORDER BY OWNER)
    LOOP
        DBMS_OUTPUT.PUT_LINE('***DEBUG***: Schema: '||v_record.OWNER||', Obj count:'||v_record.NUM_OBJ);
    END LOOP;
END;

给出以下结果

***DEBUG***: Schema: ORACLE_OCM, Obj count:2
***DEBUG***: Schema: DBCONTROL, Obj count:27
***DEBUG***: Schema: PUBLIC, Obj count:22543
***DEBUG***: Schema: SCH_PRIV, Obj count:11
***DEBUG***: Schema: SYS, Obj count:22332
***DEBUG***: Schema: SYSTEM, Obj count:5
***DEBUG***: Schema: XDB, Obj count:181

如果我运行与匿名阻止

相同的代码
BEGIN
    FOR v_record IN (SELECT OWNER, COUNT(*) NUM_OBJ FROM ALL_OBJECTS GROUP BY OWNER ORDER BY OWNER)
    LOOP
        DBMS_OUTPUT.PUT_LINE('***DEBUG***: Schema: '||v_record.OWNER||', Obj count:'||v_record.NUM_OBJ);
    END LOOP;
END;

我得到不同的结果(我猜这是准确的)

***DEBUG***: Schema: APPQOSSYS, Obj count:3
***DEBUG***: Schema: DBSNMP, Obj count:55
***DEBUG***: Schema: ORACLE_OCM, Obj count:8
***DEBUG***: Schema: DBCONTROL, Obj count:27
***DEBUG***: Schema: OUTLN, Obj count:8
***DEBUG***: Schema: PUBLIC, Obj count:22543
***DEBUG***: Schema: SCH_PRIV, Obj count:43
***DEBUG***: Schema: SYS, Obj count:29321
***DEBUG***: Schema: SYSTEM, Obj count:501
***DEBUG***: Schema: TEST_SYAM_123, Obj count:3
***DEBUG***: Schema: XDB, Obj count:474

为什么会这样?

为什么存储过程无法找到某些架构?

我们如何使用存储过程获取准确的值?

1 个答案:

答案 0 :(得分:1)

这可能是因为按角色授予用户的权限不适用于存储过程。

有关此内容的更多信息:http://www.techrepublic.com/article/understanding-roles-in-oracle-stored-procedures/