PL SQL基本內容(原創)

本節介紹PL SQL的基本內容

本節所舉示例數據來源oracle用戶scott下的emp表和dept表,數據以下:

1、plsql簡介:

一、概念:procedural language,過程化sql語言,是面向過程的語言,在普通sql的基礎上增長了編程語言的特色。PL/SQL的基本單元是塊。

二、塊的介紹:

(1)基本結構:

DECLARE

(聲明部分)

BEGIN

(執行部分)

EXCEPTION

(異常處理部分)

END(結束標記)

紅色部分爲必須部分,不可缺乏

三、塊的分類:

(1)匿名塊:只會執行一次,被動態構造。

(2)子程序:存儲在數據庫中的存儲過程、函數、包等,完成必定功能,能夠在其餘程序上調用他們。

(3)當數據庫發生操做時,會觸發事件自動執行相應的程序。

(注:存儲過程、觸發器會在後面的博客中詳細說明)

2、標識符:

一、概念:不能超過30個字符,第一個字符必須爲字母,不能用減號「-」,而且不區分大小寫。

二、變量的命名:爲提升代碼可讀性,建議聽從如下規則:

(1)程序變量:v_variablename

(2)程序常量:v_constantname

(3)遊標變量:cursorname_cursor

(4)異常標識:e_exceptionname

(5)記錄類型:recordname_record

Example:查詢僱員編號爲7788的員工的工資僱員日期以及工資漲500後的結果。

DECLARE
  v_name VARCHAR2(20);
  v_sal NUMBER(7,2);
  v_hiredate DATE;
  c_addsal NUMBER(7,2):=500;
  v_newsal NUMBER(7,2);
BEGIN
  SELECT ename,sal,hiredate
  INTO v_name,v_sal,v_hiredate FROM emp WHERE empno=7788;
  v_newsal := v_sal + c_addsal;
  DBMS_OUTPUT.PUT_LINE(v_name||'的工資爲'||v_sal||'僱員日期爲'||v_hiredate||'工資漲後爲'||v_newsal);
EXCEPTION
  WHEN  NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('沒有員工數據');
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;

上面是一個簡單的匿名塊,只用來執行一次,DBMS_OUTPUT.PUTLINE()用來作打印輸出,NO_DATA_FOUND是沒有查找到數據,SQLERRM錯誤信息。

3、記錄型變量和引用型變量:

一、引用型變量:

指數據類型和已經定義或數據庫中某一列的數據類型相同:

Example:v_name emp.ename%TYPE;這裏定義的變量v_name和emp表中的ename數據類型相同。

二、記錄型變量:

返回一個記錄類型,和數據庫表的數據類型一致。

Example:emp_record emp%rowtype;emp_record和數據庫表emp的數據類型相同,因此能夠emp_record.ename

下面各舉一個實例:

Example1:打印輸出7788的員工工資

DECLARE
  v_name emp.ename%TYPE;
  v_sal emp.sal%TYPE;
BEGIN
  SELECT ename,sal
  INTO v_name,v_sal FROM emp WHERE empno=7788;
  DBMS_OUTPUT.PUT_LINE(v_name||'的工資是'||v_sal);
END;

Example2:打印輸出7788的員工工資,使用記錄型變量

DECLARE
  emp_record emp%ROWTYPE;
BEGIN
  SELECT * INTO emp_record FROM emp WHERE empno=7788;
  DBMS_OUTPUT.PUT_LINE(emp_record.ename||'的工資是'||emp_record.sal);
END;

4、流程控制語句:

一、概念:分爲3類

(1)條件控制語句:IF語句,CASE語句

(2)循環語句:LOOP語句

(3)順序語句:GOTO語句、NULL語句

Example1:根據輸入的值判斷等級並輸出

DECLARE
  v_level CHAR(1):='&LEVEL';
BEGIN
  IF v_level='A' THEN
    DBMS_OUTPUT.PUT_LINE('優秀');
  ELSIF v_level='B' THEN
    DBMS_OUTPUT.PUT_LINE('良好');
  ELSIF v_level='C' THEN
    DBMS_OUTPUT.PUT_LINE('通常');
  ELSE
    DBMS_OUTPUT.PUT_LINE('輸入有誤');
  END IF;
END;

這裏用到了&這個符號,用來給變量進行賦值,會彈出第二個圖所示的窗口讓user賦值,最後給出結果,

