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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...