1. 程式人生 > 實用技巧 >Oracle-PLSQL程式設計基礎

Oracle-PLSQL程式設計基礎

匿名塊

就是一個沒有名字的程式碼塊,臨時執行的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;