首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Toad和Oracle中过程与CREATE或REPLACE过程的区别

问Toad和Oracle中过程与CREATE或REPLACE过程的区别
EN

Stack Overflow用户
提问于 2021-04-07 06:43:25
回答 2查看 121关注 0票数 0

我正在学习Oracle、PL/SQL和Toad。据我所知,一个过程可能是这样开始的: procedure my_procedure IS BEGIN...

我在Toad中创建了过程,它总是这样: CREATE OR REPLACE PROCEDURE my_procedure IS /****(样板注释) BEGIN...

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

如果我在Toad的编辑器中打开它并删除"CREATE OR REPLACE“,只留下过程,我得到一个无效的SQL语法错误。

EN

回答 2

Stack Overflow用户

发布于 2021-04-07 13:56:36

在我看来,你似乎不了解它是如何工作的。

为了创建a过程,在any tool ( SQL *Plus,SQL Developer,TOAD,...)您必须使用适当的语法,即

代码语言:javascript
复制
CREATE PROCEDURE my_proc AS ...

例如:

代码语言:javascript
复制
SQL> create procedure my_proc as
  2  begin
  3    null;
  4  end;
  5  /

Procedure created.

为了运行(执行)它,你可以这样调用它

代码语言:javascript
复制
SQL> begin
  2    my_proc;
  3  end;
  4  /

PL/SQL procedure successfully completed.

到目前一切尚好。但是,这个过程根本不会做任何事情,所以如果您想对其代码进行编辑,可以尝试“重用”已有的脚本( create procedure ...脚本):

代码语言:javascript
复制
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;过程已删除。SQL> create procedure my_proc as 2 l_cnt number;3 begin 4 select count(*) into dual l_cnt;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 dual l_cnt;5 end;6/ procedure created。

当然,您仍然可以像以前一样使用它:

代码语言:javascript
复制
SQL> begin
  2    my_proc;
  3  end;
  4  /

PL/SQL procedure successfully completed.

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

代码语言:javascript
复制
SQL> begin
  2    my_proc;
  3  end;
  4  /

PL/SQL procedure successfully completed.

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

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

我不明白为什么每次当我写完过程,只想运行

时,我都要创建或替换它。

简单地说就是错误的。您不必每次都对过程执行create or replace操作。你只需要使用它。

票数 1
EN

Stack Overflow用户

发布于 2021-04-07 07:44:29

当任何对象(过程或函数..)是第一次创建"Create Procedure XXX..“已经足够了,但是为了编辑现有的过程,我们需要提到“创建或替换..”。因此,Oracle理解您将编辑现有对象。

关于您的问题,Toad和Sql-Developers是工具,因此,当您创建过程并从GUI的Procedure部分单击该过程名称时,它会将您带到可编辑代码。因此,它在缺省情况下会更改"Create Procedure..““创建或替换..”

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

代码语言:javascript
复制
 select * from all_source where owner='SCHEMA NAME' and TYPE='PROCEDURE';
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66977385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档