1. 程式人生 > >SQL記錄-PLSQL基本語法與數據類型

SQL記錄-PLSQL基本語法與數據類型

屬性 lean eric 數據庫 組成 -- 小數 cte welcome

PL/SQL基本語法

PL/SQL是一種塊結構的語言,這意味著PL/SQL程序被劃分和編寫代碼的邏輯塊。每塊由三個子部分組成:

S.N.段和說明
1 聲明
此部分開頭使用關鍵字DECLARE。它是一個可選的部分,並限定在該程序中使用的所有變量,遊標,子程序,和其他元素。
2 可執行命令
此部分是封閉關鍵字BEGIN和END,這是一個強制性的部分。它由程序的可執行文件的PL/SQL語句。它應具有至少一個可執行的代碼行,這可能僅僅是一個空命令,以指示什麽都不執行。
3 異常處理
此部分開頭使用關鍵字EXCEPTION。此部分又是可選的,含有異常,在程序處理錯誤中。

每一個PL/SQL語句都以分號(;)結束。可嵌套在使用BEGIN和END等PL/SQL塊PL/SQL塊。這裏是一個PL/SQL塊的基本結構:

DECLARE
   <declarations section>
BEGIN
   <executable command(s)>
EXCEPTION
   <exception handling>
END;

‘Hello World‘ 示例:

DECLARE
   message  varchar2(20):= ‘Hello, World!‘;
BEGIN
   dbms_output.put_line(message);
END;
/

end; 行信號是PL/SQL塊的末端。要運行SQL命令行代碼,則可能需要代碼的最後一行前,輸入在第一個空行的開頭。當上述代碼在SQL提示符執行時,它產生了以下結果:

Hello World

PL/SQL procedure successfully completed.

PL/SQL標識符

PL/SQL標識符是常量,變量,異常,過程,遊標和保留字。標識符是由一個字母後面可以跟更多的字母,數字,美元符號,下劃線和數字符號,並且不得超過30個字符。

默認情況下,標識符不區分大小寫。所以,可以使用 integer 或 INTEGER 表示數值。不能使用保留關鍵字作為標識符。

PL/SQL分隔符

分隔符是一個具有特殊意義的符號。以下是在PL/SQL分隔符的列表:

分隔符描述
+, -, *, / 加法,減法/否定,乘法,除法
% 屬性索引
字符串分隔符
. 組件選擇
(,) 表達式或列表分隔符
: 主機變量指示符
, 項目分離符
" 帶引號的標識符分隔符
= 關系運算符
@ 遠程訪問指示符
; 聲明終止符
:= 賦值運算符
=> 操作符關聯
|| 連接運算符
** 乘方運算符
<<, >> 標簽分隔符(開始和結束)
/*, */ 多行註釋分隔符(開始和結束)
-- 單行註釋指示符
.. 範圍操作
<, >, <=, >= 關系運算符
<>, ‘=, ~=, ^= 不同版本的不相等的

PL/SQL註釋

程序註釋是解釋性說明,可以包括自己編寫的,並幫助任何人閱讀源代碼的PL/SQL代碼。所有的編程語言允許某種形式的註釋。

在PL/SQL支持單行和多行註釋。任何註釋裏面所有字符都會被PL/SQL編譯器忽略。在PL/SQL單行註釋使用分隔符 - (雙連字符)和多行註釋被 /* 和 */ 括起來。

DECLARE
   -- variable declaration
   message  varchar2(20):= ‘Hello, World!‘;
BEGIN
   /*
    *  PL/SQL executable statement(s)
    */
   dbms_output.put_line(message);
END;
/

當上述代碼在SQL提示符執行時,它產生了以下結果:

Hello World

PL/SQL procedure successfully completed.

PL/SQL程序單元

PL/SQL單元是下列任何一個:

  • PL/SQL 塊

  • 函數

  • 包體

  • 過程

  • 觸發器

  • 類型

  • 類型體

