Oracle數據庫 PL/SQL 入門

思維導圖

1. PL/SQL簡介

a. PL/SQL是對SQL的一個增強,使SQL具有過程化的處理能力,就是在SQL能使用分支、循環等語句;
b. PL/SQL是操作oracle數據庫最快的語言;
c. PL/SQL是存儲過程、存儲函數和觸發器基礎;

PL/SQL的程序結構:
declare 
     說明部分(變量說明,光標申明,例外說明)
begin
     語句序列(程序體 DML語句)
exception
     例外處理語句
end;
/
說明部分:

定義基本變量:char,varchar2,date,number,boolean,long

    --變量聲明:
    var1 char(15);
    married boolean:=true;
    psal number(7,2);
    --引用變量:
    pename  emp.ename%type;

2. PL/SQL入門案例

小案例: 打印helloworld
--打開服務器的輸出功能
set serveroutput on

declare
  --聲明區:聲明變量、游標、例外
begin
  --程序區:
  --打印helloworld
  --dbms_output:程序包,類似于java中類
  --put_line:存儲過程,類似于java中的方法
  dbms_output.put_line('HelloWorld!');
end;
/
--查看程序包結構
desc dbms_output

3. 引用型變量

小案例: 查詢并打印7839號員工的姓名和工資
--打開服務器的輸出功能
set serveroutput on
declare
  --聲明引用型變量
  pename   emp.ename%type;
  psal     emp.sal%type;
begin
  --查詢7839號員工的姓名和工資
  --可以使用into關鍵字賦值
  select ename, sal into pename,psal from emp where empno=7839;
  --打印
  dbms_output.put_line(pename||'的薪水是'||psal);
end;
/

4. 記錄型變量

記錄型變量,就像是將查詢結果封裝到了一個對象里面一樣,他就是這個對象。通過(.)可以取出對中的值。

小案例: 查詢并打印7839號員工的姓名和工資
set serveroutput on
declare
  --聲明記錄型變量
  pemp  emp%rowtype;
begin
  select * into pemp from emp where empno=7839;
  --打印
  --從記錄型變量中獲取數據:記錄型變量名.列名
  dbms_output.put_line(pemp.ename||'的薪水是'||pemp.sal);
end;
/

5. 判斷語句:if語句

溫馨小提示:
(1)set serveroutput onaccept num prompt '請您輸入數字:'之后均無需帶分號;
(2)accept num prompt '請您輸入數字:'運行完這條語句之后,就會彈出來讓你輸入的提示內容,不要擔心,照常輸入。之后,接著上面的步驟,往下走。輸入的內容已經被綁定到了指定的變量中了。

小案例: 判斷用戶輸入的數字
set serveroutput on
--accept:從標準輸入獲取一個數據,保存num地址變量指定位置
--prompt:自定義提示信息
--num:地址值,含義量;在該地址上保存了輸入的值
accept num prompt '請您輸入數字:'

declare
  pnum  number;
begin
  --獲取用戶輸入,賦值給pnum變量
  pnum:=#
  if pnum=1 then
    dbms_output.put_line('您輸入的數字是:1!');
  elsif pnum=2 then
    dbms_output.put_line('您輸入的數字是:2!');
  else
    dbms_output.put_line('您輸入的數字是:其他!');
  end if;
end;
/

6. 循環語句(也有很多種,但是下面這一種是最常用的)

(1) 循環打印1~10(最常用的方式):
set serveroutput on
declare
  pnum  number:=1;
begin
  loop
    exit when pnum > 10;
    dbms_output.put_line(pnum);
    pnum:=pnum+1;
  end loop;
end;
/
(2) 使用while循環打印數字1-10
declare
 --定義循環變量
 pnum number:=1;
begin
 while pnum<=10 loop
  --循環體
  dbms_output.put_line(pnum);
  --使該變量+1
  pnum:=pnum+1;
 end loop;
end;
/
(3) 使用for循環打印1-10
set serveroutput on
declare
 --定義循環變量
 pnum number:=1;
begin
 --注意:此處的數字必須是連續的
 for pnum in 1..10 loop
  --循環體
  dbms_output.put_line(pnum);
 end loop;
