當前位置:首頁 » 存儲配置 » 存儲過程exception

存儲過程exception

發布時間: 2023-09-03 00:07:28

Ⅰ oracle存儲過程基本語法

一:存儲過程

創建存儲過程,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系統許可權   

刪除存儲過程,是過程的創建者或者擁有DROP ANY PROCEDURE系統許可權 

修改存儲過程,則只能是過程的創建者或者擁有ALTER ANY PROCEDURE系統許可權的人

執行(或調用)存儲過程,是過程的創建者或是擁有EXECUTE ANY PROCEDURE系統許可權的人或是被擁有者授予EXECUTE許可權的人

1:語法

 1)創建

CREATE[ORREPLACE]PROCEDURE存儲過程名[(參數[IN|OUT|INOUT] 數據類型...)]

{AS|IS}

[說明部分]

BEGIN

可執行部分

[EXCEPTION

錯誤處理部分]

END[過程名];

 說明:

   OR REPLACE 表示如果存在就覆蓋存儲過程

   參數有三種形式:IN、OUT和IN OUT。則默認為IN。

  關鍵字AS也可以寫成IS,後跟過程的說明部分,可以在此定義過程的局部變數。

2)刪除存儲過程:

DROP PROCEDURE 存儲過程名;

3)修改存儲過程:

      ALTER PROCEDURE 存儲過程名 COMPILE; 

4)執行存儲過程

      EXECUTE 模式名.存儲過程名[(參數...)]; 

     或

       BEGIN 

模式名.存儲過程名[(參數...)];

END;

另外:參數可以是變數、常量或表達式

 要其它用戶執行存儲過程須要給其它用戶授權

GRANT EXECUTE ON 存儲過程名 TO 用戶名

 2:參數說明

IN 定義一個輸入參數變數,用於傳遞參數給存儲過程

OUT 定義一個輸出參數變數,用於從存儲過程獲取數據

IN OUT 定義一個輸入、輸出參數變數,兼有以上兩者的功能

 1)參數名 IN 數據類型 DEFAULT 值;

          定義一個輸入參數變數,用於傳遞參數給存儲過程。

          可以是常量、有值變數或表達式

          DEFAULT 關鍵字為可選項,用來設定參數的默認值。如果在調用存儲過程時不指明參數,則參數變數取默認值

          在存儲過程中,輸入變數接收主程序傳遞的值,但不能對其進行賦值。

2)參數名 OUT 數據類型;

          定義一個輸出參數變數,用於從存儲過程獲取數據,即變數從存儲過程中返回值給主程序。

          在調用存儲過程時,主程序的實際參數只能是一個變數,而不能是常量或表達式。

          在存儲過程中,參數變數只能被賦值而不能將其用於賦值,而且必須給輸出變數至少賦值一次。

3)參數名 IN OUT 數據類型 DEFAULT 值; 

          定義一個輸入、輸出參數變數,兼有以上兩者的功能。

          在調用存儲過程時,主程序的實際參數只能是一個變數,而不能是常量或表達式。

          DEFAULT 關鍵字為可選項,用來設定參數的默認值。

          在存儲過程中,變數接收主程序傳遞的值,同時可以參加賦值運算,也可以對其進行賦值。在存儲過程中必須給變數至少賦值一次。

補充:如果省略IN、OUT或IN OUT,則默認模式是IN。 

          調用它時參數個數與位置可以不一致,用以下形式調用:

EXECUTE CHANGE_SALARY(P_RAISE=>80,P_EMPNO=>7788);  //=>運算符左側是參數名,右側是參數表達式

 二:函數

創建函數,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系統許可權

刪除函數,需要是函數的創建者或者是擁有DROP ANY PROCEDURE系統許可權的人

修改函數,需要是函數的創建者或者擁有ALTER ANY PROCEDURE系統許可權的人

執行函數,需要是函數的創建者或擁有EXECUTE ANY PROCEDURE系統許可權的人

1:語法

1)創建:

CREATE[ORREPLACE]FUNCTION函數名[(參數[IN] 數據類型...)]

RETURN數據類型

{AS|IS}

[說明部分]

BEGIN

可執行部分

RETURN(表達式)

[EXCEPTION

    錯誤處理部分]

END[函數名];

 說明:

     參數是可選的,但只能是IN類型(IN關鍵字可以省略)。

     在定義部分的RETURN 數據類型,用來表示函數的數據類型,也就是返回值的類型,不可省略。

     在可執行部分的RETURN(表達式),用來生成函數的返回值,其表達式的類型應該和定義部分說明的函數返回值的數據類型一致。在函數的執行部分可以有多個RETURN語句,但只有一個RETURN語句會被執行,一旦執行了RETURN語句,則函數結束並返回調用環境。 

2)刪除

      DROP FUNCTION 函數名;

3)修改

      ALTER PROCEDURE 函數名 COMPILE;

4)執行

      變數名:=函數名(...) 

三:對存儲過程 和 函數的查看(可以通過對數據字典【USER_SOURCE】的訪問來查詢存儲過程或函數的有關信息)

 1:查詢某個存儲過程序內容

select TEXT from user_source WHERE NAME='存儲過程名';

 2:查看數據字殿

DESCRIBE USER_SOURCE ; //命令行中

 3:查看存儲過程的參數

DESCRIBE say_hello; //後面是過程名

 4:查看發生編輯錯誤

SHOW ERRORS ;

 5:查詢一個存儲過程或函數是否是有效狀態(即編譯成功)

