PL-SQL

PL/SQL是甲骨文公司專有的SQL擴充套件語言，應用在甲骨文公司的Oracle資料庫系統。一些的SQL資料庫管理系統也提供了類似的擴充套件SQL語言。PL/SQL的語法非常類似於Ada，而且像1980年代的Ada編譯器一樣，PL/SQL的運作系統使用Diana作為中介語言。重要的是PL/SQL緊密的結合在Oracle資料庫裡面。PL/SQL是Oracle資料庫使用的三種語言的其中之一，另外兩個是SQL和Java。特性.SQL連線操作.Oracle連線操作(left join ,right join,full join)的語法確與SQL標準完全不同，沒有左連線與右連線的概念，也不支援全外連線。Oracle語法如下所示：select * from t1,t2 where t1.id=t2.id(+)採用(+)來表示外連線，在Oracle中它相當於左連線。Oracle9i中增加了標準外連線的語法支援，但使用不廣。物化檢視.物化檢視或譯為實體化檢視。與普通檢視關係不同，物化檢視更像是一個表，儲存了實實在在的資料，並且可以與表一樣定義儲存引數，可以與表一樣使用select,insert,update,delete。在其它資料庫中也有和物化檢視相似的解決方案，DB2叫物化查詢表(materialized query table)，sqlserver有索引檢視，但是索引檢視僅是起最佳化作用，與oracle的物化檢視還不太一樣。資料型別.數值型別.採用本地的number型別做指數或對數運算，與標準的浮點數效能可能會相差50倍。好在Oracle10g中增加了高效的浮點型別binary_float,binary_double，從而彌補了浮點數效能的問題。variable_name number[([P][, S])] = 0;其它數值型別：dec, decimal, double precision, int, numeric, real, smallint, binary_integer.字元型別.字串資料型別依據儲存空間分為兩種：串的開頭儲存了串的長度。如果串的長度小於或等於250， Oracle 會使用1 個位元組來表示長度。對於所有長度超過250 的串，都會在一個標誌位元組0xFE 後跟有兩個位元組來表示長度。chr(0)表示的不可見字元，即我們通常所說的\0-- 欄位translated_name是NCHAR型別，則需要如下書寫：SELECT translated_description FROM product_descriptionsWHERE translated_name = N'LCD Monitor 11/PM';variable_name varchar2(20) = 'Text';-- e.g.:address varchar2(20) := 'lake view road';日期型別.variable_name date = to_date('01-01-2005 14:20:23', 'DD-MM-YYYY hh24:mi:ss');函式codice_1把字串轉換為日期值。to_date('31-12-2004', 'dd-mm-yyyy')to_date ('31-Dec-2004', 'dd-mon-yyyy', 'NLS_DATE_LANGUAGE = American')函式codice_2把日期值轉換為字串。PL/SQL支援使用ANSI日期與時間間隔值 The following clause gives an 18-month range:示例：WHERE dateField BETWEEN DATE '2004-12-30' - INTERVAL '1-6' YEAR TO MONTHAND DATE '2004-12-30'create table TC1 DATE,C2 TIMESTAMP(9)insert into t(c1,c2) values(date'2010-2-12',timestamp'2010-2-12 13:24:52.234123211');insert into t(c1,c2) values(to_date('2010-2-12 10:20:30','YYYY-MM-DD HH24:MI:SS'),to_timestamp('2010-2-12 13:24:52.123456','YYYY-MM-DD HH24:MI:SS.FF6')SQL&gt; select c1,dump(c1) c1_d,c2,dump(c2) c2_d from t;日期型資料可以與數值加減得到新的日期，加減數值單位為天LOB型別.內建的LOB資料型別包括BLOB、CLOB、NCLOB、BFILE的大型化和非結構化資料，如文字、影象、視屏、空間資料儲存。LONG型別，RAW型別，LONG RAW型別.均為較老的資料型別，Oracle不建議使用。ROWID &amp; UROWID型別.在資料庫中的每一行都有一個地址。然而，一些錶行的地址不是物理或永久的，或者不是ORACLE資料庫生成的。例如，索引組織錶行地址儲存在索引的葉子，可以移動。例如,外部表的ROWID不是標準的ORACLE的rowid。ORACLE使用通用的ROWID的儲存地址的索引組織表和外表。10個位元組，格式為： ********.****.****，*為0或1。NROWID型別為二進位制資料表中記錄的唯一行號，最大長度4000位元組索引組織表有邏輯urowids的，和外表的外urowids。UROWID這兩種型別的儲存在ROWID。建立基於邏輯的rowid在表中的主鍵。邏輯的rowid不會改變，只要主鍵不改變。索引組織表的ROWID偽UROWID資料型別。你可以訪問這個偽列，你會堆組織表的ROWID偽。如果你想儲存的rowid索引組織表，那麼你就可以定義一列的表型UROWID到列檢索值的ROWID偽。指定列的資料型別.定義一個變數，其型別是指定表的指定列的資料型別：Variable_name Table_name.Column_name%type;自定義型別.程式設計師自定義型別：type data_type is record (field_1 type_1 = xyz, field_2 type_2 := xyz, ..., field_n type_n = xyz);例如：declaretype t_address is record (name address.name%type,street address.street%type,street_number address.street_number%type,postcode address.postcode%type);v_address t_address;beginselect name, street, street_number, postcode into v_address from address where rownum = 1;end;可以使用點表示獲取結構中的域：v_address.street = 'High Street';"自增長資料型別.Oracle的資料型別裡沒有自增長欄位型別，Oracle的官方解決方案是採用sequence實現。insert的時候需要用sequence.nextval。需要增加一張專用表來儲存自增長欄位的表和欄位名，每次新增記錄時都把這個記錄值加1再取出使用。條件語句.以下的程式碼展示了IF-THEN-ELSIF結構。ELSIF和ELSE部分是可選的，從而可以建立更簡單的IF-THEN或者IF-THEN-ELSE結構。IF x = 1 THENsequence_of_statements_1;ELSIF x = 2 THENsequence_of_statements_2;ELSIF x = 3 THENsequence_of_statements_3;ELSIF x = 4 THENsequence_of_statements_4;ELSIF x = 5 THENsequence_of_statements_5;ELSEsequence_of_statements_N;END IF;CASE語句簡化了一些大的IF-THEN-ELSE結構。CASEWHEN x = 1 THEN sequence_of_statements_1;WHEN x = 2 THEN sequence_of_statements_2;WHEN x = 3 THEN sequence_of_statements_3;WHEN x = 4 THEN sequence_of_statements_4;WHEN x = 5 THEN sequence_of_statements_5;ELSE sequence_of_statements_N;END CASE;CASE語句可以使用預定義的選擇符：CASE xWHEN 1 THEN sequence_of_statements_1;WHEN 2 THEN sequence_of_statements_2;WHEN 3 THEN sequence_of_statements_3;WHEN 4 THEN sequence_of_statements_4;WHEN 5 THEN sequence_of_statements_5;ELSE sequence_of_statements_N;END CASE;迴圈.比較常用的有三種形式。For ... LoopEnd Loop;loop迴圈是最簡單的迴圈語句，用於無限制的迴圈執行語句：LoopEnd Loop;while...loop;如果退出迴圈，則必須使用exit語句終止迴圈。exit語句分兩種格式：exit：該格式的語句用於無條件強迫終止迴圈。exit...when：該格式用於有條件終止迴圈，首先檢測when的條件是否滿足。例1：loopif...then exit；end if；end loop；例2：loopexit when；end loop；while...loop迴圈在執行語句時，首先檢測條件的值。例如：declarediv_name varchar2(20);div_num integer=1;beginwhile div_num7;DBMS_OUTPUT.put_line(div_num);end loop;end;類似的語言.功能近似PL/SQL的程式語言和其他關係型資料庫：