PL/SQL學習筆記[1]-基礎

1、SQL部分

1.1、SQL分類

1、數據查詢語句(SELECT 語句):用於檢索數據庫數據

2、數據操縱語言(Data Manipulation Language,DML):用於改變數據庫數據,包括INSERT、UPDATE和DELETE三條語句

3、事物控制語句(Transaction Contorl Language,TCL):用戶維護數據庫的一致性,包括COMMIT、ROLLBACK和SAVEPOINT三條語句。

3.1 COMMIT 確認已經進行的數據庫更改

3.2 ROLLBACK 取消已經進行的數據庫更改

3.3 SAVEPOINT 設置保存點,以取消部分數據庫改變

4、數據定義語句(Data Definition Language,DDL):用於建立、修改和刪除數據庫對象。比如CREATE TABLE 、ALTER TABLE和DROP TABLE。DDL語句會自動提交事務

5、數據庫控制語言(Data Control Language,DCL):用於執行權限授予和收回操作,包括GRANT和REVOKE兩條命令。DCL語句會自動提交事務

5.1 GRANT 命令用戶給用戶或角色授予權限

5.2 REVOKE 命令用於收回用戶或角色所具有的權限。

1.2、SQL語句編寫規則

1、SQL關鍵字不區分大小寫;

2、對象名和列名不區分大小寫;

3、字符值和日期值區分大小寫;

4、SQL語句可以分佈在多行,增加可讀性;

5、在SQL*Plus中,SQL語句要以分號結束;

1.3、命令行中連接SQL*Plus

-- username:數據庫用戶名 password:用戶密碼 @server:主機字符串(網絡服務名),連接本地數據庫時不需要提供
sqlplus [username]/[password][@server]
-- 連接到yt$dev數據庫。用戶密碼爲yt
sqlplus yt$dev/yt
-- 連接到遠程數據庫
sqlplus yt$dev/yt@orcl

2、PL/SQL 基礎

2.1、PL/SQL 塊結構

DECLARE
/*
* 定義部分——定義常量、變量、複雜數據類型、遊標、例外
*/
BEGIN
/*
* 執行部分——PL/SQL 語句和SQL語句
*/
EXCEPTION
/*
* 例外處理部分——處理運行錯誤
*/
END; /* 程序結束標記 */
定義部分以 DECLARE 開始,該部分可省略;
執行部分以 BEGIN 開始,該部分是必須的;
例外處理部分以 EXCEPTION 開始,該部分可選;END爲結束標記,分號不能省略。

Notes:DECLARE、BEGIN、EXCEPTION後均無分號

2.2、PL/SQL 塊分類

2.2.1 匿名塊

沒有名稱的PL/SQL塊。比如:

declare
  v_name VARCHAR2(20);
begin
  select name into v_name from customer
  where id = &id;   -- &id爲替換變量
  dbms_output.put_line('用戶姓名:'||v_name);
exception 
  when NO_DATA_FOUND THEN
    dbms_output.put_line('請輸入正確的僱員號!');
end;

 Notes:

1、在SQL*Plus中輸入反斜槓調用該過程;

2、dbms_output.put_line生效,需要設置serveroutput爲on< set serveroutput on >;

2.2.2 命名塊

類似於匿名塊。只不過在PL/SQL塊前使用<<>>加以標記.比如<<outer>>

declare
  v_deptname date;
  v_dname varchar2(10);
begin
  <<inner>>
  begin
    select register_time into v_deptname from customer
    where id = &id;
  end;
  select name into v_dname from customer
  where register_time = v_deptname;
  dbms_output.put_line('地址:'||v_dname);
end;

示例中<<outer>>和<<inner>>分別是主塊(外層塊)和子塊(內存塊)的標記。這種PL/SQL塊被稱爲命名塊。

2.2.3 子程序

2.2.3.1 過程

用於執行特定操作。SQL*Plus中使用 CREATE PROCEDURE 命令建立過程。比如:

CREATE OR REPLACE PROCEDURE update_customer (new_name varchar2,id number) IS
BEGIN 
  update customer set name = new_name
  where id = id;
END;

使用  <call 過程名> 或者  <exec 過程名> 調用過程.

Notes:

1、在 SQL*Plus 中調用可以使用 call 或者 exec ;

2、而在 Oracl SQL Deveploer 中只能使用 call ;

2.2.3.2 函數

函數用於返回特定數據。建立函數時,函數頭部必須包含 RETURN 子句,而在函數體內必需要包含 RETURN 語句返回數據。SQL*Plus中使用 CREATE FUNCTION 命令建立函數。比如:

CREATE OR REPLACE FUNCTION id100(ename varchar2)
return number is
  id_100 number(10);
begin
  select id * 100 into id_100 
  from customer where lower(name) = lower(ename) and rownum < 2;
  return id_100;
end;
調用:
1、在 SQL*Plus 可以使用綁定變量存放結果var id_100 number(10)call id100('abc') into :id_100;print id_100;2、在查詢語句中直接調用:select id_100('abc') from dual;

2.2.3.3 包

包用於邏輯組合相關的過程和函數,由包規範和包體兩部分組成。包規範用於定義公用的常量、變量、過程和函數。SQL*Plus中使用 CREATE PACKAGE 命令建立包規範。包規範只包含了過程和函數的說明,因此是無法調用執行的。比如:

CREATE OR REPLACE PACKAGE test_packe is
procedure update_customer (new_name varchar2,id number);
function id100(ename varchar2) return number;
end;

SQL*Plus中使用 CREATE PACKAGE BODY 命令建立包體。只有創建了包體後纔可以使用該包。比如:

CREATE OR REPLACE PACKAGE BODY test_packe is 
procedure update_customer (new_name varchar2,id number) is
begin 
    update customer set name = new_name
    where id = id;
end;
function id100(ename varchar2) return number is
      id_100 number(10);
begin
    select id * 100 into id_100 
    from customer where lower(name) = lower(ename) and rownum < 2;
end;
end;

調用方式同單獨的過程、函數調用方式,唯一不同的是需要在調用過程、函數時需要在其名稱前加上名。

call test_packe.update_customer('leeyee',1);

Notes:

1、可以先創建包體。但此時無法訪問該包;
2、包頭與包體缺一不可,否則無法訪問該包;
3、使用 drop package [package name] 時,則包體一起被刪除;
4、單獨刪除包體請使用 drop package body [package body name];

2.2.3.4 觸發器

觸發器是指隱含執行的存儲過程。定義觸發器時,必須指定出發事件及觸發操作。常用觸發時間包括 insert、update和 delete,而觸發操作實際上是一個 PL/SQL 塊。SQL*Plus中使用 CREATE TRIGGER 命令創建觸發器。比如:

create or replace trigger update_custom_register
  before update of name on customer
  for each row
begin 
  :new.register_time := sysdate;
end;
-- 調用:
-- 實際執行的語句爲 update customer set name= 'leeyee',register_time = sysdate  where id = 1;
update customer set name= 'leeyee' where id = 1; 
 2.3、變量的定義及使用

2.3.1、標量(Scalar)變量

2.3.1.1 常用標量類型

1.1.1 varchar2(n)  : 可變長字符串。n 最大爲32767字節。PL/SQL中 n 不應超過4000字節

1.1.2 char(n): 固定長度字符串。 n 默認爲 1, n 最大爲32767字節。PL/SQL中 n 不應超過2000字節

1.1.3 number(p,s) : 固定長度整數和浮點數。p-精度,指定數字總位數,s-標度,指定小數點後的位數; number(4,2)定義整數最大2位

1.1.4 date : 日期。固定長度7字節

1.1.5 timestamp : 日期和時間數據。同date,但在顯示時除過日期還有時間及上下午標識

1.1.6 long(n) : 變長字符產。類似varchar2,不過 n 最大爲32760字節