SELECT STATUS FROM USER_OBJECTS WHERE OBJECT_NAME='過程名';//注意大小寫

VALID表示該存儲過程有效(即通過編譯),INVALID表示存儲過程無效或需要重新編譯。它的狀態會改變,這與它依賴外部表(表刪除修改等操作)有關系

6:查看存儲過程與表的依賴關系

SELECT REFERENCED_NAME,REFERENCED_TYPE FROM USER_DEPENDENCIES WHERE NAME='SAY_HELLO';

 說明

NAME為實體名,TYPE為實體類型,REFERENCED_OWNER為涉及到的實體擁有者賬戶,REFERENCED_NAME為涉及到的實體名,REFERENCED_TYPE 為涉及到的實體類型。

問題:

如果一個用戶A被授予執行屬於用戶B的一個存儲過程的許可權,在用戶B的存儲過程中,訪問到用戶C的表,用戶B被授予訪問用戶C的表的許可權,但用戶A沒有被授予訪問用戶C表的許可權,那麼用戶A調用用戶B的存儲過程是失敗的還是成功的呢?答案是成功的。

Ⅱ oracle如何捕獲存儲過程報錯是哪一行

如果資料庫是10g及以上版本,可以使用dbms_utility.format_error_backtrace(),這個函數能夠返回錯誤行,可以套用以下格式:
create or replace procere prc_test(參數) is
v_no number;
begin
select no into v_no from zrp;
exception
when others then
dbms_output.put_line('sql CODE:'||sqlcode||chr(10)||
sqlerrm||chr(10)||
dbms_utility.format_error_backtrace());
end;
這樣寫的好處是,當程序發成異常,唄exception捕獲後,就會列印出錯誤信息及發生錯誤的行號

Ⅲ 如何讓存儲過程拋出異常

你說的異常是什麼意思?如果是,執行中的錯誤,那麼可以用「調試」,不過需要有一個系統許可權的擁護才能調試,許可權好象是什麼debug XXXXX。 如果說的是有時執行因為這樣那樣的數據問題出現的異常,那麼一般都是通過exception來拋出異常的,這樣的拋出的異常,你可以自己編代碼,然後輸入一張表內,這樣就可以捕獲異常了。如果1表示沒有主鍵,2表示數據超長等等。具體的寫法網上很多,這里就不寫了。

Ⅳ oracle 存儲過程異常處理

先建一個錯誤跟蹤表
create sequence s_error_id;
CREATE TABLE ERROR_RECORD
(
ERROR_ID NUMBER(10) primary key,
ERROR_CODE NUMBER(10),
ERROR_MSG VARCHAR2(2000),
ERROR_DATE DATE,
ERROR_PROGRAM VARCHAR2(200)
);
--------在過程的例外里向跟蹤表寫入錯誤信息:
create or replace procere day_task is
v_sqlcode ERROR_RECORD.ERROR_CODE%type;
v_msg ERROR_RECORD.error_msg%type;
begin
------program body
exception when others then
--記錄錯誤信息表
v_sqlcode :=sqlcode;
v_msg :=sqlerrm;
insert into error_record(error_code,error_msg,error_date,error_program)
values (v_sqlcode,v_msg,sysdate,『day_task』);
end;

Ⅳ mysql存儲過程怎麼獲取異常信息

DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
其中,
handler_type的取值范圍:CONTINUE | EXIT | UNDO
condition_value的取值范圍:SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code
這個語句指定每個可以處理一個或多個條件的處理程序。如果產生一個或多個條件,指定的語句被執行。 對一個CONTINUE處理程序,當前子程序的執行在執行處理程序語句之後繼續。對於EXIT處理程序,當前BEGIN...END復合語句的執行被終止。UNDO 處理程序類型語句還不被支持。

· SQLWARNING是對所有以01開頭的SQLSTATE代碼的速記。

· NOT FOUND是對所有以02開頭的SQLSTATE代碼的速記。

· SQLEXCEPTION是對所有沒有被SQLWARNING或NOT FOUND捕獲的SQLSTATE代碼的速記。

註:除了SQLSTATE值,MySQL錯誤代碼也不被支持。

例:
delimiter $$

CREATE TABLE `_t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`val1` varchar(20) DEFAULT NULL,
`val2` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=113 DEFAULT CHARSET=latin1$$

DELIMITER $$

CREATE DEFINER=`abandonship`@`%` PROCEDURE `P_TestException`()
BEGIN
declare _var,_err int default 0;

熱點內容
三菱人機界面編程實例 發布:2025-01-31 03:13:04 瀏覽:237
des加密畢業論文 發布:2025-01-31 02:57:01 瀏覽:711
ip跨網段訪問 發布:2025-01-31 02:44:42 瀏覽:709
演算法帶頭人 發布:2025-01-31 02:42:25 瀏覽:552
方舟上傳數據 發布:2025-01-31 02:42:25 瀏覽:836
鈴木uy比uu多了什麼配置 發布:2025-01-31 02:34:11 瀏覽:677
蝦米音樂緩存文件夾 發布:2025-01-31 02:34:04 瀏覽:887
主播用什麼我的世界啟動器玩伺服器 發布:2025-01-31 02:32:37 瀏覽:644
做電腦硬體需要哪些配置 發布:2025-01-31 02:30:53 瀏覽:440
小米智能門鎖驗證密碼是多少 發布:2025-01-31 02:30:50 瀏覽:534