Oracle QL/SQL 的基本語法

一、什麼是PL/SQL ?

PL/SQL(Procedure Language/SQL)
PL/SQL 是 Oracle 對 sql 語言的過程化擴展,指在 SQL 命令語言中增加了過程處理語句(如分支、循
環等),使 SQL 語言具有過程處理能力。把 SQL 語言的數據操縱能力與過程語言的數據處理能力結合
起來,使得 PLSQL 面向過程但比過程語言簡單、高效、靈活和實用。

範例 1: 爲職工漲工資,每人漲 10%的工資。update emp set sal=sal*1.1
範例 2:按職工的職稱長工資,總裁漲 1000 元,經理漲 800 元,其他人員漲 400 元。
這樣的需求我們就無法使用一條 SQL 來實現,需要藉助其他程序來幫助完成,也可以使用 pl/sql。

pl/sql 編程語言是對 sql 語言的擴展,使得 sql 語言具有過程化編程的特性。
pl/sql 編程語言比一般的過程化編程語言,更加靈活高效。
pl/sql 編程語言主要用來編寫存儲過程和存儲函數等。

二、pl/sql 程序語法

程序語法:

declare
	說明部分 (變量說明, 遊標申明,例外說明 〕
begin
	語句序列 (DML 語句〕 …
exception
	例外處理語句
End;

1. 常量和變量定義

在程序的聲明階段可以來定義常量和變量。

  • 變量的基本類型就是 oracle 中的建表時字段的變量如 char, varchar2, date, number,
    boolean, long
    在這裏插入圖片描述
  • 引用變量
    在這裏插入圖片描述
  • 記錄型變量
    在這裏插入圖片描述
---賦值操作可以使用:=也可以使用into查詢語句賦值
declare
    i number(2) := 10;
    s varchar2(10) := '小明';
    ena emp.ename%type;---引用型變量
    emprow emp%rowtype;---記錄型變量
begin
    dbms_output.put_line(i);
    dbms_output.put_line(s);
    select ename into ena from emp where empno = 7788;
    dbms_output.put_line(ena);
    select * into emprow from emp where empno = 7788;
    dbms_output.put_line(emprow.ename || '的工作爲:' || emprow.job);
end;

2. if 分支

語法 1:
	IF 條件 THEN 語句 1;
		語句 2;
		END IF;

語法 2:
	IF 條件 THEN 語句序列 1;
		ELSE 語句序列 2;
		END IF;
		
語法 3:
	IF 條件 THEN 語句;
	ELSIF 語句 THEN 語句;
		ELSE 語句
		END IF;
  • 範例 1:如果從控制檯輸入 1 則輸出我是 1
    在這裏插入圖片描述
  • 範例 2: 如果從控制檯輸入 1 則輸出我是 1 否則輸出我不是 1
    在這裏插入圖片描述
  • 範例 3:判斷人的不同年齡段 18 歲以下是未成年人, 18 歲以上 40 以下是成年人, 40 以上是老年人
    在這裏插入圖片描述
---輸入小於18的數字,輸出未成年
---輸入大於18小於40的數字,輸出中年人
---輸入大於40的數字,輸出老年人
declare
  i number(3) := ⅈ
begin
  if i<18 then
    dbms_output.put_line('未成年');
  elsif i<40 then
    dbms_output.put_line('中年人');
  else
    dbms_output.put_line('老年人');
  end if;
end;

3. LOOP 循環語句

語法 1:
	WHILE total <= 25000 LOOP
	.. .
	total : = total + salary;
	END LOOP;

語法 2:
	Loop
	EXIT [when 條件];
	……
	End loop
	
語法 3:
	FOR I IN 1 . . 3 LOOP
	語句序列 ;
	END LOOP ;
  • 範例:使用語法 1 輸出 1 到 10 的數字
    在這裏插入圖片描述
  • 範例:使用語法 2 輸出 1 到 10 的數字
    在這裏插入圖片描述
  • 範例:使用語法 3 輸出 1 到 10 的數字
    在這裏插入圖片描述
---用三種方式輸出110是個數字
---while循環
declare
  i number(2) := 1;
begin
  while i<11 loop
     dbms_output.put_line(i);
     i := i+1;
  end loop;  
end;
---exit循環
declare
  i number(2) := 1;
begin
  loop
    exit when i>10;
    dbms_output.put_line(i);
    i := i+1;
  end loop;
end;
---for循環
declare

begin
  for i in 1..10 loop
     dbms_output.put_line(i);  
  end loop;
end;

4. 遊標 Cursor

在寫 java 程序中有集合的概念,那麼在 pl/sql 中也會用到多條記錄,這時候我們就要用到遊標,
遊標可以存儲查詢返回的多條數據

在這裏插入圖片描述

  • 範例 1:使用遊標方式輸出 emp 表中的員工編號和姓名
    在這裏插入圖片描述
  • 範例 2:按員工的工種漲工資,總裁 1000 元,經理漲 800 元其,他人員漲 400 元。
--備份出一張新表爲 myemp;create table myemp as select * from emp;
declare
	cursor pc is select * from myemp;
	addsal myemp.sal%type;
	pemp myemp%rowtype;
begin
	open pc;
	loop 
		fetch pc into pemp;
		exit when pc%notfound;
		if pemp.job = 'PRESIDENT' then addsal := 1000;
		elsif pemp.job = 'MANAGER' then addsal := 800;
		else addsal := 400;
		end if;
		update myemp t set t.sal = t.sal + addsal where t.empno = pemp.empno;
	end loop;
	close pc;
end;
  • 範例 3:寫一段 PL/SQL 程序,爲部門號爲 10 的員工漲工資
    在這裏插入圖片描述
---遊標:可以存放多個對象,多行記錄。
---輸出emp表中所有員工的姓名
declare
  cursor c1 is select * from emp;
  emprow emp%rowtype;
begin
  open c1;
     loop
         fetch c1 into emprow;
         exit when c1%notfound;
         dbms_output.put_line(emprow.ename);
     end loop;
  close c1;
end;

-----給指定部門員工漲工資
declare
  cursor c2(eno emp.deptno%type) 
  is select empno from emp where deptno = eno;
  en emp.empno%type;
begin
  open c2(10);
     loop
        fetch c2 into en;
        exit when c2%notfound;
        update emp set sal=sal+100 where empno=en;
        commit;
     end loop;  
  close c2;
end;
----查詢10號部門員工信息
select * from emp where deptno = 10;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章