PL/SQL數據類型

PL/SQL變量,常量和參數都必須有一個有效的數據類型,指定存儲格式,約束和值的有效範圍。本教程介紹標量和LOB在PL/SQL,其他兩種數據類型可用的數據類型將涵蓋在後面的章節。

分類描述
標量 單值沒有內部組件,如NUMBER, DATE 或 BOOLEAN
大對象(LOB) 指向其他數據項,如文本,圖形圖像,視頻剪輯和聲音等存儲大對象
復合 具有可單獨訪問的內部組件的數據項。例如,集合和記錄
引用 指向其他數據項

PL/SQL標量數據類型和子類型

PL/SQL標量數據類型和子類型受到以下幾大類:

數據類型描述
數字 在其上執行的算術運算的數值
字符 代表單個字符或字符的字母數字字符串值
布爾 在其上執行的邏輯運算的邏輯值
日期時間 日期和時間

PL/SQL提供的數據類型的子類型。例如,數據類型數有一個叫作INTEGER的子類型。可以使用子類型在PL/SQL程序中,使數據類型與其他程序中的數據類型兼容,而嵌入PL/SQL代碼在另一個程序,如Java程序。

PL/SQL數值數據類型和子類型

以下是PL/ SQL預定義的數字數據類型及其子類型的詳細信息:

數據類型描述
PLS_INTEGER 通過2,147,483,647到-2147483648範圍內有符號整數,以32位表示
BINARY_INTEGER 通過2,147,483,647到-2147483648範圍內的有符號整數,以32位表示
BINARY_FLOAT 單精度IEEE 754格式的浮點數
BINARY_DOUBLE 雙精度IEEE 754格式的浮點數
NUMBER(prec, scale) 定點或浮點數在範圍1E-130至(但不包括)絕對值1.0E126。 NUMBER變量也可以表示0
DEC(prec, scale) ANSI具體的定點類型使用38位小數最大精度
DECIMAL(prec, scale) IBM特定的固定點型具有38位小數最大精度
NUMERIC(pre, secale) 浮點類型具有38位小數最大精度。
DOUBLE PRECISION 具有126個二進制數字最大精度ANSI特定浮點型(約38位十進制數)
FLOAT 具有126個二進制數字(約38位十進制數)最大精度ANSI和IBM特定的浮點型
INT 具有38位小數最大精度ANSI具體的整數類型
INTEGER ANSI和IBM的38位小數最大精度具體的整數類型
SMALLINT ANSI和IBM的38位小數最大精度具體的整數類型
REAL 具有63位二進制數字最大精度浮點型(大約18位小數)

下面是一個有效的聲明:

DECLARE
   num1 INTEGER;
   num2 REAL;
   num3 DOUBLE PRECISION;
BEGIN
   null;
END;
/

讓我們編譯和運行上面的程序,這將產生以下結果:

PL/SQL procedure successfully completed

PL/SQL字符數據類型和子類型

以下是PL/SQL預定義的字符數據類型及其子類型的詳細信息:

數據類型描述
CHAR 具有32,767個字節的最大尺寸固定長度字符串
VARCHAR2 具有32,767個字節的最大尺寸變長字符串
RAW 可變長度的二進制或字節字符串的32,767個字節的最大尺寸,而不是由PL/ SQL解釋
NCHAR 具有32,767個字節的最大尺寸的固定長度國家字符串
NVARCHAR2 具有32,767個字節的最大尺寸可變長度國家字符串
LONG 具有32,760字節最大尺寸變長字符串
LONG RAW 可變長度的二進制或字節字符串的32,760字節的最大尺寸,而不是由PL/SQL解釋
ROWID 物理行標識符,一行在一個普通的表中的地址
UROWID 物理通用行標識符(物理,邏輯,或外國的行標識符)

PL/SQL布爾數據類型

