相同的PL / SQL函数返回两个不同的值

时间:2014-01-10 21:28:16

标签: oracle

我有PL / SQL函数,用于检查角色是否对某个对象具有特权

CREATE OR REPLACE FUNCTION HasPrivilegeOnObject(rolename      IN VARCHAR2,
                                                objectname    IN VARCHAR2,
                                                objectowner   IN VARCHAR2,
                                                privilegename IN VARCHAR2)
  RETURN NUMBER
AS
  output NUMBER;
  BEGIN
    SELECT count(*) INTO output
    FROM dba_tab_privs
    WHERE
      grantee = rolename AND
      owner = objectowner AND
      table_name = objectname AND
      privilege = privilegename;

    IF output > 0 THEN
      output := 1;
    END IF;

    RETURN output;
  END hasprivilegeonobject;

要检查它我做:

call dbms_output.put_line(HasPrivilegeOnObject('Role1','Table1','TableOwner','UPDATE'));

结果是:1;

但是当我运行与函数内部相同的查询时:

    select count(*) from DBA_TAB_PRIVS where 
        GRANTEE = 'Role1' and
        OWNER = 'TableOwner' and
        TABLE_NAME = 'Table1' and
        Privilege = 'UPDATE';  

结果为0。

有谁知道这有什么问题?

1 个答案:

答案 0 :(得分:0)

确保对象名称使用大写,即使将对象名称作为参数传递,除非您专门使用双引号创建对象。如果在创建对象名称时不使用双引号,则对象名称将在内部以大写形式存储。

您没有初始化Output - 函数的返回值。如果查询与任何行不匹配,会发生什么?这意味着返回值可能是不确定的。

除非您专门使用双引号将Table1命名为Table1(当创建Table1时),否则Table1将在内部存储,作为TABLE1存储在数据字典中。这意味着如果使用ObjectName(表名)参数“Table1”调用函数中的查询可能不一定匹配任何行。

这也不是必需的,但最好在函数中添加异常处理程序,以确保异常不会阻止返回值按预期完全设置。