存儲過程是在面試中常被問到的程序員必備技能之一。很多朋友被問到時唯唯諾諾,吞吞吐吐,明顯自信不足。其實存儲過程無外乎就是特定的功能,在特定的層次實現。這些朋友可能會觸發器,但是不怎么用存儲過程而已。久而久之,談虎色變。為此作者寫了一個 Oracle存儲過程的入門級例子,用實例來幫這些朋友對存儲過程 say "Hello,world!"。只希望可以方便到大家。
1 sql 語句創建一個用戶信息表 user_info
CREATE TABLE user_info
(
id VARCHAR2(4),
name VARCHAR2(15),
pwd VARCHAR2(15),
address VARCHAR2(30)
);
2 sql 語句創建一個存儲過程 AddNewUser
CREATE OR REPLACE PROCEDURE AddNewUser
(
n_id user_info.id%TYPE,
n_name user_info.name%TYPE,
n_pwd user_info.pwd%TYPE,
n_address user_info.address%TYPE
)
AS
BEGIN
--向表中插入數據
INSERT INTO user_info(id,name,pwd,address)
VALUES(n_id,n_name,n_pwd,n_address);
END AddNewUser;
/
表有了,存儲過程有了,那么什么時候調用呢,又是如何調用的呢?
3 存儲過程的調用
--下面我們利用PL/SQL匿名塊調用該過程
DECLARE
--描述新用戶的變量
v_id user_info.id%TYPE := 'u002';
v_name user_info.name%TYPE := 'wish';
v_pwd user_info.pwd%TYPE := 'history';
v_add user_info.address%TYPE := 'shanghai';
BEGIN
--調用過程,添加wish用戶到數據庫
AddNewUser(v_id,v_name,v_pwd,v_add);
DBMS_OUTPUT.PUT_LINE('用戶 ' || v_name || ' 已經成功插入');
END;
/
證明存儲過程編寫 OK
我們在程序中(或者 sql 可以出現的任何地方),使用 sql 調用我們剛寫好的存儲過程:
--利用EXEC()直接插入
EXEC AddNewUser('u003','jian','jian','beijing');
--或
EXECUTE AddNewUser('u004','zhang','zhang','beijing');
完畢。
細心地讀者會發現:存儲過程不就是對 sql 語句的封裝么?有了 AddNewUser 這個存儲過程,每次插入的時候我們不用寫 sql 語句 insert ... 了。
很對,存儲過程本質上就是對業務關系復雜的 sql 語句的封裝。sql 語句以程序塊的形式被封裝在了數據庫中了。寫好了以后,無論是 java,還是 .net ,抑或其他開發語言,可以像使用 sql 語句那樣隨意調用。這就是數據庫開發。
另外,過程與函數的差別:函數與過程有很多相似的地方,但也有一些差別,其中的一點就是,過程的參數可以有三種模式(IN、OUT、IN OUT),而函數只有一種(IN),因為使用函數的目的是傳入0或多個參數,返回單一的值,想讓函數返回多個值是一種不良的編程習慣,我們應該加以改正。