Oracle-PLSQL程式設計基礎
阿新 • • 發佈:2020-10-07
匿名塊
就是一個沒有名字的程式碼塊,臨時執行的sql語句程式碼塊
基本格式:
declare
變數的宣告部分;
begin
執行的邏輯部分;
end;
輸出函式
dbms_output.put_line();
declare n1 number; --聲明瞭一個變數n1,n1是一個數字型別 begin n1:=10; --將10的數字賦值給n1這個變數儲存起來 dbms_output.put_line('數字是'||n1); --以行為單位進行換行輸出 n1:=20; --重新賦值20給n1變數 dbms_output.put_line('數字是'||n1); end;
輸入函式
變數的輸入:
變數:=&提示資訊;
數字的輸入
declare
n1 number;
n2 number;
n3 number;
begin
n1:=&數字1是;
n2:=&數字2是;
n3:=n1+n2;
dbms_output.put_line(n3);
end;
注意點:提示語不能一樣,否則會當成同一個輸入框。
字串的輸入
需要在輸入的提示左右加上單引號
declare ename varchar2(20); begin ename:='&你的名字'; dbms_output.put_line('Hello! '||ename); end;
注意點:特殊符號,列印兩個相當於轉義,列印特殊符號本身。
declare
ename varchar2(20);
begin
ename:='&&haha';
dbms_output.put_line(ename);
end;
儲存查詢的結果
結果只有剛好一個內容,才能執行,多於1個或者沒有資料都會報錯
declare v_ename varchar2(20); v_job varchar2(20); begin select ename,job into v_ename,v_job from emp where sal=5000; dbms_output.put_line(v_ename||','||v_job); end;
引用型變數
變數名 表名.列名%type;
declare
v_ename emp.ename%type;
v_job emp.job%type;
begin
select ename,job into v_ename,v_job from emp where sal=5000;
dbms_output.put_line(v_ename||','||v_job);
end;
記錄型變數
變數名 表名%rowtype;
declare
v_user emp%rowtype;
begin
select * into v_user from emp where ename='SMITH';
dbms_output.put_line(v_user.empno||','||v_user.sal||','||v_user.job);
end;
record複合型別
將一個表中需要反覆用到的列,放在一起,定義成一個新的資料型別
type 複合型別名字 is record(
小變數名字 資料型別,
...
);
變數名 複合型別名字;
declare
type emp_users is record( --自己定義一種新的資料型別,這個資料型別包含了四個不同的欄位
v_empno emp.empno%type,
v_ename emp.ename%type,
v_job emp.job%type,
v_deptno emp.deptno%type
);
v_user emp_users; --將自己定義的資料型別,宣告給一個變數
begin
select empno,ename,job,deptno into v_user from emp where sal=5000;
dbms_output.put_line(v_user.v_empno);
dbms_output.put_line(v_user.v_ename);
dbms_output.put_line(v_user.v_job);
dbms_output.put_line(v_user.v_deptno);
end;
邏輯判斷和分支
if
if 判斷1 then
執行語句;
elsif 判斷2 then
執行語句;
···
else
執行語句;
end if;
declare
n number;
begin
n:=&數字;
if n>0 then
dbms_output.put_line('正數');
elsif n<0 then
dbms_output.put_line('負數');
else
dbms_output.put_line('零');
end if;
end;
if開頭 中間可以有很多的elsif else做最後一個判斷 end if結束
if和elsif都需要加上判斷 else表示剩餘的所有邏輯
declare
money number;
begin
money:=&剩下的錢;
if money<=5 then
dbms_output.put_line('小籠包');
elsif money<=10 then
dbms_output.put_line('炒粉');
elsif money<=15 then
dbms_output.put_line('黃燜雞');
elsif money<=20 then
dbms_output.put_line('隆江豬腳飯');
else
dbms_output.put_line('火鍋');
end if;
end;
case when
declare
begin
case
when xxx then 執行語句;
when xxx then 執行語句;
...
else 執行語句;
end case;
end;
declare
v_sno varchar2(10);
v_score number;
begin
v_sno:='&學號';
select avg(score) into v_score from degree where sno=v_sno;
case
when v_score<60 then dbms_output.put_line('不及格');
else dbms_output.put_line('及格');
end case;
end;
--用case when判斷emp表中某個使用者編號是否存在
declare
v_empno emp.empno%type;
c number;
begin
v_empno:=&員工編號;
select count(1) into c from emp where empno=v_empno;
case
when c=0 then dbms_output.put_line('該使用者不存在');
else
dbms_output.put_line('使用者存在');
end case;
end;
迴圈
for語法
for 新的變數名字 in 範圍 loop
執行語句;
end loop;
--9x9乘法表
declare
begin
for i in 1..9 loop
for j in 1..i loop
dbms_output.put(j||'x'||i||'='||i*j||' ');
end loop;
dbms_output.put_line('');
end loop;
end;
while
while迴圈的語法:當判斷為真的時候進入迴圈,判斷為假跳出迴圈
while 判斷是否在迴圈範圍內 loop
執行語句;
end loop;
declare
n number;
begin
n:=10;
while n>=1 loop
dbms_output.put_line(n);
n:=n-3;
end loop;
end;
loop
loop迴圈的語法:當判斷為假的時候跳出迴圈
loop
exit when 判斷什麼時候退出迴圈;
執行語句;
end loop;
declare
n number;
begin
n:=10;
loop
exit when n<1;
dbms_output.put_line(n);
n:=n-3;
end loop;
end;
迴圈中的三個關鍵字
exit
跳出迴圈,不要迴圈了,一個關鍵字只能控制離它最近的一個迴圈
- return:跳出整個正在執行的程式
continue
跳過本次迴圈,直接開始下一次的迴圈
goto
使用goto語句跳到定義標籤的位置
goto 標籤名
<<標籤名>>
將select查詢的結果當成for迴圈的範圍
declare
begin
for i in (select * from emp where job='MANAGER' and comm is null) loop
update emp set comm=i.sal*0.1 where empno=i.empno;
commit;
dbms_output.put_line(i.ename||','||i.sal*0.1);
end loop;
end;