第六章 資料庫應用程式設計
資料庫連線技術 (ODBC/JDBC)
開放式資料庫互連(Open DataBase Connectivity,簡寫為ODBC)
ODBC定義了一套基於SQL的、公共的、與資料庫無關的API(應用程式設計介面);
使每個應用程式利用相同的原始碼就可訪問不同的資料庫系統,存取多個數據庫中的資料;
從而使得應用程式與資料庫管理系統(DBMS)之間在邏輯上有獨立性,使應用程式具有資料庫無關性。
應用程式使用ODBC訪問資料庫的步驟
①首先必須用ODBC管理器註冊一個資料來源;
②管理器根據資料來源提供的資料庫位置、資料庫型別及
③應用程式只需將資料來源名提供給ODBC,ODBC就能建立起與相應資料庫的連線;
④這樣,應用程式就可以通過驅動程式管理器與資料庫交換資訊;
⑤驅動程式管理器負責將應用程式對ODBC API的呼叫傳遞給正確的驅動程式;
⑥驅動程式在執行完相應的SQL操作後,將結果通過驅動程式管理器返回給應用程式
使用ODBC管理器配置資料來源
①首先必須在資料庫廠商的官網下載與你的資料庫對應的驅動程式;
②例如:名字為psqlodbc_x64.msi的驅動程式支援PostgreSQL 64位資料庫;
③執行
④開啟windows 7的ODBC管理器,配置資料來源。
JDBC(Java DataBase Connectivity,Java資料庫連線)技術的簡稱 ,是一種用於執行SQL語句的Java API,它由一組用Java程式語言編寫的類和介面組成。
JDBC訪問資料庫步驟
Java使用JDBC連線資料庫的例子
資料庫儲存過程
儲存過程(Stored Procedure)是一種資料庫的物件;
由一組能完成特定功能的
是把經常會被重複使用的SQL語句邏輯塊封裝起來,經編譯後,儲存在資料庫伺服器端;
當被再次呼叫時,而不需要再次編譯;
當客戶端連線到資料庫時,使用者通過指定儲存過程的名字並給出引數,資料庫就可以找到相應的儲存過程予以呼叫。
CREATE [ OR REPLACE ] FUNCTION name
( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
[ RETURNS retype | RETURNS TABLE ( column_name column_type [, ...] ) ]
AS $$ //$$用於宣告儲存過程的實際程式碼的開始
DECLARE
-- 宣告段
BEGIN
--函式體語句
END;
$$ LANGUAGE lang_name; //$$ 表明程式碼的結束, LANGUAGE後面指明所用的程式語言
//example
CREATE OR REPLACE FUNCTION countRecords ()
RETURNS integer AS $count$
declare
count integer;
BEGIN
SELECT count(*) into count FROM STUDENT;
RETURN count;
END;
$count$ LANGUAGE plpgsql;
PL/SQL基本語法
1.宣告區域性變數
變數宣告的語法如下:
declare
變數名 變數型別;
如果宣告變數為記錄型別,變數宣告格式為: variable_name RECORD;
注:RECORD不是真正的資料型別,只是一個佔位符。
例如:
declare
count intger;
rec RECORD ;
2、條件語句
在PL/pgSQL中有以下三種形式的條件語句,與其他高階語言的條件語句意義相同。
1). IF-THEN
IF boolean-expression THEN
statements
END IF;
2). IF-THEN-ELSE
IF boolean-expression THEN
statements
ELSE
3). IF-THEN-ELSIF-ELSE
IF boolean-expression THEN
statements
ELSIF boolean-expression THEN
statements
ELSIF boolean-expression THEN
statements
ELSE
statements
END IF;
3、迴圈語句
1). LOOP 語句
LOOP
statements
END LOOP [ label ];
2). EXIT
EXIT [ label ] [ WHEN expression ];
例如:
LOOP
count=count+1;
EXIT WHEN count >100;
END LOOP;
3). CONTINUE
CONTINUE [ label ] [ WHEN expression ];
例如:
: LOOP
count=count+1;
EXIT WHEN count > 100;
CONTINUE WHEN count < 50;
count=count+1;
END LOOP;
4). WHILE
WHILE expression LOOP
statements
END LOOP ;
5). FOR
FOR name IN [ REVERSE ] expression ... expression LOOP
statements
END LOOP;
例如:
FOR i IN 1...10 LOOP
RAISE NOTICE 'i IS %', i;
END LOOP;
FOR i IN REVERSE 10...1 LOOP
--do something
END LOOP;
4.遍歷命令結果
FOR record_or_row IN query LOOP
statements
END LOOP ;
FOR迴圈可以遍歷命令的結果並操作相應的資料
觸發器是特殊型別的儲存過程,主要由操作事件(INSERT、UPDATE、DELETE) 觸發而被自動執行。
觸發器可以實現比約束更復雜的資料完整性,經常用於加強資料的完整性約束和業務規則。
觸發器本身是一個特殊的事務單位。
觸發器
與表相關聯:必須定義在表或檢視上。
自動觸發:由執行INSERT、DELETE、UPDATE操作時觸發
不能直接呼叫,也不能傳遞或接受引數
是事務的一部分:觸發器和觸發語句作為可在觸 發器內回滾的單個事務
觸發器按執行的次數可分:
(1)語句級觸發器:由關鍵字FOR EACH STATEMENT宣告,在觸發器作用的表上執行一條SQL語句時,該觸發器只執行一次,即使是修改了零行資料的SQL,也會導致相應的觸發器執行。如果都沒有被指定,FOR EACH STATEMENT會是預設值。
(2)行級觸發器:由關鍵字FOR EACH ROW標記的觸發器,當觸發器作用的表的資料發生變化時,每變化一行就會執行一次觸發器。例如,假設學生成績表有DELETE觸發器,當在該表執行DELETE語句刪除記錄時,如果刪除了20條記錄,則將導致 DELETE觸發器被執行20 次。
觸發器按觸發的時間分為三類:
(1)BEFORE觸發器:在觸發事件之前執行觸發器。
(2)AFTER觸發器:在觸發事件之後執行觸發器。
(3)INSTEAD OF觸發器:當觸發事件發生後,執行觸發器中指定的函式,而不是執行產生觸發事件的SQL 語句,從而替代產生觸發事件的SQL操作。在表或檢視上,對於INSERT、UPDATE 或 DELETE 三種觸發事件,每種最多可以定義一個INSTEAD OF 觸發器
觸發器相關的特殊變數
(1)NEW
資料型別是RECORD。對於行級觸發器,它存有INSERT或UPDATE操作產生的新的資料行。對於語句級觸發器,它的值是NULL。
(2)OLD
資料型別是RECORD。對於行級觸發器,它存有被UPDATE或DELETE操作修改或刪除的舊的資料行。對於語句級觸發器,它的值是NULL。
(3)TG_OP
資料型別是text;是值為INSERT、UPDATE、DELETE 的一個字串,它說明觸發器是為哪個操作引發。
PostgreSQL建立觸發器的基本語法
CREATE TRIGGER 觸發器名
{ BEFORE | AFTER | INSTEAD OF }
ON 表名
[ FOR [ EACH ] { ROW | STATEMENT } ]
EXECUTE PROCEDURE 儲存過程名 ( 引數列表 )
(1)指明所定義的觸發器名
(2) BEFORE | AFTER | INSTEAD OF 指明觸發器被觸發的時間
(3) ON 表名 指明觸發器所依附的表
(4) FOR EACH { ROW | STATEMENT } 指明觸發器被觸發的次數
(5) EXECUTE PROCEDURE 儲存過程名 ( 引數列表 ) 指明觸發時所執行的儲存過程
PostgreSQL建立觸發器的基本步驟
(1)檢查資料庫中將要建立的觸發器所依附的表或檢視是否存在,如果不存在,必須首先建立該表或檢視。
(2)建立觸發器被觸發時所要執行的觸發器函式,該函式的型別必須是TRINGER型,是觸發器的執行函式。但要注意,有些資料庫不需要獨立定義觸發器函式,而是在建立觸發器時,定義觸發器的過程體。
(3)建立觸發器,一般需要指明觸發器依附的表,觸發器被觸發執行的時間,觸發器是行級觸發器還是語句級觸發器,觸發器執行需要滿足的條件。
資料庫遊標
(1)遊標(Cursor)是一種臨時的資料庫物件;
(2)用來存放從資料庫表中查詢返回的資料記錄;
(3)提供了從結果集中提取並分別處理每一條記錄的機制;
(4)遊標總是與一條SQL查詢語句相關聯;
(5)遊標包括:SQL語言的查詢結果,指向特定記錄的指標。
遊標的宣告
(1)在儲存過程中遊標型別的變數。例如:遊標變數 refcursor;
refcursor是關鍵字;
此時,遊標變數還沒有繫結查詢語句,因此不能訪問遊標變數。
(2) 使用遊標專有的宣告語法,如:
遊標名 CURSOR [ ( arguments ) ] FOR query;
其中arguments為由逗號分隔的引數列表,用於開啟遊標時向遊標傳遞引數,類似於儲存過程或函式的形式引數;query是select資料查詢語句,返回的值儲存在遊標變數中。
開啟遊標
(1)OPEN FOR:
其宣告形式為:
OPEN unbound_cursor FOR query;
開啟未繫結的遊標變數,其query查詢語句是返回記錄的SELECT語句。
例如: OPEN curVars1 FOR SELECT * FROM student WHERE SID = mykey;
(2)OPEN FOR EXECUTE
其宣告形式為: OPEN unbound_cursor FOR EXECUTE query-string;
開啟未繫結的遊標變數。EXECUTE將動態執行查詢字串。例如:
OPEN curVars1 FOR EXECUTE 'SELECT * FROM ' || quote_ident($1);
注意:$1是指由儲存過程傳遞的第1個引數。
(3)開啟一個繫結的遊標,其宣告形式為:
OPEN bound_cursor [ ( argument_values ) ];
僅適用於繫結的遊標變數,只有當該變數在宣告時包含接收引數,才能以傳遞引數的形式開啟該遊標,引數將傳入到遊標宣告的查詢語句中,例如:
OPEN curStudent;
OPEN curStudentOne (‘20160230302001’);
使用遊標
其宣告形式為: FETCH cursor INTO target;
FETCH命令從遊標中讀取下一行記錄的資料到目標中,讀取成功與否,可通過PL/SQL內建系統變數FOUND來判斷。
例如:
FETCH curVars1 INTO rowvar; --rowvar為行變數
FETCH curStudent INTO SID, Sname, sex;
請注意:遊標的屬性列必須與 目標列的數量一致,並且型別相容。
關閉遊標
CLOSE cursorName;
當遊標資料不再需要時,需要關閉遊標,以釋放其佔有的系統資源,主要是釋放遊標資料所佔用的記憶體資源,cursorName是遊標名。
例如: CLOSE curStudent;
需要注意:當遊標被關閉後,如果需要再次讀取遊標的資料,需要重新使用open開啟遊標,這時遊標重新查詢返回新的結果。
下面示例使用帶引數的遊標,從成績表中查詢分數大於某給定值的學號和課程號