【问题标题】:Saving a new procedure in SQLDeveloper在 SQLDeveloper 中保存新过程
【发布时间】:2015-11-10 16:28:54
【问题描述】:

如果我们使用 Oracle SQL Developer 创建一个新过程,假设 TESTPROC

CREATE OR REPLACE PROCEDURE TESTPROC AS 
BEGIN
 --SOMETHING
END TESTPROC;

直接用CTRL+S保存,不运行,不会保存为程序吗?如果我们关闭窗口并尝试在程序列表中搜索它,我们找不到它?

我们是否需要至少运行一次 proc 才能保存它?

有什么方法可以找回这样丢失的过程?

【问题讨论】:

  • "尝试在程序列表中搜索"...你的意思是在oracle表系统中搜索它?
  • 您必须编译该程序以将其保存在磁盘中。期间。

标签: oracle plsql compilation oracle-sqldeveloper


【解决方案1】:

尝试在程序列表中搜索它

这个查询告诉你你的过程是否存在于你的数据库中

select * from user_procedures where object_name ='THE NAME OF YOUR PROC'

或者

select * from user_objects where object_type ='PROCEDURE' and OBJECT_NAME='THE NAME OF YOUR PROC'

解决错误object already exists 在你的程序中添加or replace 像这样

create or replace procedure Proc_test ...

【讨论】:

【解决方案2】:

CTRL+S - 保存文件。您可以在您的操作系统中找到此文件。

要将程序保存在数据库中,您必须在数据库中创建它。为此,您需要执行CREATE PROCEDURE。所以不,你没有将它“保存”在数据库中。

【讨论】:

  • 当我试图创建一个同名的新过程时,我得到错误对象已经存在。但是如果我过滤同名的程序就找不到它。如何检索现有的?
  • 在 SQL 开发者中使用“刷新”按钮
【解决方案3】:

直接用CTRL+S保存,不运行,不会保存为程序吗?

Oracle SQL Developer 是一个IDE,而不是数据库服务器。它提供了一个接口来与数据库进行交互。 CTRL + S 是 Windows 操作系统的快捷方式,与 Oracle 数据库无关。

您必须编译该过程以将其存储到磁盘中。

You said,

当我尝试创建一个同名的新过程时,我得到错误对象已存在

那是因为您没有使用REPLACE 关键字来覆盖现有对象。

让我们看看原因:

SQL> CREATE PROCEDURE foo
  2  AS
  3  BEGIN
  4    NULL;
  5  END;
  6  /

Procedure created.

SQL> CREATE PROCEDURE foo
  2  AS
  3  BEGIN
  4    NULL;
  5  END;
  6  /
CREATE PROCEDURE foo
                 *
ERROR at line 1:
ORA-00955: name is already used by an existing object

如何避免:使用CREATE OR REPLACE

SQL> CREATE OR REPLACE PROCEDURE foo
  2  AS
  3  BEGIN
  4    NULL;
  5  END;
  6  /

Procedure created.

要查看已编译的过程是否存在于数据库中,请查询 [DBA|ALL|USERS]_PROCEDURES 视图。

有两件事:

  • 独立程序 - 使用object_name 作为过滤器
选择所有者, 对象名称, 程序名称, 对象类型 FROM all_procedures WHERE 所有者 ='OWNER' AND object_name='PROC_NAME';
  • 打包程序 - 使用procedure_name 作为过滤器
选择所有者, 对象名称, 程序名称, 对象类型 FROM all_procedures WHERE 所有者 ='OWNER' AND procedure_name='PROC_NAME';

【讨论】:

  • 感谢您提供如此详细的解释。真的很感激。
【解决方案4】:

PLSQL Developer 或任何其他客户端只是您与数据库本身对话的工具。您可能正在使用 Toad、sql* 或任何其他接口,它们可能都有自己的处理方式。

你所谓的运行,其实就是编译。当您“运行”您提供的语句时,它仅针对您连接的数据库进行编译。只有调用从 PLSQL 块编译的过程,它才能真正运行。

尝试了解数据库服务器和 IDE 之间的区别,然后您会更自如地使用 Oracle。

【讨论】:

  • 当我试图创建一个同名的新过程时,我得到错误对象已经存在。但是如果我过滤同名的程序就找不到它。如何检索现有的?
  • @user2093576 使用CREATE OR REPLACE 这样你就不会得到对象已经存在的错误。
猜你喜欢
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
  • 2016-04-24
  • 2018-07-14
相关资源
最近更新 更多