Oracle快速入門學習筆記(第四課PL

PL/SQL

一、運算符

(1)賦值運算符 :=

(2)判斷是否相等 =

(3)字符串相連 ||

(4)不等於 <>

二、PL/SQL——————

Procedure Language & Structured Query Language

PL /SQL是一種高級數據庫程序設計語言,該語言專門用於在各種環境下對ORACLE數據

庫進行訪問。

模塊化

過程化

declare

a int;

b int;

c int;

BEGIN

-- 執行的邏輯

a:=10;-- 普通賦值

b:=20;

c:=a+b;

dbms_output.put_line(c);

end;

-- 給變量賦的值來自於表 select ... into ...

-- 統計員工的人數emp

DECLARE

counts int;

BEGIN

select count(*) into counts from emp;

dbms_output.put_line('部門人數'||counts);

end;

-- 查看錶結構

select * from user_tab_columns

where Table_Name='EMP';

select * from emp;

-- 將新增的數據返回到變量中 returning ...into ...

DECLARE

names varchar2(20);

row_id ROWID;

BEGIN

insert into emp(empno,ename) values(7779,'好習慣') returning rowid,ENAME into row_id,names ;

dbms_output.put_line(row_id||'----'||names);

end;

select sysdate from dual;

-- 複合數據類型(等同於java中class)

DECLARE

type student is record(

sid int,

names varchar2(10),

birthday date

);

stu1 student;

stu2 student;

BEGIN

stu1.sid:=1;

stu1.names:='劉小偉';

stu1.birthday:=sysdate;

stu2.sid:=9;

stu2.names:='厲小林';

stu2.birthday:=to_date('1999-09-09','yyyy-mm-dd');

dbms_output.put_line(stu1.names||'------'||stu2.names);

dbms_output.put_line(to_char(stu1.birthday,'yyyy-mm-dd')||'------'||stu2.birthday);

end;

-- 從表中獲取數據,存入到複合類型

-- 獲取10號部門的信息 DEPT

DECLARE

-- 創建複合類型

type dept_t is record(

dno number(2),

dn varchar2(14),

cc varchar2(13)

);

mydept dept_t;

BEGIN

select deptno,dname,loc into mydept from DEPT where DEPTNO=10;

dbms_output.put_line('部門編號 部門名稱 部門地址');

dbms_output.put_line(mydept.dno||' '||mydept.dn||' '||mydept.cc);

end;

-- %TYPE

-- 變量類型自動會和表的數據類型一致

DECLARE

-- 創建複合類型

type dept_t is record(

dno dept.DEPTNO%type,

dn DEPT.DNAME%type,

cc DEPT.LOC%type

);

mydept dept_t;

BEGIN

select deptno,dname,loc into mydept from DEPT where DEPTNO=10;

dbms_output.put_line('部門編號 部門名稱 部門地址');

dbms_output.put_line(mydept.dno||' '||mydept.dn||' '||mydept.cc);

end;

-- %rowtype

-- 定義的記錄類型和表的一行記錄一致

DECLARE

myd dept%rowtype;

BEGIN

select deptno,dname,loc into myd from DEPT WHERE deptno=10;

dbms_output.put_line('部門編號 部門名稱 部門地址');

-- 記錄類型變量.屬性(就是表的字段名)

dbms_output.put_line(myd.deptno||' '||myd.dname||' '||myd.loc);

END;

條件控制語句

/*

IF .. THEN

elsif ... THEN

else

end if;

*/

-- 抽獎

-- 生成隨機數dbms_random.value [0,1)

select dbms_random.value from dual;

declare

n int;

begin

select 151*dbms_random.value+50 into n from dual;

dbms_output.put_line('隨機數='||n);

if mod(n,9)=0 THEN

dbms_output.put_line('恭喜你,中一等獎,走向人生巔峰');

elsif mod(n,7)=0 THEN

dbms_output.put_line('恭喜你,中二等獎,還差一點就要贏取白富美沒了');

elsif mod(n,5)=0 THEN

dbms_output.put_line('恭喜你中了三等獎,獎品是一床被子');

ELSE

dbms_output.put_line('謝謝惠顧,紀念獎紙巾一包');

end if;

end;

-- CASE

declare

n int;

begin

select 151*dbms_random.value+50 into n from dual;

dbms_output.put_line('隨機數='||n);

case

when mod(n,9)=0 THEN

dbms_output.put_line('恭喜你,中一等獎,走向人生巔峰');

when mod(n,7)=0 THEN

dbms_output.put_line('恭喜你,中二等獎,還差一點就要贏取白富美沒了');

when mod(n,5)=0 THEN

dbms_output.put_line('恭喜你中了三等獎,獎品是一床被子');

ELSE

dbms_output.put_line('謝謝惠顧,紀念獎紙巾一包');

end case;

end;

-- case用在select語句中

循環語句

/* 一、簡單循環

loop

循環體

exit when 條件

end loop;

*/

-- 1-100之間累和

DECLARE

i int:=1;

s int:=0;

BEGIN

loop

s:=s+i;

i:=i+1;

exit when i>100;--循環結束的條件

end loop;

dbms_output.put_line(s);

END;

-- while循環

/*

while 條件 loop

循環體

end loop;

*/

-- 1-10到累乘的結果

DECLARE

i int:=1;

s int:=1;

BEGIN

while i<=10 loop

s:=s*i;

i:=i+1;

end loop;

dbms_output.put_line(s);

end;

-- FOR循環

/*

for i in a..b loop

循環體

end loop;

【注意】循環變量i不需要聲明,可以直接使用

*/

declare

s int :=0;

BEGIN

for i in 1..100 loop

if mod(i,2)=0 THEN

s:=s+i;

end if;

end loop;

dbms_output.put_line('100以內的偶數相加='||s);

end;

-- 判斷一個數是否是素數

declare

m int :=9;

flag boolean :=true;

BEGIN

for i in 2..m-1 loop

if mod(m,i)=0 THEN

flag:=false;

exit;

end if;

end loop;

-- ???用函數,將true和false分別用漢字提示代替

dbms_output.put_line(decode(flag,true,'是素數',false,'不是素數'));

end;

遊標

/*

遊標是一個指向結果集的當前記錄的指針,

遊標指向哪一行,我們就能讀取哪一行的數據

遊標最初指向第一行的前一行

遊標的分類:

A、顯示遊標

② 打開遊標

③ 提取遊標

④ 關閉遊標

B、隱式遊標

簡化上述操作,利用for循環

*/

DECLARE

x emp%rowtype;

cursor c is select * from emp;

BEGIN

-- ② 打開遊標

open c;

-- ③ 提取遊標

fetch c into x;-- 移動遊標並且將當前行保存x變量

while c%found loop

dbms_output.put_line(x.ename||' ');

fetch c into x;-- 遍歷,將下一行數據存入x對象

end loop;

--dbms_output.put_line('fsdkfj ');

-- ④ 關閉遊標

close c;

end;

select * from emp;

-- 帶參數的遊標

DECLARE

e emp.ename%type;

j EMP.job%type;

cursor c(n int) is select ename,job from EMP

where mod(empno,n)=0;

BEGIN

-- 打開遊標,將參數傳入

open c(4);

-- 提取數據

fetch c into e,j;

while c%found loop

dbms_output.put_line(e||' '||j);

fetch c into e,j;

end loop;

-- 關閉遊標

close c;

end;

--隱式遊標--簡化遊標操作

DECLARE

cursor c is select * from dept;

BEGIN

for x in c loop

dbms_output.put_line(x.deptno||'--'||x.dname||'--'||x.loc);

end loop;

end;

-- 帶參遊標

DECLARE

cursor c(i int) is select * from dept where mod(deptno,i)=0;

BEGIN

for x in c(4) loop

dbms_output.put_line(x.deptno||'--'

||x.dname||'--'||x.loc);

end loop;

end;


分享到:


相關文章: