Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Toad和Oracle中过程和创建或替换过程的区别_Oracle_Plsql_Toad - Fatal编程技术网

Toad和Oracle中过程和创建或替换过程的区别

Toad和Oracle中过程和创建或替换过程的区别,oracle,plsql,toad,Oracle,Plsql,Toad,我正在学习Oracle、PL/SQL和Toad。据我所知,程序可能从以下内容开始: 程序我的程序是 开始 我在Toad中创建了程序,它总是这样: 创建或替换过程我的\u过程是 /****(样板评论) 开始 它很好用。我粘贴我的DMLSQL,执行它,刷新我的模式浏览器,我的_过程就在那里。如果我使用Toad执行我的_过程,我的数据将按预期修改。我可以不去管它。但我不明白为什么每次我写完程序,只想运行DML时,都要创建或替换我的程序。我们的目标是拥有一个简单的过程,我的同事可以从他的一个Perl脚本

我正在学习Oracle、PL/SQL和Toad。据我所知,程序可能从以下内容开始: 程序我的程序是 开始

我在Toad中创建了程序,它总是这样: 创建或替换过程我的\u过程是 /****(样板评论) 开始

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

如果我在Toad的编辑器中打开它,删除“创建或替换”并离开过程,我会得到一个无效的SQL语法错误。

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

说到您的问题,Toad和Sql开发人员都是工具,因此当您创建过程并从GUI中的过程部分单击该过程名称时,它将带您进入可编辑代码。因此,默认情况下,它将“创建过程…”更改为“创建或替换…”

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


在我看来,你似乎不明白它是如何工作的

为了创建一个过程,在任何工具(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.
到目前为止还不错。不过,此过程根本不起任何作用,因此如果您想编辑其代码,您可以尝试“重用”已有的脚本(创建过程…one):

哇<代码>我的程序已存在!那么,我该怎么办

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

    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.
    
  • 另一个(我们通常使用)是使用
    创建或替换
    选项:

    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.
这意味着您不必再次
创建或替换该过程-它存储在数据库中,等待调用。除非发生了什么事情——这会“破坏它”(使它无效)——否则你不必再碰(重新创建)这个过程。如果您这样做,您就知道了演练:
创建或替换过程my\u proc as…

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

但我不明白为什么每次我写完程序,只想运行DML时,都要创建或替换我的程序


这完全是错误的。您不必每次都创建或替换该过程。你只要使用它。

这里的问题是什么?你想知道吗?是的,如果你想创建一个对象,可以是一个表、一个视图、一个序列、一个函数。。。或者一个过程,在SQL中,您需要使用一个适当的
CREATE
语句,它以
CREATE
开头?正如您所说,在TYPE列中,只有procedure my_procedure是。因此,我假设,当有人从Perl脚本或APEX页面调用my_过程时,他们不是在执行创建或替换过程,而是在执行my_过程的内容,尽管我总是在Toad编辑器中看到创建或替换过程。您似乎对语法感到困惑,请参阅@littlefoot解释。如果您观察,当您创建一个新过程时,您编写的代码是“createxx procedure IS..”。但是,当您执行上述查询时,它没有“创建”部分。为什么?因为我们指示Oracle创建一个过程,并将其保存在源代码中,因此只有“过程XX是…”。因此,任何调用它(Apex/Perl)的应用程序都会看到“Procedure XX IS..”。如前所述,当您使用诸如Toad/SQL Developer之类的编码工具在GUI中查看一个过程时,它会将用户带到一个可编辑的页面,或者使格式易于导出。这就是为什么您会看到“创建或替换过程my_Procedure IS…”总之,如果该过程按预期工作,您就很好了。
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.