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=’CANDY’ WHERE 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;
至此,簡單的儲存過程建立就講完了。