Oracle 學習筆記 15

來源:互聯網
上載者:User

PL/SQL簡介

       PL/SQL也是一種程式語言,叫做過程化SQL語言(Procedural Language/SQL)。PL/SQL是Oracle資料庫對

SQL語句的擴充。在普通SQL語句的使用上增加了程式設計語言的特點,所以PL/SQL就是把資料操作和查詢語句組織在

PL/SQL代碼的過程性單元中,通過邏輯判斷、迴圈等操作實現複雜的功能或者計算的程式語言 -- 百度百科。

       PL/SQL是Oracle系統的核心語言,現在Oracle的許多組件都是由PL/SQL寫成。可以使用的SQL語句有:

   INSERT ,UPDATE ,DELETE ,SELECT ...INTO ... ,COMMIT , ROLLBACK ,SAVEPOINT 。

塊結構

      構成PL/SQL 程式的基本單元是語句塊,所有的PL/SQL程式都是由語句塊構成的。由三部分組成,即聲明部分,

執行部分,異常處理部分。

具體結構如下:

DECLARE

-- 聲明部分,聲明函數用到的,常量,變數,類型,遊標,異常處理的名稱等。

BEGIN           

-- 執行部分,程式的執行程式

EXCEPTION 

--異常部分,對出現的異常進行處理 

END ;

PL/SQL塊可以分為三類:

1. 無名塊:動態構造,只能執行一次。

2.子程式:在資料庫中建立好之後,可以再其他的程式中調用他們。

3.觸發器:當資料庫發生操作時,會觸發一些時間,自動的執行某些程式。

標示符

1.字元長度不能超過30.

2.必須用字母開頭。

