PL SQL基本內容(原創)

来源:https://www.cnblogs.com/loveleaf/archive/2018/08/15/9476076.html
-Advertisement-
Play Games

本節介紹PL SQL的基本內容 本節所舉示例數據來源oracle用戶scott下的emp表和dept表,數據如下: 一、plsql簡介: 1、概念:procedural language,過程化sql語言,是面向過程的語言,在普通sql的基礎上增加了編程語言的特點。PL/SQL的基本單元是塊。 2、 ...


本節介紹PL SQL的基本內容

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

一、plsql簡介:

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

2、塊的介紹:

(1)基本結構:

DECLARE

(聲明部分)

BEGIN

(執行部分)

EXCEPTION

(異常處理部分)

END(結束標記)

紅色部分為必須部分,不可缺少

3、塊的分類:

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

(2)子程式:存儲在資料庫中的存儲過程、函數、包等,完成一定功能,可以在其他程式上調用他們。

(3)當資料庫發生操作時,會觸發事件自動執行相應的程式。

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

二、標識符:

1、概念:不能超過30個字元,第一個字元必須為字母,不能用減號“-”,並且不區分大小寫。

2、變數的命名:為提高代碼可讀性,建議遵從以下規則:

(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錯誤信息。

三、記錄型變數和引用型變數:

1、引用型變數:

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

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

2、記錄型變數:

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

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;

四、流程式控制制語句:

1、概念:分為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語句,顧名思義,不做任何事情,其意義所在,是某些語句變得有意義,提高語句的可讀性和完整性。

五、嵌套迴圈

1、概念:指在一個迴圈中嵌套另一個迴圈的語句,用於標記嵌套迴圈的叫標號,使用<<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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • decode函數在Oracle SQL查詢語句中的使用非常廣泛,也經常應用到PL/SQL語句塊中。 1,decode()函數語句的基本表達式是: decode(expr1,expr2,expr3,[expr4]) 這個表達式個人理解,可以稱之為decode的比較運算,可以對比 nvl()函數和 co ...
  • 在MySQL當中,有可能遇到表名大小寫敏感的問題。其實這個跟平臺(操作系統)有關,也跟系統變數lower_case_table_names有關係。下麵總結一下,有興趣可以查看官方文檔“Identifier Case Sensitivity” In MySQL, databases correspon... ...
  • mysql的主從配置沿用上一篇博客的配置:https://www.cnblogs.com/MasterSword/p/9434169.html mycat下載地址:http://www.mycat.io/ 試驗版本:Mycat-server-1.6-release <!-- mycat的預設用戶配置 ...
  • 通過GO 命令 來達到語句迴圈效果 也叫批迴圈 也可用來新增 語句 ...
  • 幾天前收到某個業務項目,MySQL資料庫邏輯備份mysqldump備份失敗的郵件,本是在休假,但本著工作認真負責,7*24小時不間斷運維的高尚職業情操,開始了DBA的排錯之路(一開始資料庫的備份都是成功的,巧的是我休假就出問題,懷疑是數據量又有增長) 首先我們瞭解下mysqldump備份,數據流向的 ...
  • 1. 使用Symbolic Links分佈I/O mysql的資料庫名和表名是與文件系統的目錄名和文件名對應的,預設情況下,創建的資料庫和表都存放在參數datadir定義的目錄下。如果不使用RAID或邏輯捲,所有的表都放在一個磁碟設置上,無法發揮多磁碟並行讀寫的優勢。這種情況,我們可以利用操作系統的 ...
  • 摘要: 下文通過舉例的方式講述sqlserver中位運算的相關知識,如下所示: 實驗環境:sqlserver 2008 R2 在sqlserver的許可權設置,我們通常使用1、2、4、8、16、32、64、128等數值分別表示相關信息的某一狀態供業務狀態使用,通過欄位值之間的組合形成一個狀態值存儲到數 ...
  • /*轉自:https://www.cnblogs.com/shockerli/p/1000-plus-line-mysql-notes.html*/ /* 啟動MySQL */ net start mysql /* 連接與斷開伺服器 */ mysql -h 地址 -P 埠 -u 用戶名 -p 密碼... ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...