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