Toad 和 Oracle 中 PROCEDURE 和 CREATE OR REPLACE PROCEDURE 之间的区别

Posted

技术标签:

【中文标题】Toad 和 Oracle 中 PROCEDURE 和 CREATE OR REPLACE PROCEDURE 之间的区别【英文标题】:Distinction between PROCEDURE and CREATE OR REPLACE PROCEDURE in Toad and Oracle 【发布时间】:2021-04-06 22:43:24 【问题描述】:

我正在学习 Oracle、PL/SQL 和 Toad。据我了解,程序可能从以下开始: 程序 my_procedure 是 开始...

我在 Toad 中创建了程序,它总是这样: 创建或替换过程 my_procedure 是 /****(样板 cmets) 开始...

它工作正常。我粘贴了我的 DML SQL,执行它,刷新我的模式浏览器,my_procedure 就在那里。如果我使用 Toad 执行 my_procedure,我的数据将按预期进行修改。我可以不理它。但是我不明白为什么每次我写完程序并且只想运行 DML 时都要创建或替换我的程序。目标是有一个简单的过程,我的同事可以从他的一个 Perl 脚本或将来可能需要的任何其他方式调用。

如果我在 Toad 的编辑器中打开它并删除“CREATE OR REPLACE”并离开 PROCEDURE,我会收到 Invalid SQL Syntax 错误。

【问题讨论】:

这里的问题是什么?你想知道吗,是的,如果你想创建一个对象,无论是表、视图、序列、函数……还是过程,在 SQL 中,你需要使用适当的CREATE 语句,从CREATE? 【参考方案1】:

在我看来,你好像不明白它是如何工作的。

为了创建一个过程,在任何工具(SQL*Plus、SQL Developer、TOAD、...)中,您必须使用适当的语法,即

CREATE PROCEDURE my_proc AS ...

例如:

SQL> create procedure my_proc as
  2  begin
  3    null;
  4  end;
  5  /

Procedure created.

为了运行(执行)它,你可以称它为

SQL> begin
  2    my_proc;
  3  end;
  4  /

PL/SQL procedure successfully completed.

到目前为止一切顺利。虽然,这个过程根本没有做任何事情,所以如果你想编辑它的代码,你会尝试“重用”你已经拥有的脚本(create procedure ... 之一):

SQL> create procedure my_proc as
  2    l_cnt number;
  3  begin
  4    select count(*) into l_cnt from dual;
  5  end;
  6  /
create procedure my_proc as
                 *
ERROR at line 1:
ORA-00955: name is already used by an existing object

哎呀! my_proc 已经存在!那么,我该怎么办?

一种选择是先删除它,然后再创建它:

SQL> drop procedure my_proc;

Procedure dropped.

SQL> create procedure my_proc as
  2    l_cnt number;
  3  begin
  4    select count(*) into l_cnt from dual;
  5  end;
  6  /

Procedure created.

另一个(我们通常使用的)是使用create or replace选项:

SQL> create or replace procedure my_proc as
  2    l_cnt number;
  3  begin
  4    select count(*) into l_cnt from dual;
  5  end;
  6  /

Procedure created.

当然,你还是像以前一样使用它:

SQL> begin
  2    my_proc;
  3  end;
  4  /

PL/SQL procedure successfully completed.

现在,假设你们所有人(您和您的同事)都睡觉了,明天早上有人想要运行该程序。没问题 - 他们会使用我上次发布的相同代码:

SQL> begin
  2    my_proc;
  3  end;
  4  /

PL/SQL procedure successfully completed.

这意味着不必再次create or replace该过程 - 它存储在数据库中,等待被调用。除非发生了某些事情——这会“破坏它”(使其无效)——你不必再次触摸(重新创建)该过程。如果你这样做了,你就知道了:create or replace procedure my_proc as ...

因此:您所说的和困扰您的:

但我不明白为什么每次我写完我的 PROCEDURE 并只想运行 DML 时都要创建或替换它。

只是错误。您不必每次都create or replace 该过程。你就用它吧。

【讨论】:

【参考方案2】:

当第一次创建任何对象(过程或函数..)时,“创建过程 XXX..”就足够了,但为了编辑现有过程,我们需要提及“创建或替换..”。因此,Oracle 知道您将要编辑现有对象。

关于您的问题,Toad 和 Sql-Developers 是工具,因此当您创建过程并从 GUI 的过程部分单击该过程名称时,它将带您进入可编辑代码。因此,它默认将“创建过程..”更改为“创建或替换..”

运行以下查询并查看过程的元数据(文本列)。它不会有“Craete or Replace..”

 select * from all_source where owner='SCHEMA NAME' and TYPE='PROCEDURE';

【讨论】:

如您所说,在 TYPE 列中,只有 PROCEDURE my_procedure IS。那么,我想,当有人从 Perl 脚本或 APEX 页面调用 my_procedure 时,他们并没有执行 CREATE OR REPLACE PROCEDURE,而只是执行 my_procedure 的内容,即使我总是在 Toad 中看到 CREATE OR REPLACE PROCEDURE编辑器。 您似乎对语法感到困惑,请参阅@littlefoot 解释。如果您观察到,当您创建一个新过程时,您将代码编写为“创建 xx 过程 IS..”。但是,当您执行上述查询时,其中没有“创建”部分。为什么?。因为我们指示 Oracle 创建一个它所做的过程并将其保存在其源中,因此只有“Procedure XX IS..”。因此,任何调用它的应用程序(Apex/Perl)都会看到“Procedure XX IS..”。 如前所述,当您使用 Toad/SQL-Developer 等编码工具在 GUI 中查看过程时,它会将用户带到可编辑页面或使格式易于导出。这就是为什么您会看到“创建或替换过程 my_procedure IS..”总而言之,如果该过程按预期工作,那么您很好。

以上是关于Toad 和 Oracle 中 PROCEDURE 和 CREATE OR REPLACE PROCEDURE 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

在 TOAD 中执行 Oracle 程序

Oracle / Toad 中的 For 循环

如何在 Oracle toad 中编辑和保存存储过程?

toad for oracle可否批量导出存储过程

Oracle/Toad 期望啥日期格式?

Toad:自动在两个 Oracle 表之间进行每日传输?