1.1.7 long raw : 變長二進制數據。最大長度32760字節

1.1.8 boolean : 布爾變量。其值爲true|false|null。該類型爲PL/SQL數據類型

1.1.9 binary_integer : 整數。數值範圍 -214783647 到 214783647 之間。該類型爲PL/SQL數據類型

1.1.10 binary_float : 單精度浮點數。賦值時應帶後綴f,比如 1.5f

1.1.11 binary_double : 雙精度浮點數。賦值時應帶後綴d,比如 1.0005d

2.3.1.2 定義標量變量

2.3.1.2.1 語法:indentifier [constant] datatype [not null] [:= | default expr]

indentifier : 變量或常量名稱

constant : 指定常量關鍵詞

datatype : 數據類型

not null : 初始化數據不爲空

:= : 賦值

default expr : 指定變量默認初始值

2.3.1.2.2 示例

v_name varchar2(10);

v_name constant number(3,2) := 5.5;

v_bool boolean not null default false;

2.3.1.2.3 使用示例

declare

v_name constant varchar2(20) := 'hello 標量使用示例';

begin

dbms_output.put_line(v_name);

end;

2.3.1.2.4 使用%type屬性

定義變量時,可以使用 %type 屬性聲明變量類型爲數據表定義類型。

declare
/*
*如果這裏聲明爲varchar2(2),當查詢賦值時,
* 實際查詢長度大於定義長度則會報錯。因此這裏使用%type屬性,
* 定義變量 v_name 的類型爲表customer字段name的聲明類型。
*/
    v_name customer.name%type; 
begin
    select name into v_name  from customer where id = 1 ;
    dbms_output.put_line(v_name);
end;

2.3.2、複合(Composite)變量

複合變量是用於存放多個值的變量。

2.3.2.1 PL/SQL 記錄

PL/SQL 記錄類似高級語言中的結構,每個PL/SQL記錄一般都包含多個成員。

2.1.1 語法

TYPE record_name IS RECORD(

column_name {column_type | variable%TYPE | table.column%TYPE},

column_name1 {column_type | variable%TYPE | table.column%TYPE},

...

)

2.1.2 示例

			DECLARE
				TYPE customer_record_type 
				IS
					RECORD (
						vname customer.name%type,
						vmoney customer.money%type
					);
					cs_rc_type customer_record_type;
				BEGIN
					select name,money into cs_rc_type
					from customer where  id = 1;
					dbms_output.put_line('姓名:'||cs_rc_type.vname||' 金額:'||cs_rc_type.vmoney);
				END;

2.3.2.2 PL/SQL 表

1、PL/SQL 表類似高級語言中的數組。

2、PL/SQL 表的元素個數沒有限制,並且下標沒有有下限(可爲負)

3、使用 PL/SQL 表時必須首先在定義部分定義 PL/SQL 表類型和表變量,然後在執行部分中引用該表變量

4、不能作爲表字段的數據類型

2.3.2.2.1 語法:

TYPE type_name IS TABLE OF

{column_type | variable%TYPE

      | table.column%TYPE} [NOT NULL]

    | table.%ROWTYPE 

    }

[INDEX BY type]; -- 主鍵類型。9.2前 type 只能爲 BINARY_INTEGER。以後可以爲字符串

2.3.2.2.2 示例
DECLARE
TYPE customer_table_type
IS
  TABLE of customer.name%type index by binary_integer;
  name_table customer_table_type;
BEGIN
  name_table(0) := '默認姓名';
  select name into name_table(-1) from customer where id = 1;
  
  dbms_output.put_line('默認姓名: '||name_table(3));
  dbms_output.put_line('姓名: '||name_table(-1));
  dbms_output.put_line('第一索引名稱: '||name_table.first); -- 亦可使用first().下同
  dbms_output.put_line('最後索引名稱: '||name_table.last);
  dbms_output.put_line('最後索引對應值: '||name_table(name_table.last));
  dbms_output.put_line('數組長度: '||name_table.count);
