Почему мы пишем создать / заменить для создания процедуры в PL / SQL - PullRequest
2 голосов
/ 07 марта 2011

Может кто-нибудь объяснить, почему мы пишем CREATE OR REPLACE для создания хранимой процедуры в PL / SQL?

Ответы [ 3 ]

3 голосов
/ 07 марта 2011

ИЛИ ЗАМЕНА позволяет вам заменить процедуру, которая уже существует, другими словами, вам не нужно отбрасывать процедуру и пересоздавать ее каждый раз, когда вы хотите воссоздать ее

2 голосов
/ 07 сентября 2016

REPLACE KEYWORD Позволяет вам изменять уже существующие объекты базы данных.

рассмотрите приведенные ниже примеры, тогда вы все ясно поймете.

CREATE PROCEDURE pr_greetings
IS 
BEGIN
  DBMS_OUTPUT.PUT_LINE('Hello');
END;

ВЫХОД:

PROCEDURE PR_GREETINGS compiled

Еслимы пытаемся изменить без REPLACE KEYWORD, мы получаем ошибку, поэтому я должен удалить ее и заново создать.см. ниже.

CREATE PROCEDURE pr_greetings              ``
IS
BEGIN
  DBMS_OUTPUT.PUT_LINE('Hello World');
END;

OUTPUT:
ORA-00955: name is already used by an existing object

Теперь с помощью ключевого слова REPLACE мы можем изменить это

CREATE or REPLACE PROCEDURE pr_greetings
IS
BEGIN
  DBMS_OUTPUT.PUT_LINE('Hello World');
END;

OUTPUT:
PROCEDURE PR_GREETINGS compiled.

Надеюсь, вы понимаете ясно, спасибо.

1 голос
/ 08 марта 2011

1 Чтобы изменить процедуру без «создания или замены», вы должны удалить и воссоздать сам объект в два этапа.

2 Основная причина заключается в сохранении грантов объекта:

SQL> connect to hr
Connected to Oracle Database 10g Express Edition Release 10.2.0.1.0 
Connected as hr

SQL> 
SQL> create procedure dummy
  2  as
  3  begin
  4      null;
  5  end dummy;
  6  /
Procedure created


SQL> grant execute on dummy to bps;

Grant succeeded

SQL> connect bps
Connected to Oracle Database 10g Express Edition Release 10.2.0.1.0 
Connected as bps

SQL> select * from user_tab_privs_recd where table_name ='DUMMY';

OWNER                          TABLE_NAME                     GRANTOR                        PRIVILEGE                                GRANTABLE HIERARCHY
------------------------------ ------------------------------ ------------------------------ ---------------------------------------- --------- ---------
HR                             DUMMY                          HR                             EXECUTE                                  NO        NO
SQL> exec hr.dummy;

PL/SQL procedure successfully completed

SQL> connect hr
Connected to Oracle Database 10g Express Edition Release 10.2.0.1.0 
Connected as hr

SQL> create or replace procedure dummy
  2  as
  3  begin
  4      null;
  5      dbms_output.put_line('dummy');
  6  end;
  7  /

Procedure created

SQL> select * from user_tab_privs_made where table_name ='DUMMY';

GRANTEE                        TABLE_NAME                     GRANTOR                        PRIVILEGE                                GRANTABLE HIERARCHY
------------------------------ ------------------------------ ------------------------------ ---------------------------------------- --------- ---------
BPS                            DUMMY                          HR                             EXECUTE                                  NO        NO

SQL> connect bps
Connected to Oracle Database 10g Express Edition Release 10.2.0.1.0 
Connected as bps

SQL> 
SQL> select * from user_tab_privs_recd where table_name ='DUMMY';

OWNER                          TABLE_NAME                     GRANTOR                        PRIVILEGE                                GRANTABLE HIERARCHY
------------------------------ ------------------------------ ------------------------------ ---------------------------------------- --------- ---------
HR                             DUMMY                          HR                             EXECUTE                                  NO        NO


SQL> set serveroutput on
SQL> exec hr.dummy;

dummy

PL/SQL procedure successfully completed

SQL> connect hr
Connected to Oracle Database 10g Express Edition Release 10.2.0.1.0 
Connected as hr
 SQL> drop procedure dummy;

Procedure dropped
SQL> create  procedure dummy
  2  as
  3  begin
  4      null;
  5      dbms_output.put_line('dummy');
  6  end;
  7  /

Procedure created
SQL> -- as you can see priviliges previously made are gone
SQL> select * from user_tab_privs_made where table_name ='DUMMY';

GRANTEE                        TABLE_NAME                     GRANTOR                        PRIVILEGE                                GRANTABLE HIERARCHY
------------------------------ ------------------------------ ------------------------------ ---------------------------------------- --------- ---------

SQL> connect bps
Connected to Oracle Database 10g Express Edition Release 10.2.0.1.0 
Connected as bps
SQL> select * from user_tab_privs_recd where table_name ='DUMMY';

OWNER                          TABLE_NAME                   GRANTOR                        
------------------------------ ---------------------------------------- 
SQL> exec hr.dummy;

begin hr.dummy; end;

ORA-06550: line 2, column 7:
PLS-00201: identifier 'HR.DUMMY' must be declared
ORA-06550: line 2, column 7:
PL/SQL: Statement ignored

SQL> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...