在 SQLDeveloper 中保存新过程

Saving a new procedure in SQLDeveloper

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

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

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

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

有什么方法可以找回以这种方式丢失的程序?

CTRL+S - 保存文件。您可以在 OS 中找到此文件。

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

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

你们所谓的运行宁,其实就是所谓的编译。当您 "run" 您提供的语句时,它只会针对您连接的数据库进行编译。如果您调用从 PLSQL 块编译的过程,它实际上只能 运行。

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

try to search for it in list of procedures

此查询告诉您数据库中是否存在您的过程

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 ...

just save it using CTRL+S and don't run it, will it not be saved as procedure?

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

您必须编译程序才能将其存入磁盘。

,

when I am trying to create a new procedure of the same name, i get error object already exists

那是因为您没有使用 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作为过滤器
SELECT owner,
  object_name,
  procedure_name,
  object_type
FROM all_procedures
WHERE owner    ='OWNER'
AND object_name='PROC_NAME';
  • 打包程序 - 使用procedure_name作为过滤器
SELECT owner,
  object_name,
  procedure_name,
  object_type
FROM all_procedures
WHERE owner    ='OWNER'
AND procedure_name='PROC_NAME';