end;
/

7. 游標(也叫光標,就是一個結果集)

(1) 光標的語法
cursor 光標名 [(參數名 數據類型[,參數名 數據類型]...)]
is select 語句;

操作光標:

--打開光標:
open c1;(打開光標執行查詢)

--關閉光標: 
close c1;(關閉游標釋放資源)

--取一行光標的值: 
fetch c1 into pename;(取一行到變量中)

注意事項:

  • 光標數的限制:默認情況下,oracle數據庫只允許在同一個會話中,打開300個光標;
  • 修改默認值:
--切換到管理員
show user
conn sys/password@192.168.56.6:1521/orcl as sysdba
show user
--模糊查找
show parameter cursor
--修改光標數的限制
--scope的取值:both,memory,spfile(數據庫需要重啟)
alter system set open_cursor=400 scope=both;
(2) 無參游標
小案例: 查詢并打印所有員工姓名和薪水
set serveroutput on

declare
  --定義游標
  cursor cemp is select ename, sal from emp;
  pename emp.ename%type;
  psal   emp.sal%type;
begin
  --打開游標
  open cemp;
    --循環獲取游標中數據
    loop
      fetch cemp into pename,psal;
      --游標狀態:%isopen:是否打開;%rowcount:返回行數;%found:獲取到數據;%notfound獲取不到數據
      exit when cemp%notfound;
      --打印
      dbms_output.put_line(pename||'的薪水是'||psal);
    end loop;
  --關閉游標
  close cemp;
end;
/
(3) 帶參游標
小案例1: 查詢并打印10號部門員工的姓名和薪水
set serveroutput on

declare
  --定義帶參數的游標
  cursor cemp(pdeptno emp.deptno%type) is select ename,sal from emp where deptno=pdeptno;
  pename emp.ename%type;
  psal   emp.sal%type;
begin
  --作業:動態打印部門員工的信息
  open cemp(10);
    --循環獲取游標中數據
    loop
      fetch cemp into pename,psal;
      --游標狀態:%isopen:是否打開;%rowcount:返回行數;%found:獲取到數據;%notfound獲取不到數據
      exit when cemp%notfound;
      --打印
      dbms_output.put_line(pename||'的薪水是'||psal);
    end loop;
  close cemp;
end;
/
小案例2: 根據職位漲工資:按員工的工種漲工資,總裁1000元,經理800元,其他人400元
declare
  cursor cemp is select empno,job,sal from emp;
  pempno  emp.empno%type;
  pjob    emp.job%type;
  psal    emp.sal%type;
begin
  open cemp;
    loop
      fetch cemp into pempno,pjob,psal;
      exit when cemp%notfound;
      if pjob='PRESIDENT' then
        update emp set sal=psal+1000 where empno=pempno;
      elsif pjob='MANAGER' then
        update emp set sal=psal+800 where empno=pempno;
      else
        update emp set sal=psal+400 where empno=pempno;
      end if;
    end loop;
  close cemp;
  --提交數據
  commit;
end;
/
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 第八章 數據查詢和選擇 ||| 第十章 獲取GIS數據列表和描述信息 我們將在本章中介紹以下幾個案例: 游標對象(...
    muyan閱讀 21,274評論 5 21
  • 1、Check規則 Check (Agebetween15and30 )把年齡限制在15~30歲之間 2、新SQL...
    姜海濤閱讀 862評論 0 4
  • PL/SQL 這是對Oracle-SQL知識點詳細介紹的文章系列,其他文章如下: Oracle-SQL系列知識點(...
    GuaKin_Huang閱讀 7,241評論 0 14
  • 1.1 基本結構 PL/SQL程序由三個塊組成,即聲明部分、執行部分、異常處理部分。 1.2 命名規則 1.3 記...
    慢清塵閱讀 3,878評論 3 14
  • 光良在黃金唱片時代,占得樂壇一席之地,完全靠才華實力圈粉。他參加《歌手》競技,不比原聲卡帶差,但缺乏現場...
    一品馥蘭閱讀 225評論 0 0