我正在学习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语法错误。
发布于 2021-04-07 13:56:36
在我看来,你似乎不了解它是如何工作的。
为了创建a过程,在any tool ( 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;过程已删除。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。
当然,您仍然可以像以前一样使用它:
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 ...
因此:你所说的和困扰你的:
我不明白为什么每次当我写完过程,只想运行
时,我都要创建或替换它。
简单地说就是错误的。您不必每次都对过程执行create or replace操作。你只需要使用它。
发布于 2021-04-07 07:44:29
当任何对象(过程或函数..)是第一次创建"Create Procedure XXX..“已经足够了,但是为了编辑现有的过程,我们需要提到“创建或替换..”。因此,Oracle理解您将编辑现有对象。
关于您的问题,Toad和Sql-Developers是工具,因此,当您创建过程并从GUI的Procedure部分单击该过程名称时,它会将您带到可编辑代码。因此,它在缺省情况下会更改"Create Procedure..““创建或替换..”
运行以下查询并查看过程的元数据(Text列)。它不会有"Craete or Replace..“
select * from all_source where owner='SCHEMA NAME' and TYPE='PROCEDURE';https://stackoverflow.com/questions/66977385
复制相似问题