2011-03-07 60 views

回答

3

或更換,您可以取代已經存在,換句話說一個過程,你不需要刪除這個過程,你想重新創建

1

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> 
2

REPLACE關鍵字可以修改數據庫對象已經存在。

考慮下面的例子,然後你明白地理解。

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

OUTPUT:

PROCEDURE PR_GREETINGS compiled 

如果我們試圖擅自修改,REPLACE關鍵詞,我們得到錯誤, 所以我應該放棄它,並重新創建它。 見下文。

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. 

我希望您清楚瞭解, 謝謝。

相關問題