PL/SQL是啥?

2021-03-02 開發者圓桌

從PL/SQL的字面上來看,它和SQL有一定的關係,那麼就從SQL開始講一下它們倆兄弟之間的關係。

什麼是SQL?


結構化查詢語言(Structured Query Language,簡稱SQL)是用來訪問關係型資料庫一種通用語言,屬於第四代語言(4GL),其執行特點是非過程化,即不用指明執行的具體方法和途徑,而是簡單地調用相應語句來直接取得結果即可。顯然,這種不關注任何實現細節的語言對於開發者來說有著極大的便利。

那什麼又是PL/SQL呢?


對於有些複雜的業務流程要求相應的程序來描述,這種情況下SQL就有些無能為力了。PL/SQL的出現正是為了解決這一問題,PL/SQL是一種過程化語言,屬於第三代語言,它與C、 C++、Java等語言一樣關注於處理細節,可以用來實現比較複雜的業務邏輯。

PL/SQL(Procedural Language/SQL)是資料庫廠商在標準的SQL語言上的擴展。PL/SQL不僅允許嵌入SQL語言,還可以定義變量和常量,允許使用條件語句和循環語句,允許使用例外處理各種錯誤,這使得它的功能變得更加強大。

我們需要知道的


我們需要了解以下幾個關鍵點:

存儲過程,函數,觸發器是PL/SQL編寫的

存儲過程,函數,觸發器是存儲在資料庫中的

PL/SQL是非常強大的資料庫過程語言

存儲過程,函數可以在C、 C++、Java、C#等程序中調用

PL/SQL開發工具有哪些?


首先,資料庫廠商都會自帶命令行開發工具,比如Oracle的SQL*PLUS、MySQL的MySQL Client、DB2的DB2CMD等等。

其次,會有一些集成開發環境(IDE),比較知名的有PL/SQL Developer(這個只適用Oracle資料庫)、DbVisualizer、Navicat、SQLyog、Toad等等,這些IDE都是獨立的第三方產品。其實,各資料庫廠商也有自己的IDE,不過感覺沒有特別好用的,基本上被第三方軟體壟斷,畢竟IDE不是資料庫公司的強項嘛。

我們上面說的命令行工具以及集成開發環境都可以用來編寫SQL或者PL/SQL程序,都屬於PL/SQL的開發工具。


PL/SQL的程序結構


我們來大概瀏覽一下PL/SQL的程序結構,各資料庫廠商的實現,會有所不同,下面以Oracle為例進行說明。

PL/SQL程序都是以塊(block)為基本單位,整個PL/SQL塊分三部分:聲明部分(用declare開頭)、執行部分(以 begin開頭)和異常處理部分(以exception開頭)。其中執行部分是必須的,其他兩個部分可選。無論PL/SQL程序段的代碼量有多大,其基本結構就是由這三部分組成。

程序結構模板


declare

  /* 聲明區(可選):定義類型和變量、聲明變量、聲明函數、遊標 */

  begin

  /* 執行區(必須的):執行pl/sql語句或者sql語句 */

  exception

  /* 異常處理區(可選):處理錯誤的 */

  end;

一個demo

/*聲明部分,以declare開頭*/

declare v_id integer;

v_name varchar(20);

cursor c_emp is select * from employee where emp_id=3;

/*執行部分,以begin開頭*/

begin  open c_emp; //打開遊標

loop

//從遊標取數據

fetch c_emp into v_id,v_name;   

exit when c_emp%notfound ;

end loop ;

//關閉遊標

close c_emp;    

dbms_output.put_line(v_name);

/*異常處理部分,以exception開始*/

exception

when no_data_found then

dbms_output.put_line('沒有數據');

end ;

還是沒感覺?去動手做個小慄子吧

更多關於PL/SQL的用法可以點擊左下角的「閱讀原文」查看,在置頂貼中羅列了Oracle、DB2、MSSQL、MySQL、PGSQL這些常用5種資料庫的存儲過程、函數、觸發器的基本用法,可以作為每種資料庫的PL/SQL程序模版來用,在此基礎上開發複雜的PL/SQL程序。