END;
-- PL/SQL 記錄、表結合使用的例子
DECLARE
TYPE customer_record_type -- 聲明record
IS
  RECORD
  (
    vname customer.name%type,
    vmoney customer.money%type );
TYPE customer_table_type -- 聲明 table
IS
  TABLE of customer_record_type --注意這裏的 table 類型爲 record
  index by binary_integer;
  name_table customer_table_type;
BEGIN
  select name,money into name_table(-1) from customer where id = 1;
  
  dbms_output.put_line('姓名: '||name_table(-1).vname);
  dbms_output.put_line('金額: '||name_table(-1).vmoney);
END;

2.3.2.3 嵌套表(Nested Table)

1、嵌套表類似高級語言中的數組。

2、下標不能爲負

3、元素個數沒有限制

4、可作爲表字段的數據類型

5、使用嵌套表類型作爲表字段類型時,需要爲其指定專門的存儲表。

2.3.2.3.1 語法:

CREATE OR REPLACE TYPE nest_type_name AS OBJECT(

colunm_name column_type,

colunm_name1 column_type,

...

);

CREATE OR REPLACE type_name IS TABLE OF  nest_type_name;

2.3.2.3.2 示例:
-- 創建嵌套表類型對象
CREATE OR REPLACE TYPE nest_table_type
AS
  OBJECT
  (
    name   varchar2(20),
    salary number(4,2) );
  -- 創建嵌套表對象類型
CREATE OR REPLACE TYPE emp_array
IS
  TABLE OF nest_table_type;
  -- 創建表
  CREATE TABLE department
    (
      deptno number(2),
      dname  varchar2(10),
      employee emp_array -- 聲明字段類型爲嵌套表類型
    )
    NESTED TABLE employee STORE AS employee; -- 爲其嵌套表類型指定特定的存儲表
  -- 插入內嵌表
  insert
  into department
    (
      deptno,
      dname,
      employee
    )
    values
    (
      '1',
      'leeyee',
      emp_array( nest_table_type('lee',20), nest_table_type('yeee',30) )
    );
  -- 讀取內嵌表
  select * from table
    (select employee from department
    );

2.3.2.4 VARRAY 變長數組

1、VARRAY類似於嵌套表,可做爲表字段和對象類型屬性的數據類型。

2、相對於嵌套表,VARRAY的元素個數是有限制的

3、使用 VARRAY 類型作爲表字段類型時,數據值與其他字段數據一起存放在表中,不需要額外指定存儲表

2.3.2.4.1 語法:

CREATE OR REPLACE TYPE varray_type_name AS OBJECT (

colunm_name column_type,

colunm_name1 column_type,

...

)

CREATE TYPE type name IS VARRAY(20) OF varray_type_name;

2.3.2.4.2 示例:
-- 創建 VARRAY 類型對象
CREATE OR REPLACE TYPE var_cus_type
AS
  OBJECT
  (
    name varchar2(20),
    age  number(3) );
  -- 創建 VARRAY 對象類型
CREATE OR REPLACE TYPE var_type IS VARRAY(20) Of var_cus_type;
-- 創建表
CREATE TABLE orders
  (
    ordno number(4),
    createdate date,
    customers var_type -- 聲明字段類型爲 VARRAY 類型
  );                   -- 不需要爲 VARRAY 類型的字段指定專門的存儲表
-- 插入
INSERT
INTO orders
  (
    ordno,
    createdate,
    customers
  )
  VALUES
  (
    1,
    sysdate,
    var_type( var_cus_type('leeyee',20), var_cus_type('oxcow',30), var_cus_type('abc',40) )
  );
-- 查詢
SELECT *
FROM TABLE
  (SELECT customers FROM orders WHERE ordno=1
  )
WHERE age > 20;

2.3.3、參照(Reference)變量

1.參照變量是指存放數值指針的變量

2.使用參照變量可以使得應用程序共享相同對象,降低佔用空間。

