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;