PL/SQL:如何确保函数存在?

PL/SQL:如何确保函数存在?,sql,plsql,oracle11g,Sql,Plsql,Oracle11g,那么,我在运行PL/SQL函数时遇到了“权限不足”的问题: 以下是我遵循的步骤:在Windows命令提示符下,我按如下方式登录: 代码: 我在那里得到了SQL>提示,然后我尝试对我的函数“age”授予特权,如下所示: 代码: 其中,AGE是函数名,SCOTT是用户 我指的是以下文件: 我得到错误ORA-0402:函数体不存在。在发放补助金之前,我如何保存我的职能机构 请帮忙 在引用函数时,请使用完全限定的[schema].[object]名称,以确保发出正确的授权。否则,您将依赖指向正确对象的

那么,我在运行PL/SQL函数时遇到了“权限不足”的问题:

以下是我遵循的步骤:在Windows命令提示符下,我按如下方式登录:

代码:

我在那里得到了SQL>提示,然后我尝试对我的函数“age”授予特权,如下所示:

代码:

其中,AGE是函数名,SCOTT是用户

我指的是以下文件:

我得到错误ORA-0402:函数体不存在。在发放补助金之前,我如何保存我的职能机构


请帮忙

在引用函数时,请使用完全限定的
[schema].[object]
名称,以确保发出正确的授权。否则,您将依赖指向正确对象的公共同义词。函数必须存在,然后才能授予它,尽管它可能处于无效状态。您不能对不存在的对象发出授权(除了catch all
executeany
grant之外,这是一个特殊的数据库角色)

例如,如果模式为
FOOBAR
,函数名为
AGE
,则您将发出:

GRANT EXECUTE ON foobar.age TO scott
此外,在使用该功能时,请确保:

  • 存在指向函数的公共同义词,并且不存在隐藏公共同义词的本地同义词
  • 或者。。函数有一个本地同义词(例如
    SCOTT
    有一个本地同义词指向
    FOOBAR.AGE
  • 或者。。。通过函数的完全限定名引用函数(例如通过
    FOOBAR.AGE()调用它
  • 要检查函数本身是否有效,您可以查询
    所有对象
    ,并检查
    状态
    列:

    SELECT status
    FROM all_objects
    WHERE owner = 'FOOBAR'
      AND object_type = 'FUNCTION'
      AND object_name = 'AGE'
    

    感谢您的回答!我仍然在想,在发出grant命令之前,如何确保函数必须存在?我的意思是,我们不是在任何地方保存函数体,而是通过在SQL Plus上编写函数或创建“.SQL”来运行函数文件,然后从SQL Plus命令执行它。如果我在某个地方出错,请更正我。谢谢!如果函数不存在,grant命令将失败,因此您可以测试该失败(SQL*Plus将带错误退出)。如果您想在不存在的情况下以编程方式执行一些不同的操作,那么您可以将
    所有_对象
    状态检查放入PL/SQL块中,并在函数存在的情况下动态发出授予。感谢您的回复!是的,授予命令确实失败了,正如我在问题中提到的,但我想知道,为什么尽管没有得到授权hat错误当我在SQL plus命令中运行函数时,收到消息“function Created”消息?您能解释一下这个问题吗?Oracle允许您定义引用您没有权限使用的对象的函数/过程/包。如果您创建的函数引用了另一个函数(在不同的架构中),则会发生类似的情况,然后撤销对该另一个函数的授予(或对象已删除)。您的新函数将处于无效状态,因此您无法执行它,但它仍将存在。如果您尝试编译它,将出现与上面类似的错误。要测试您的函数是否有效,您还可以尝试通过
    ALTER function foobar compile
    编译它。
    GRANT EXECUTE ON foobar.age TO scott
    
    SELECT status
    FROM all_objects
    WHERE owner = 'FOOBAR'
      AND object_type = 'FUNCTION'
      AND object_name = 'AGE'