--例1
declare
v_name varchar2(10);
begin
select user_name into v_name from tb_rd_user_info where user_name='ywj12';
dbms_output.put_line('name:'||v_name);
exception
when no_data_found then
dbms_output.put_line('error name');
end;

--匿名塊
-- 沒有名稱的pl/sql塊,如例1
--命名塊
--子程序
-- (1)過程
-- 建立過程時(shí)可以指定輸入?yún)?shù)(in),輸出參數(shù)(out)
create or replace procedure update_money(uname varchar2,num number)
is
begin
update tb_rd_user_info set game_money = num
where user_name = uname;
end update_money;
-- 刪除
drop procedure update_money;
-- 調(diào)用
exec update_money('ywj123',100000);
call update_money('ywj123',100000);
-- 重新編譯
alter procedure update_money compile;
-- 授權(quán)student用戶使用該過程
grant execute on update_money to student;
-- (2)函數(shù)
-- 創(chuàng)建
create or replace function get_user_id(uname varchar2)
return number is
uid number;
begin
select user_id into uid from tb_rd_user_info
where user_name=uname;
return uid;
end;
-- 調(diào)用
var rs number
call get_user_id('ywj123') into :rs;
-- 刪除
drop function get_user_id;
-- 重新編譯
alter function get_user_id compile;
-- (3)包
-- 創(chuàng)建(包由包規(guī)范和包體兩部分組成)
-- 包規(guī)范
create package emp_pkg is
procedure update_money (uname varchar2,num number);
function get_user_id(uname varchar2) return number;
end;
-- 包體
create package body emp_pkg is
procedure update_money(uname varchar2,num number)
is
begin
update tb_rd_user_info set game_money = num
where user_name = uname;
end update_money;
function get_user_id(uname varchar2)
return number is
uid number;
begin
select user_id into uid from tb_rd_user_info
where user_name=uname;
return uid;
end;
end;
-- 調(diào)用
call emp_pkg.update_money('ywj123',100000);
var rs number
call emp_pkg.get_user_id('ywj123') into :rs;

--解發(fā)器
存儲(chǔ)過程參數(shù)傳遞
參數(shù)的作用是向存儲(chǔ)過程傳遞數(shù)據(jù),或從存儲(chǔ)過程獲得返回結(jié)果。正確的使用參數(shù)可以大大增加存儲(chǔ)過程的靈活性和通用性。
參數(shù)的類型有三種,如下所示。
IN 定義一個(gè)輸入?yún)?shù)變量,用于傳遞參數(shù)給存儲(chǔ)過程
OUT 定義一個(gè)輸出參數(shù)變量,用于從存儲(chǔ)過程獲取數(shù)據(jù)
IN OUT 定義一個(gè)輸入、輸出參數(shù)變量,兼有以上兩者的功能
參數(shù)的定義形式和作用如下:
參數(shù)名 IN 數(shù)據(jù)類型 DEFAULT 值;
定義一個(gè)輸入?yún)?shù)變量,用于傳遞參數(shù)給存儲(chǔ)過程。在調(diào)用存儲(chǔ)過程時(shí),主程序的實(shí)際參數(shù)可以是常量、有值變量或表達(dá)式等。DEFAULT 關(guān)鍵字為可選項(xiàng),用來設(shè)定參數(shù)的默認(rèn)值。如果在調(diào)用存儲(chǔ)過程時(shí)不指明參數(shù),則參數(shù)變量取默認(rèn)值。在存儲(chǔ)過程中,輸入變量接收主程序傳遞的值,但不能對(duì)其進(jìn)行賦值。
參數(shù)名 OUT 數(shù)據(jù)類型;
定義一個(gè)輸出參數(shù)變量,用于從存儲(chǔ)過程獲取數(shù)據(jù),即變量從存儲(chǔ)過程中返回值給主程序。
在調(diào)用存儲(chǔ)過程時(shí),主程序的實(shí)際參數(shù)只能是一個(gè)變量,而不能是常量或表達(dá)式。在存儲(chǔ)過程中,參數(shù)變量只能被賦值而不能將其用于賦值,在存儲(chǔ)過程中必須給輸出變量至少賦值一次。
參數(shù)名 IN OUT 數(shù)據(jù)類型 DEFAULT 值;
定義一個(gè)輸入、輸出參數(shù)變量,兼有以上兩者的功能。在調(diào)用存儲(chǔ)過程時(shí),主程序的實(shí)際參數(shù)只能是一個(gè)變量,而不能是常量或表達(dá)式。DEFAULT 關(guān)鍵字為可選項(xiàng),用來設(shè)定參數(shù)的默認(rèn)值。在存儲(chǔ)過程中,變量接收主程序傳遞的值,同時(shí)可以參加賦值運(yùn)算,也可以對(duì)其進(jìn)行賦值。在存儲(chǔ)過程中必須給變量至少賦值一次。
如果省略IN、OUT或IN OUT,則默認(rèn)模式是IN。
CREATE OR REPLACE PROCEDURE CHANGE_SALARY(P_EMPNO IN NUMBER DEFAULT 7788,P_RAISE NUMBER DEFAULT 10)
AS
V_ENAME VARCHAR2(10);
V_SAL NUMBER(5);
BEGIN
SELECT ENAME,SAL INTO V_ENAME,V_SAL FROM EMP WHERE EMPNO=P_EMPNO;
UPDATE EMP SET SAL=SAL+P_RAISE WHERE EMPNO=P_EMPNO;
DBMS_OUTPUT.PUT_LINE('雇員'||V_ENAME||'的工資被改為'||TO_CHAR(V_SAL+P_RAISE));
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('發(fā)生錯(cuò)誤,修改失敗!');
ROLLBACK;
END;
參數(shù)的值由調(diào)用者傳遞,傳遞的參數(shù)的個(gè)數(shù)、類型和順序應(yīng)該和定義的一致。如果順序不一致,可以采用以下調(diào)用方法。如上例,執(zhí)行語句可以改為:
EXECUTE CHANGE_SALARY(P_RAISE=>80,P_EMPNO=>7788);
可以看出傳遞參數(shù)的順序發(fā)生了變化,并且明確指出了參數(shù)名和要傳遞的值,=>運(yùn)算符左側(cè)是參數(shù)名,右側(cè)是參數(shù)表達(dá)式,這種賦值方法的意義較清楚。
posted on 2010-07-26 18:20
junly 閱讀(734)
評(píng)論(0) 編輯 收藏 所屬分類:
oracle/mysql/sql