【问题标题】:Oracle SQL Developer - Create Function Using ScriptOracle SQL Developer - 使用脚本创建函数
【发布时间】:2014-12-02 08:07:10
【问题描述】:

[解释]
如果我想创建一个属于模式'A'的函数,我的理解是我需要在模式'A'中创建包,并实现函数. (如果有其他方法,请纠正我)。
如果我尝试使用脚本文件创建函数(例如。New Gallery -> SQL Files (Database Files) to create untitled.sql),我会感到困惑,因为该函数不属于任何架构,它将存储在全局中。

[问题]
1) 如何使用脚本创建属于模式'A'的函数?
2)全局存储的函数无法访问schema表,如何解决?

【问题讨论】:

  • IMO 使用 GUI 不是一个可持续的解决方案。而是使用您喜欢的文本编辑器编写功能代码;将文件作为纯文本文件保存到版本控制系统中;使用 SQL*Plus 从命令行将文件运行/执行到数据库中。 GUI 非常适合读取数据库,但从不使用 GUI 直接在数据库中创建/修改 PL/SQL 代码。

标签: sql oracle plsql oracle-sqldeveloper


【解决方案1】:

我完全同意阿斯卡隆人的观点。为了您的问题,我将提供有关如何使用 SQL Developer 的 GUI 工具创建函数的说明,这将生成一个脚本。

在许多方面,我宁愿使用 SQL*Plus。为了我的示例,我将使用标准的 Oracle 示例模式 SCOTT。

问题一:如何使用脚本创建函数

注意:我展示了如何使用 SQL Developer 中的 GUI 工具创建这个函数,它们会生成一个脚本

如果您登录到数据库用户SCOTT,只需右键单击用户SCOTT的功能并选择“新建功能”

将打开“创建函数”对话框。

您只需修改名称以符合您的命名约定和您的项目。选择您的选项并选择确定。 接下来在代码编辑器中,修改函数以适应您的需要:

这是我的最终草稿。选择“编译”:

现在它显示为 SCOTT 拥有的函数对象。 GUI 工具生成一个脚本函数,无需限定 SCOTT 的所有权。如果没有限定,则默认情况下该功能归 SCOTT 所有。 :

如果我在以 SCOTT 身份登录的 SQL Developer 工作表中调用此函数,我们会在此处看到它:

一般来说,如果您想与所有用户共享一个对象,标准方法是授予 public 执行权限或创建一个 public 同义词。以下是向公众授予执行权限的示例:

然后您可以检查您与其他用户的权限:

一般来说,使用这个 GUI 工具很好,可以帮助您获得正确的语法。过一段时间你可能会放弃这个(相当缓慢和麻烦)。

问题2:全局存储的函数无法访问schema表,如何解决?

有很多方法可以解决如何授予对表的选择访问权限。

在我的示例中,可以将 table 上的 select 权限授予函数所有者 SCOTT。

你可以这样做:

GRANT SELECT ON OTHER_SCHEMA.PRECIOUS_TABLE TO SCOTT;

另一种常见的方法可能是将系统特权 SELECT ANY TABLE 授予 SCOTT。当然,始终要考虑安全性,并应遵守授予最少权限以完成任务的原则。

【讨论】:

  • 这是一个很棒的解释!!非常感谢帕特里克!!
  • 快速提问。我的函数的返回值类型将是其他类型(不是 Varchar 或数字),因此我需要实现“创建或替换类型 My_Return_Type 作为对象”。我如何包含在该工作表中?
  • GUI 不会公开模式所有者拥有的所有对象类型,因此您需要在没有 GUI 的情况下执行此操作。我会在您希望使用它的架构中创建您的对象类型,然后您可以使用该对象返回类型声明您的函数。
【解决方案2】:

您不需要使用包来创建函数。函数可以是独立的对象。

通过阅读Oracle Documentation 了解如何创建函数,可以找到创建函数的脚本。

要在特定架构中创建它,只需将架构名称添加到函数名称或以其他用户身份登录。

注意:如果您要在另一个模式中创建函数,您需要具有 CREATE ANY PROCEDURE 权限。

【讨论】:

  • 感谢您的帮助!如果可能的话,您能否向我解释一下“CREATE ANY PROCEDURE privilege”的更多信息?
  • 这是您自己的 DBA 授予您的用户帐户的特权,具体取决于您在数据库中的权限/特权。在另一个 Schema 中创建函数之前,您需要获得许可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多