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 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章