原創做品,轉自請註明出處:https://www.cnblogs.com/sunshine5683/p/10328524.htmlhtml
1、函數sql
一、函數是能夠返回一個特定的數據,函數的建立中必須包含return子句。數組
二、函數建立:app
create function sp_function2(spname varchar2) return number is salaries number(7,3);函數
begin oop
----執行部分fetch
select sal*10+nvl(comm,0)*10 into salaries from emp where ename=spname;spa
return salares;scala
end;指針
三、在sqlplus中調用函數
var xhq_salaries number
call sp_function2('SCOTT') into :xhq_salaries;
2、包
一、包是用於邏輯上組合過程和函數的,能夠使用create package命令建立一個包。
如:
create package sp_package is
procedure update_sal(name varchar2,newsal number);
function sp_function2(name varchar2) return number;
end;
二、建立包體
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 sp_function2(name varchar2) return number is
salaries number;
begin
select sal into salaries from emp where ename=name;
return salaries;
end;
end;
三、調用包的函數或過程
exec sp_package.update_sal('SMITH',120);
3、plsql變量
一、標量類型(scalar)
標量包含許多類型,此處介紹經常使用類型就能夠
如:
定義一個邊長字符串: v_ename varchar2(20);
定義一個小數 ,範圍-99.99~99.99: v_sal number(4,2);
定義一個小數並給一個初始值: v_sal2 number(6,2):=1111.11
例子:
輸入員工號,輸出員工工資,姓名,我的所得稅(稅率爲0.01)
declare
c_tax_rate number(3,2):=0.01;
v_ename varchar2(10);
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;
上面報錯緣由是定義v_ename varchar(5),但實際上返回的值大於定義的,因此報錯,改爲v_ename varchar(10),問題解決,正常執行。
標量使用%type類型:表面。列名%type
如上面:v_ename emp.ename%type;這樣定之後就會匹配大小,不會存在上述緩衝過小的錯誤,也不至於定義太大浪費空間。
二、複合類型(即plsql記錄)
相似於高級語言中的結構體,使用:記錄變量.記錄成員.
三、複合類型之plsql表,至關於高級語言中的數組,區別是下標能夠爲負數,而在高級語言中是不能夠爲負數的。
四、參照變量:是指用於存放數值指針的變量,經過參照變量,能夠使得應用程序共享相同對象,從而下降佔用的空間,在編寫plsql程序時,能夠使用遊標變量和對象變量兩種參照變量,簡單是用的最多的是遊標變量。
使用遊標變量時,不須要指定相應的select語句,可是使用又表示,須要指定select語句。
實例以下:
declare
type sp_emp_cursor is ref cursor;
test_cursor sp_emp_cursor;
--定義變量
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
--吧test_cursor和一個select結合
open test_cursor for select ename,sal from emp where deptno=&no;
--循環取出查詢出的數據
--循環取出查詢出的數據
loop
fetch test_cursor into v_ename,v_sal;
exit when test_cursor%notfound;
dbms_output.put_line('姓名:'||v_ename||'工資:'||v_sal);
end loop;
--關閉遊標
close test_cursor;
end;