1. 程式人生 > >ORACLE 儲存過程的建立以及ORA-06502:PL/SQL:數字或值錯誤的解決方法

ORACLE 儲存過程的建立以及ORA-06502:PL/SQL:數字或值錯誤的解決方法

建立四個儲存過程,分別是簡單不帶引數的儲存過程、帶兩個輸入引數IN的儲存過程、帶一個輸入引數IN,一個輸出引數OUT的儲存過程和帶兩個輸入輸出引數IN OUT的儲存過程。
建立一張全域性臨時emp表

CREATE GLOBAL TEMPORARY TABLE emp(
empno NUMBER(4),
ename VARCHAR2(8)
);

這裡寫圖片描述

新增資料

INSERT INTO emp VALUES(6500,'Bomb');

這裡寫圖片描述

一、建立一個簡單的儲存過程update_emp,該過程用於將emp表中empno為6500的員工的姓名修改為CANDY,如下:

CREATE PROCEDURE
update_emp AS BEGIN UPDATE emp SET ename=’CANDYWHERE empno =6500;
END update_emp; /

提示:[END update_emp 中的update_emp可以不用寫,但寫出來會增加可讀性 ]

這裡寫圖片描述

呼叫儲存過程

EXECUTE update_emp;

這裡寫圖片描述

檢視結果,是否被修改

SELECT ename FROM emp WHERE empno=6500;

這裡寫圖片描述

結果是:ename被修改了。

二、建立兩個帶IN引數的儲存過程update_emp2,為該過程設定兩個IN引數,分別用於接受使用者提供的empno與ename值,如下:

CREATE PROCEDURE update_emp2
( emp_num IN NUMBER , emp_name IN VARCHAR2) AS
BEGIN
 UPDATE emp SET ename=emp_name
 WHERE empno =emp_num;
END update_emp2;
/

這裡寫圖片描述

呼叫儲存過程,需要設定兩個引數,有兩種呼叫方式,如下:
① 不指定引數名

EXECUTE update_emp2 (6500,’XIAOQI’);

這裡寫圖片描述

② 指定引數名

EXEC update_emp2(emp_name=>'XIAOQI',emp_num=>6500
);

這裡寫圖片描述

檢視結果,是否被修改

SELECT ename FROM emp WHERE empno=6500;

這裡寫圖片描述

同樣結果是:ename被修改了。
三、建立儲存過程select_emp,為該過程設定一個IN引數和一個OUT引數,其中IN引數接受使用者提供的empno值,然後在過程體中將該empno對應的ename值傳遞給OUT引數,如下:

CREATE PROCEDURE select_emp
(emp_num IN NUMBER, emp_name OUT  VARCHAR2 ) AS
BEGIN
        SELECT ename INTO emp_name
        FROM emp WHERE empno =emp_num;
END select_emp;
/

這裡寫圖片描述

呼叫儲存過程時,如果需要顯示該過程中OUT引數的返回值,還需要事先使用VARIABLE語句宣告對應的變數接受返回值,並在呼叫過程時繫結該變數,形式如下:

VARIABLE emp_name VARCHAR2;//這個是錯誤的寫法
EXEC select_emp (6500, :emp_name);

這裡寫圖片描述

出現了一個BUG

通過查詢資料,大家都說是型別長度不匹配的問題,最後認真查詢錯誤,發現的確是沒在定義變數時設定長度而導致出現的BUG。解決方法:

VARIABLE emp_name VARCHAR2(8);

注意:這個8是和一開始建立表的時候設定字元長度的必須是一樣的,否則會報錯。這個是VARCHAR2型別所要求的,NUMBER型別不用。

這裡寫圖片描述

注意:在EXECUTE 語句中,呼叫繫結變數時候,需要在變數名前新增冒號(:)

要想檢視變數emp_name 中的值,就需要用PRINT 命令,如下:

PRINT emp_name;

這裡寫圖片描述

四、建立儲存過程exchange_value,通過該過程交換兩個變數中的值,過程建立如下:

CREATE PROCEDURE exchange_value
(value1 IN OUT NUMBER,value2 IN OUT NUMBER)
AS
temp1 NUMBER;
temp2 NUMBER;
BEGIN
        temp1 := value1;
        temp2 := value2;
        value1 := temp2;
        value2 := temp1;
END exchange_value;
/

這裡寫圖片描述

呼叫exchange_value 過程,呼叫前宣告為IN OUT 引數賦值的變數,呼叫後使用SELECT 語句輸出交換值後的結果,如下:
宣告變數

VARIABLE value1 NUMBER;
VARIABLE value2 NUMBER;

為宣告變數賦值(賦值的符號 := )

EXEC  :value1 :=2009;
EXEC  :value2 :=9002;

這裡寫圖片描述

執行儲存過程

EXEC exchange_value(:value1,:value2);

這裡寫圖片描述

檢視交換值後的結果

SELECT :value1,:value2 FROM dual;

這裡寫圖片描述

注意:使用EXEC 命令可以為變數賦值,並且繫結變數名前也需要新增冒號(:)

五、刪除儲存過程,刪除上面建立的儲存過程exchange_value

DROP PROCEDURE exchange_value;

這裡寫圖片描述

至此,簡單的儲存過程建立就講完了。