【oracle學習】6.plsql程序語法

前言
咱們如下的全部操做均在PL/Sql Developer工具上完成:

咱們如下的表操做可能會基於如下兩張表:
咱們建立一個員工表和部門表:

員工信息表
create table EMP(
    EMPNO NUMBER,
    ENAME VARCHAR2(10),
    JOB VARCHAR2(9),
    MGR NUMBER,
    HIREDATE DATE,
    SAL BINARY_DOUBLE,
    COMM BINARY_DOUBLE,
    DEPTNO NUMBER
);
其中job是職位,mgr是該員工的上司的id,sal是工資,comm是提成,deptno是所屬部門。

SQL> select * from emp;
          EMPNO ENAME                JOB                            MGR HIREDATE         SAL  COMM          DEPTNO
--------------- -------------------- ------------------ --------------- -------------- ----- ----- ---------------
           1110 張三                 主管                          1110 12-3月 -14      5200     0          20
           1111 李四                 銷售                          1116 03-11月-15      3400   500          30
           1112 王五                 銷售                          1116 25-4月 -12      4400   800          30
           1113 趙二                 後勤                          1110 30-5月 -11      3450     0          40
           1114 李磊磊               會計                          1110 22-12月-15      2500     0          50
           1115 張少麗               銷售                          1110 11-3月 -16      2400  1400          30
           1116 林建國               主管                          1116 22-1月 -16      5700     0          20
           1117 馬富邦               後勤                          1116 22-7月 -13      2800     0          40
           1118 沈倩                 會計                          1116 06-5月 -10      2100     0          50

部門表
create table dept(
    DEPTNO NUMBER,
    DNAME VARCHAR2(50)
);
SQL> select * from dept t;

DEPTNO    DNAME
--------  --------
20        管理部門
30        銷售部門
40        後勤部門
50        金融部門

什麼是PLSQL?
咱們用Java語言能夠編寫Java程序,裏面有許多有用的API供咱們調用來實現一些功能。
而咱們的PLSQL(Procedure Language/SQL)就是用來操做數據庫的一種程序語言,它能夠定義變量、輸入輸出和打印等等,
含有像Java同樣的API供咱們調用。
PLSQL是Oracle對sql語言的過程化拓展。
旨在SQL命令語言中增長了過程處理語句(如分支、循環等),使SQL語言具備過程處理能力。

PLSQL語法:
首先「declare」聲明下面是PLSQL語句。
declare
   --說明部分(變量說明,光標申明,例外說明)
begin
   --程序體(DML語句)
   --調用程序包(相似Java的API)
exception
   --例外處理語句
end;
/     --退出並執行程序


咱們使用控制檯輸出HelloWorld
declare
begin
   dbms_output.put_line('HelloWorld');
end;

打開oracle的輸出開關
set serveroutput on
而後咱們就輸出HelloWorld了:


除了剛剛的dbms_output.put_line()打印語句,使用了dbms_output程序包。
咱們使用desc+程序包名,能夠查看程序包給咱們提供了哪些方法:


至關於Java的API文檔。

oracle還給咱們提供了許多相似的程序包供咱們使用。
咱們來逐步介紹plsql的語法和語句:

(1)變量和常量說明(char,varchar2,date,number,boolean,long)
定義變量例子:
varl char(15); --說明變量名,數據類型和長度後用分號結束說明語句。
married boolean:=true;
psal number(7,2);
my_name emp.ename%type; --引用型變量,即my_name的類型與emp表中ename列的類型同樣。
emp_rec emp%rowtype; --記錄型變量(rowtype表明表裏面的一整行的類型)。

咱們來編寫一個定義變量的例子:
咱們查詢並打印emp表中EMPNO爲1110的員工姓名和薪水
declare
  --定義變量
  pename emp.ename%type;
  psal emp.sal%type;
begin
  --查詢
  select ename,sal into pename,psal from emp where empno=1110;
  --打印
  dbms_output.put_line(pename||'的薪水是'||psal);
end;
/

結果:


而後舉一個記錄型變量的例子,一樣完成上面的要求:
declare
  --定義變量
  emp_rec emp%rowtype;
begin
  --獲得empno爲1110的員工的全部信息
  select * into emp_rec from emp where empno=1110;
  dbms_output.put_line(emp_rec.ename||'的薪水是'||emp_rec.sal);
end;
/

結果:


(2)IF語句
語法:
一、IF 條件 THEN 語句1;
   語句2;
   END IF;

二、IF 條件 THEN 語句序列1;
   ELSE 語句序列2;
   END IF;

三、IF 條件 THEN 語句;
   ELSIF 語句 THEN 語句;
   ELSE 語句;
   END IF;

例子:判斷用戶輸入的數字
--prompt提示語句
--&num接收鍵盤輸入,其中num是一個地址值
prompt '請輸入一個數字';
pro
declare
   --變量保存輸入的數字
   pnum number:=#
begin
  --判斷
  if pnum>0 then
    dbms_output.put_line('您輸入的是正數!');
  elsif pnum<0 then
    dbms_output.put_line('您輸入的是負數!');
  elsif pnum=0 then
    dbms_output.put_line('您輸入的是0!');
  end if;
end;
/

運行



(3)循環語句
一、WHILE total<=25000
   LOOP
   ......
   total:=total+salary;
   END LOOP;

二、LOOP
   EXIT[when 條件];
   ......
   END LOOP;

三、FOR I IN 1..3
   LOOP
   語句序列;
   END LOOP;

例子:打印1-10
declare
  pnum number:=1;
begin
  loop
  --退出:成立退出,不成立循環
  exit when pnum>10;
  --隱式轉換(數字轉字符)
  dbms_output.put_line(pnum);
  pnum:=pnum+1;
  end loop;
end;
/

結果:


打印emp表中全部員工的姓名:
declare
  emp_rec emp%rowtype;
begin
  for emp_rec in (select ename from emp)
  loop
  dbms_output.put_line(emp_rec.ename);
  end loop;
end;
/

結果

轉載請註明出處:http://blog.csdn.net/acmman/article/details/52402641
sql