其中用到的ELSIF 和ELSE可根據狀況不要,注意這裏ELSIF 不是ELSEIF.

Example2:根據輸入的值判斷等級並輸出

DECLARE
  v_level CHAR(1):='&LEVEL';
BEGIN
  CASE v_level
    WHEN 'A' THEN
      DBMS_OUTPUT.PUT_LINE('優秀');
    WHEN 'B' THEN
      DBMS_OUTPUT.PUT_LINE('良好');
    WHEN 'C' THEN
      DBMS_OUTPUT.PUT_LINE('通常');
    ELSE
      DBMS_OUTPUT.PUT_LINE('輸入有誤');
  END CASE;
END;

這裏用了CASE語句,他能夠和IF語句相互轉換,喜歡用哪一個看我的愛好。

Example3:打印輸出1,2,3,4,5

DECLARE
  v_num INT:=1;
BEGIN
  LOOP
    DBMS_OUTPUT.PUT_LINE(v_num);
    EXIT WHEN v_num=5;
    v_num :=v_num+1;
  END LOOP;
END;

這裏用了loop的基本循環。注意必定要有退出循環的條件,否則就會無限循環變爲死循環。這裏用到了EXIT WHEN語句,是有條件的退出循環,

還有一個EXIT用來直接退出循環不加條件,另外在oracle 11g中有一個新特性,CONTINUE和CONTINUE WHEN ,其中CONTINUE用於跳過當

前循環,CONTINUE WEHN 用於有條件的跳過當前循環,實例以下:

Example3.2:打印輸出1,2,3,5

DECLARE
  v_num INT:=0;
BEGIN
  WHILE v_num<5 LOOP
    v_num :=v_num+1;
    CONTINUE WHEN v_num=4;
    DBMS_OUTPUT.PUT_LINE(v_num);
  END LOOP;
END;

這裏能夠看到當數值爲4是跳出了這輪循環並無輸出4.

Example4:打印輸出1,2,3,4,5

DECLARE
  v_num INT:=1;
BEGIN
  WHILE v_num<=5 LOOP
    DBMS_OUTPUT.PUT_LINE(v_num);
    v_num :=v_num+1;
  END LOOP;
END;

這裏用了while循環,和上個例子相比,只是將退出循環的條件從EXIT WHEN 改成了WHILE,沒有特別大的不一樣,用法看我的喜愛。

Example5:倒序打印5,4,3,2,1

BEGIN
    FOR i IN REVERSE 1..5 LOOP
        DBMS_OUTPUT.PUT_LINE(i);
    END LOOP;
END;

這裏用了For循環用來控制循環次數,也是起到一個退出循環的條件,可是更加精確次數,其中的REVERSE起的是倒序的做用,也能夠去掉變爲正序。

Example6:根據輸入的值判斷等級並輸出,若是輸入D則什麼都不作

DECLARE
  v_level CHAR(1):='&LEVEL'; BEGIN CASE v_level WHEN 'D' THEN GOTO the_next; WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('優秀'); WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('良好'); WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('通常'); END CASE; <<the_next>> null; END;

 這裏用到了GOTO,無條件跳轉到同一個程序的標籤,但不建議在任何編程語言中使用它,它會使程序難以跟蹤流程,難以維護。

同時用到了null語句,顧名思義,不作任何事情,其意義所在,是某些語句變得有意義,提升語句的可讀性和完整性。

5、嵌套循環

一、概念:指在一個循環中嵌套另外一個循環的語句,用於標記嵌套循環的叫標號,使用<<label_name>>表示。

 Example:打印輸出1x1到5x5的乘法口訣吧

BEGIN
  <<outter>>
  FOR i IN 1..5 LOOP
    <<inner>>
    FOR j IN 1..5 LOOP
      CONTINUE WHEN j>i;
      DBMS_OUTPUT.PUT_LINE(i||'*'||j||'='||i*j);
    END LOOP inner;
  END LOOP outter;
END;

用了2層嵌套循環,CONTINUE WHEN 作跳出當前循環的條件,<<inner>><<outter>>分別用於結束內層循環和外層循環。

 

至此,plsql的基本內容完畢,其中還有些存儲過程和觸發器會在後面分節作精細說明。

                                                2018-08-15    15:26:17

相關文章
相關標籤/搜索