3.常用參照變量類型有遊標變量和對象類型變量

2.3.3.1 遊標變量(REF CURSOR)

2.3.3.1.1 靜態遊標:

使用顯示遊標時,需要在定義顯示遊標是指定相應的select語句。

2.3.3.1.2 動態遊標:

使用顯示遊標時,在定義時不指定相應的select語句,而是在打開遊標時指定select語句。

2.3.3.1.3 示例:
DECLARE
TYPE c1
IS
  REF
  CURSOR;
    emp_cursor c1;
    v_name customer.name%TYPE;
    v_sal customer.money%TYPE;
  BEGIN
    OPEN emp_cursor for select name, money from customer ;
    LOOP
      FETCH emp_cursor INTO v_name,v_sal;
    EXIT
  WHEN emp_cursor%NOTFOUND;
    dbms_output.put_line(v_name);
  END LOOP;
  CLOSE emp_cursor;
END;

2.3.3.2 對象對象變量(REF obj_type)

1、當編寫對象類型應用是,爲了共享相同對象,可以使用REF引用對象類型。

2、REF實際上是指向對象實例的指針。

2.3.3.2.1 示例:
CREATE OR REPLACE TYPE home_type
AS
  OBJECT
  (
    name   varchar2(20),
    salary number(4,2) )
  CREATE TABLE homes OF home_type;
  INSERT INTO homes VALUES
    ('leeyee',20
    );

2.3.4、LOB(Large Object)變量

用於存儲大批量數據的變量

2.3.4.1 內部LOB 

包括CLOB、BLOB和NCLOB.其數據均存儲在數據庫中,支持事務。其中BLOB用於存儲大批量二進制數據,而CLOB/NCLOB用於存儲大批量字符數據。

2.3.4.2 外部LOB

只有BFILE,該類型數據存儲在OS文件中,不支持事務操作。BFILE則存儲指向OS文件的指針。

2.4、PL/SQL基礎其他

2.4.1、分隔符

2.4.1.1.單符號分隔符

+ 加法

% 屬性提示符

'       字符串分隔符

. 組件分隔符

/       除法操作符

( 表達式或列表分隔符

) 表達式或列表分隔符

: 非PL/SQL變量提示符

, 項分隔符(表名、列名等分隔符)

* 乘法

" 雙引號變量分隔符

2.4.1.2.組合分隔符

= 等號

< 小於

> 大於

@ 遠程數據庫訪問操作符

; 語句中止符

- 減法或負數

2.4.1.3.組合分隔符

:= 賦值

=> 關聯操作符

|| 連接操作符

** 冪操作符

<< 標號開始分隔符

>> 標號開始分隔符

/* 多行註釋開始分隔符

*/      多行註釋結束分隔符

.. 範圍操作符

<> 不等操作符

!= 不等操作符

^= 不等操作符

<= 小於等於

>= 大於等於

-- 當行註釋

2.5、PL/SQL建議編碼規則

2.5.1、命名規則

1.定義變量,建議使用v_作前綴:v_job

2.定義常量,建議使用c_作簽註:c_rate

3.定義遊標,建議使用_cursor作後綴:emp_cursor

4.定義例外,建議使用e_作前綴:e_integrity_error

5.定義PL/SQL表示,建議使用_table_type作後綴:sal_table_type

6.定義PL/SQL表變量時,建議使用_table作後綴:sal_table

7.定義PL/SQL記錄類型時,建議使用_record_type作後綴:emp_record_type

8.定義PL/SQL記錄變量時,建議使用_record作後綴:emp_record

2.5.2、大小寫規則

1.SQL關鍵字大寫:SELECT\UPDATE\SET\WHERE etc.

2.PL/SQL關鍵字大寫:DECLARE\BEGIN\END etc.

3.數據庫類型大寫:INT\VARCHAR2\DATE etc.

4.數據庫類對象和列小寫:emp\sal\ename etc.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章