相關焦點

  • PL/SQL developer工具的使用之談
    Version 9.0.5.1648可以看到sql window快捷關閉無效,建議還是不要用這麼老的版本Version 11.0.3.1770tablespace那不能索引view sql那索引不顯示錶空間,並且多了nologging,但實際索引是logging的
  • 【趙強老師】什麼是PL/SQL?
    PL/SQL(Procedure Language/SQL)是oracle在標準的sql語言上的擴展。ql/sql不僅允許嵌入sql語言,還可以定義變量和常量,允許私用條件語句和循環語句,允許使用例外處理各種錯誤,這使得它的功能變得更加強大。PL/SQL開發工具主要有:SQL*PLUS開發工具。
  • 如何解決PL/SQL中文亂碼問題
    打開PL/SQL執行sql語句,中文顯示亂碼??? 如何解決上述問題,辦法如下: 1)輸入sql語句select userenv('language') from dual 按下F8執行語句,查看資料庫字符集; 2)輸入sql語句select * from V$NLS_PARAMETERS查看本地字符集;
  • 使用Expect和命名管狀遠程控制SQL*Plus
    雖然SQL*Plus是可交互的,但是它僅限於STDOUT和STDIN,所以它可以放入一個管道中:    sqlplus /nolog < commands.sql > output.log     然而,如果我們想一次發出一條SQL*Plus命令,那麼就需要檢查SQL*Plus命令提示符「SQL>」來判斷SQL*Plus是否在等待輸入,然後使用非阻塞管道
  • 巧用SQL:Oracle中實現split相關方法總結
    尚世波從事資料庫方面工作多年,專注於pl/sql開發、資料庫設計、優化方面的研究,喜歡挑戰編輯寄語
  • PL/SQL中如何導出表結構和表數據
    如圖再點擊【Tools】選項,再在列表中選中【Export User Objects】選項,就會跳轉到表結構導出界面,如圖如果想導入資料庫表結構,或表數據,也可以再點擊【Tools】中的【Import Tables】選項,會跳轉到導入數據表界面和導入數據表結構界面,如圖在該界面中,切換到【SQL inserts】選項,在下方文件打開按鈕中,選中已經準備好的sql
  • 詳解SQL與PL/SQL
  • SQL是一門手藝
    實際上也有戲稱是標準查詢語言的,並不為過,SQL誕生於1974年,基於關係資料庫(也就是表格),發展至今毫無衰落跡象,反而滲透到各個數據處理工具/系統中:傳統資料庫、Hive數據倉庫、MongoDB支持類SQL,甚至玩dataframe表格的R語言也可以通過sqldf包寫sql,Spark、Flink也可以寫SQL,等等。玩數據分析,學好SQL無往而不利。
  • Big result at a tough pl...
    懂球帝首頁>足球新聞> Big result at a tough pl... Big result at a tough pl...
  • MySQL sql_mode 說明(及處理一起 sql_mode 引發的問題)
    先 set global sql_mode='' ,讓他們用著先(文後會給解決問題根本的辦法),同時打開general_log看是哪一個用戶有類似設置 sql_mode 命令:12341134456 Query   SET autocommit=11134456 Query   Set sql_mode
  • Mybatis的sql組裝詳解
    上一篇分析了SqlSession執行sql的過程,其中並沒有分析sql是從哪裡來的,今天就來仔細分析下。Sql來源從上一篇的最後一步執行sql那裡倒推sql的來源,源碼主要過程如下圖:可以看到最後是通過BoundSql直接獲取的sql,然後往前倒推最後發現是通過MappedStatement的getBoundSql方法返回的。
  • 手撕SQL | 必知必會5道SQL面試題
    愛數據曉輝 | 作者愛數據學院8月SQL月考題 | 來源附本次sql>表列名含義如下:name:國家名稱continent :該國家屬於哪個洲area:⾯積population:⼈⼝gdp:國內⽣產總值請用sql
  • MyBatis 動態 SQL 詳解(以後寫 SQL 爽多了)
    先來看看第一個動態SQL標籤——if,通過if標籤,我們能夠根據我們傳遞的參數進行動態查詢,比如:根據id查詢員工信息,若是攜帶了哪個參數sql的條件就要帶上這個參數對應的欄位的值。==> Parameters: %c%(String), jack@qq.com(String)因為id為null,所以後面的and被直接拼在了where的後面,此時sql語法就會出錯,為此我們需要使用另一個標籤——where,它能夠完美地解決這一問題。
  • Sql盲注學習筆記1
    payload='id=0 or if((select ascii(substr(({substr_sql} limit {limit_offset},1),{substr_offset},1))={ascii_num}),1,0)'column_content=''column_contents=[]#通過字典的形式關聯起來 列表中第一個元素表示對應的表的列數
  • 適用於初學者和分析師的SQL –使用Python入門SQL
    \ sql_db \ Demo_table.db')cur = conn。遊標()#在資料庫中創建表CUR。\ sql_db \ FOOD.db')cur = conn。遊標()#將數據幀加載到資料庫中df_train。to_sql(「 train」,conn)df_meal。to_sql('meal',conn)df_center。to_sql('centers',conn)現在,資料庫中每個數據框都有三個表。
  • 美團開源 SQL 優化工具 SQLAdvisor,與內部版本保持一致
    上述實現時,涉及的函數為:mysql_sql_parse_join(TABLE_LIST join_table) mysql_sql_parse_join(Item join_condition) ,主要流程圖如下:
  • Dynavax公司B肝疫苗Heplisav-B獲批上市
    近日,Dynavax公司的B肝疫苗Heplisav-B獲得FDA批准上市。該疫苗是美國25年來首個新的B肝疫苗。在此次批准之前,FDA在2013年2月和2016年11月兩次拒絕該藥物。在Dynavax獲批過程中,審批程序出現了一些問題。在今年8月4日,FDA委員會以12:1的投票結果推薦了Heplisav-B。
  • MyBatis dynamic SQL 1.1.4 發布,生成動態 SQL 的框架
    此版本包含兩項增強功能: 支持在計數、刪除、選擇和更新語句之間共享 where 子句 改進 Kotlin DSL - 刪除了一些引起歧義的擴展方法,並添加了自定義構建器以及一項 bug 修復: 修復了以下錯誤:在子查詢中首先使用限制/偏移/獲取會導致參數名稱衝突完整更新內容可查看:https://github.com/mybatis/mybatis-dynamic-sql
  • 如何用 SQL 的方式打開 Pandas?
    # 導入相關庫import numpy as npimport pandas as pdfrom pandasql import sqldf, load_meat, load_births基礎pandasql 中的主要函數是 sqldf,它接收兩個參數:一個SQL 查詢語句;一組會話/環境變量(locals() 或 globals
  • SQL 中的(+)用法
    今天在代碼review的時候,發現sql中很多 (+)的寫法,看得頭暈,記錄下。對於sql邏輯比較複雜的場景不推薦是有 (+),容易自己暈掉。Oracle sql 中 (+)號可以理解為補充的意思,即哪個表有加號,這個表就是匹配表。