3.由字母A-Z ,a-z ,0-9 ,底線(_) , 貨幣符號($),井號(#)組成。

4.不能使用sql保留字和關鍵字。

注釋

單行注釋:放置在一行上的注釋文本,使用符號“--” 開頭,一直到該行的末尾都被注釋掉。

多行注釋:以符號“/*” 開始 ,以符號“*/” 結束,在這兩個符號中間的語句,都被注釋掉。

例:程式設計語言的學習,都是從helloworld開始,下面開始書寫第一個pl/sql程式

SQL> set serveroutput on ;

BEGIN           
dbms_output.put_line('hello world ');
END ;

hello world 
PL/SQL procedure successfully completed

觀察發現省略了 declare 和exception這兩個部分,這是可以的,當沒有變數聲明的時候可省略declare

部分,沒有異常捕獲也可以省略exception部分。dbms_output.put_line()的作用和JAVA中的

system.out.println()類似,需要說明的是在執行pl/sql語句之前壓先運行set serveroutput on ;

語句,負責是看不到執行結果的。

例:使用select...into ...查詢emp表中員工號為7934的工資,姓名

declare
  v_sal number(20);
  v_ename varchar2(20);
BEGIN           
  select sal , ename into v_sal , v_ename from emp where empno = 7934 ; 
  dbms_output.put_line(v_ename || ',' || v_sal);
END ;

 MILLER,1300

上面定義了兩個變數,v_sal 和 v_ename,分別定義了變數的類型。定義變數類型還有一種方式,就是使

用“%type”,即:v_sal  emp.sal%type ; v_ename emp.ename%type ; 語句的意思是,與表emp中列sal的資料類

型相同。藉助已經定義的某個資料變數或者是資料庫表中列的資料類型,來定義變數的類型。

變數類型

char:定長字串。

varchar2:可變字串。

number:可以儲存浮點值或整數值。

date : 日期型。

boolean:布爾型。

記錄類型

記錄類型是把邏輯相關的資料作為一個單中繼存放區起來。作用是儲存互補相同但邏輯相關的資訊。有點類似JAVA

中類的概念。

declare
  type emp_record is record(
  v_sal emp.sal%type ,
  v_ename emp.ename%type 
  );
  e_r emp_record ; --聲明一個記錄類型的變數
BEGIN           
  select sal , ename into e_r from emp where empno = 7934 ;
  dbms_output.put_line(e_r.v_sal || ',' || e_r.v_ename);
END ;

記錄類型中變數的使用使用"."調用。如:上面中要使用v_sal變數,e_r.v_sal 。

例:定義一個與emp表中所有的列都相同的記錄類型

declare
  emp_record emp%rowtype;
BEGIN           
  select * into emp_record from emp where empno = 7934 ;
  dbms_output.put_line('工資'||emp_record.sal || ',' ||'姓名'|| emp_record.ename);
END ;

工資1300,姓名MILLER
PL/SQL procedure successfully completed

記錄類型中的變數要和表中所有的列相對應,雖然一行行的定義也是可以的,但是還是比較麻煩的,可以使

用%rowtype 實現上面的要求,但是如果調用相應列的值得時候,則需要使用表表中真實的列名。

運算子

特別說明一下  := 的作用是賦值。 v_sal int := 2000 ; 定義v_sal變數並賦值。

流程式控制制

條件陳述式

① if 布林運算式 then 

     pl/sql 和sql語句;

   end if ;

② if 布林運算式 then 

    pl/sql 和sql語句;

  else

    其它語句;

  end if ;

③ if 布林運算式 then 

     pl/sql 和sql語句;

  elsif布林運算式 then 

     其它語句;

   elsif 布林運算式  then 

     其它語句;

   else

     其它語句;

   end if ;

case運算式

case 運算式 

when 值1 then 語句1;
when 值2 then 語句2 ;
...
else

   statment_else ;

   end case ;

迴圈結構

迴圈結構有3種形式,分別為LOOP循壞,WHILE迴圈和FOR循壞。

LOOP循壞

LOOP

執行語句;

EXIT WHEN 條件陳述式 ;

END LOOP ;

使用LOOP循壞至少要執行一次迴圈語句。

例:使用LOOP循壞,求出1-10 的值。

declare
  v_i int := 1 ;
  v_sum int := 0 ;
BEGIN           
  Loop 
        v_sum := v_sum + v_i ;
        exit when v_i = 10 ;
        v_i := v_i + 1 ; 
  end loop ;
  dbms_output.put_line(v_sum);
END ;

WHILE 循壞

先判斷循壞的條件,只有滿足迴圈條件的才能進入循壞體進行循壞操作。

while  布林運算式  loop 

執行的語句(循壞體);

end loop ;

使用while迴圈時,要執行的語句可能一次也不執行,這是與Loop迴圈的區別。

例:使用while循壞,求1-10相加的和。

declare
  v_i int := 1 ;
  v_sum int := 0 ;
BEGIN           
  while v_i <= 10 loop
        v_sum := v_sum + v_i ;
        v_i := v_i + 1 ;
  end loop ;
  dbms_output.put_line(v_sum);
END ;

FOR迴圈

for 迴圈變數 in[reverse] 下限...上限 loop

要執行的語句(循壞體);

end loop;

每迴圈一次,迴圈變數自動加1 ,使用reverse關鍵字,迴圈變數自動減1 ,

例:使用for-in-loop迴圈,求1-10的階乘。

declare
  v_i int := 1 ;
  v_sum int := 1 ;
BEGIN           
  for v_i in 1..10 loop
      v_sum := v_sum*v_i ;
  end loop ;
  dbms_output.put_line(v_sum);
END ;

執行過程為,首先v_i判斷是否在1..10的範圍內,如果在執行迴圈體,end loop ,之後v_i自增1,在進行範圍判

斷,執行迴圈體,知道v_i不在範圍內,迴圈終止。

GOTO語句

goto語句表示無條件跳轉到指定的標號。goto lebel_name  ;<<label>> .../*標號要使用<<>> 括起來*/

declare
  v_i int := 1 ;
  v_sum int := 1 ;
BEGIN           
  for v_i in 1..10 loop
      v_sum := v_sum*v_i ;
      if v_i = 8 then
         goto at1 ;
      end if ;
  end loop ;
  <<at1>>
  dbms_output.put_line('at');
  dbms_output.put_line(v_sum);
END ;

當v_i=8時,會跳轉到<<at1>>的位置,並結束迴圈。

NULL語句

null語句被稱為空白語句,它表示不執行任何操作。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.