在邏輯操作中使用布爾數據類型存儲的邏輯值。邏輯值為:true 和 false 的布爾值以及 NULL 值。

但是,SQL沒有數據類型等同於布爾。因此,布爾值不能用於:

  • SQL語句

  • 內置SQL函數(如TO_CHAR)

  • 從SQL語句調用PL/ SQL函數

PL/SQL日期時間和間隔類型

DATE數據類型存儲固定長度的日期時間,其中包括每天在幾秒鐘內從午夜開始的時間。有效的日期範圍從公元前4712年1月1日至999912月31日。

默認的日期格式由Oracle初始化參數NLS_DATE_FORMAT設置。例如,默認的可以是“DD-MON-YY‘,它包括一個兩位數字的月份中的日期,月份名稱的縮寫,以及年的最後兩位數字,例如,01- OCT-12。

每個日期,包括世紀,年,月,日,時,分,秒。下表顯示了每個字段的有效值:

字段名稱有效日期時間值有效的間隔值
YEAR -4712 to 9999 (年除外 0) 任何非零整數
MONTH 01 to 12 0 to 11
DAY 01 to 31 (受制於年份和月份的數值,按日歷的區域設置的規則) 任何非零整數
HOUR 00 to 23 0 to 23
MINUTE 00 to 59 0 to 59
SECOND 00 to 59.9(n), 其中,9(n)是時間小數秒精度 0 to 59.9(n), 其中,9(n)是區間小數秒精度
TIMEZONE_HOUR -12 to 14 (範圍可容納夏令時更改) 不適用
TIMEZONE_MINUTE 00 to 59 不適用
TIMEZONE_REGION 在動態性能視圖找到V$TIMEZONE_NAMES 不適用
TIMEZONE_ABBR 在動態性能視圖找到V$TIMEZONE_NAMES 不適用

PL/SQL大對象(LOB)數據類型

大對象(LOB)數據類型是指大到數據項,例如文本,圖形圖像,視頻剪輯和聲音波形。 LOB數據類型允許高效的,隨機的,分段訪問這些數據。以下是預定義的PL/SQL LOB數據類型:

數據類型描述大小
BFILE 用於存儲大型二進制對象在操作數據庫之外的系統文件 依賴於系統,不能超過4千兆字節(GB)
BLOB 用於存儲大型二進制對象在數據庫中 8到128兆兆字節(TB)的
CLOB 用於存儲字符大塊數據在數據庫中 8 - 128 TB
NCLOB 用於在數據庫中存儲大塊NCHAR數據 8 - 128 TB

PL/SQL用戶定義的子類型

子類型是另一種數據類型,這是所謂的基本類型的子集。 子類型具有其基本類型相同的操作,但其只是有效值的一個子集。

PL/SQL預定義了一些子類型的封裝標準。例如,PL/SQL預定義的子類型CHARACTER和INTEGER如下:

SUBTYPE CHARACTER IS CHAR;
SUBTYPE INTEGER IS NUMBER(38,0);

可以定義和使用自己的子類型。下面的程序說明定義和使用一個用戶定義的子類型:

DECLARE
   SUBTYPE name IS char(20);
   SUBTYPE message IS varchar2(100);
   salutation name;
   greetings message;
BEGIN
   salutation := ‘Reader ‘;
   greetings := ‘Welcome to the World of PL/SQL‘;
   dbms_output.put_line(‘Hello ‘ || salutation || greetings);
END;
/

當上述代碼在SQL提示符執行時,它產生了以下結果:

Hello Reader Welcome to the World of PL/SQL

PL/SQL procedure successfully completed.

PL/SQL NULL

PL/SQL NULL值表示缺少或未知的數據,蛤它不是一個整數,字符,或任何其他特定的數據類型。需要註意的是NULL不是一樣的空數據串或空字符值‘\0‘。NULL可以被分配,但它不能與任何東西等同,包括其本身。

SQL記錄-PLSQL基本語法與數據類型