oracle--plsql2---函式、包、變數
函式用於返回特定的資料。建立函式時,函式頭部必須包含return子句,在函式體內必須包含return語句返回的資料。可以使用create function來建立函式
一般java的函式都返回一個值,這個函式一般也返回一個值。
示例:輸入員工姓名,返回員工的年薪
create function sp_fun2 (spName varchar2) return
number is yearSal number(7,2);
begin
--執行部分
select sal*12+nvl(comm,0)*12 into yearSal from emp where ename=spName;
return yearSal;
end;
/
函式呼叫
在sqlplus中呼叫
var income number 定義一個變數
call annual_income('SCOTT') into:income; --annual_incomec是函式的名稱 scott是你要查詢的引數,形參; income是定義的接收結果的變數
print income
在java中呼叫
select annual_income('SCOTT') from dual;
可以通過rs.getInt(1)得到返回的結果
包
用於在邏輯上組合過程和函式,由包規範和包體兩部分組成。
建立包,create package
create package sp_package is
procedure update_sal (name varchar2 ,newsal number);
function annual_income(name varchar2) return number;
end;
/
包的規範只包含了過程和函式的說明,但是沒有過程和函式的實現程式碼,包體用於實現包規範中的過程和函式
建立包體,createpackage body
create or replace package body sp_package is
procedure update_sal(name varchar2 ,newsal number)
is
begin
update emp set sal=newsal where ename=name;
end;
function annual_income(name varchar2)
return number is
annual_salary number;
begin
select sal*12+nvl(comm,0) into annual_salary from emp where ename=name;
return annual_salary;
end;
end;
/
呼叫包的過程或是函式
exec sp_package.update_sal('SCOTT',120);
變數
在pl/sql中 包括有4種變數,標量變數、複合變數、參照變數、lob
1.標量型別(scalar)
定義一個變長的字串
v_ename varchar2(10);
定義一個小數,範圍-9999.99~9999.99
v_sal number(6,2);
定義一個小數,並給一個初始值5.4, :=是pl/sql的賦值符號
v_sal number(6,2):=5.4;
定義一個日期型別
v_hiredate date;
定義一個布林變數,不能為空,初始值為false
v_valid boolean not null default false;
--輸入員工號,顯示姓名、工資、個人所得稅
--稅率0.03為例,
declare
c_tax_rate number(3,2):=0.03;
v_ename varchar2(5);
v_sal number(7,2);
v_tax_sal number(7,2);
begin
--執行
select ename,sal into v_ename,v_sal from emp where empno=&no;
--計算所得稅
v_tax_sal:=v_sal*c_tax_rate;
--輸出
dbms_output.put_line('姓名:'||v_ename||' 工資'||v_sal||' 交稅:'||v_tax_sal);
end;
/
標量使用%type型別
例如;把上例的v_ename varchar2(5); 修改為
v_ename emp.ename%type; 意思是v_ename型別和emp表中ename欄位,保持型別和長度都一致。
2.複合型別(composite)
用於存放多個值的變數,主要包括
(1)pl/sql記錄--------指:類似於高階語言的結構體
(2)pl/sql表--------------相當於高階語言的陣列,但需要注意,高階語言陣列下標不能為負數,而這裡是可以的,並且表元素的下標沒有限制
(3)巢狀表
(4)varray動態陣列
pl/sql記錄的示例程式碼
declare
type emp_record_type is record(
name emp.ename%type,
salary emp.sal%type,
title emp.job%type
);--type表示定義一個pl/sql記錄型別,型別包含了3個數據 name salary title,
sp_record emp_record_type;---定義了一個變數,變數的型別是剛才定義的型別
begin
select ename,sal,job into sp_record
from emp where empno=7788;
dbms_output.put_line('員工名:'||sp_record.name);
end;
/
pl/sql表的示例程式碼:
declare
--定義了一個表型別,該型別用於存放emp.ename%type 型別的資料
type sp_table_type is table of emp.ename%type
index by binary_integer;--意思是下標按整數排序,如果是整數,意味著可以是負數
sp_table sp_table_type;
begin
select ename into sp_table(0)
from emp where empno=7788;
dbms_output.put_line('員工名:'||sp_table(0));
end;
/
3.參照變數
指用於存放數值指標的變數,通過使用參照變數,可以使應用程式共享相同的物件,從而降低佔用的空間。
分為2種,遊標變數(ref cursor) 和 物件型別變數(ref obj_type)
(1)遊標變數
定義時,不需要指定相應的select語句,但使用時(open),需要指定select,這樣遊標就會與select結合了
--編寫一個塊,輸入部門號,顯示部門所有人工資和姓名
declare
--定義遊標型別
type sp_emp_cursor is ref cursor;
--定義變數,用於下面的迴圈
v_ename emp.ename%type;
v_sal emp.sal%type;
--定義遊標變數
test_cursor sp_emp_cursor;
begin
--執行
--把test—cursor和一個select結合,意思是這個遊標指向了,這個select查詢的結果集
open test_cursor for select ename ,sal from emp where deptno=&no;
--迴圈取出
loop
fetch test_cursor into v_ename ,v_sal;
--判斷工資,決定是否更新
--loop需要設定退出,判斷退出條件,判斷cursor是否為空
exit when test_cursor%notfound;
dbms_output.put_line('名字'||v_ename||' 工資:'||v_sal);
end loop;
--關閉遊標
close test_cursor;
end;
/
4.lob