1. 程式人生 > >第六章 資料庫應用程式設計

第六章 資料庫應用程式設計

 

資料庫連線技術  (ODBC/JDBC)

開放式資料庫互連Open DataBase Connectivity,簡寫為ODBC

ODBC定義了一套基於SQL的、公共的、與資料庫無關的API(應用程式設計介面);

使每個應用程式利用相同的原始碼就可訪問不同的資料庫系統,存取多個數據庫中的資料

從而使得應用程式與資料庫管理系統DBMS)之間在邏輯上有獨立性,使應用程式具有資料庫無關性。

 

應用程式使用ODBC訪問資料庫的步驟

首先必須用ODBC管理器註冊一個資料來源

管理器根據資料來源提供的資料庫位置、資料庫型別及

ODBC驅動程式等資訊,建立起ODBC與具體資料庫的聯絡;

應用程式只需將資料來源名提供給ODBCODBC就能建立起與相應資料庫的連線;

這樣,應用程式就可以通過驅動程式管理器與資料庫交換資訊;

驅動程式管理器負責將應用程式對ODBC API的呼叫傳遞給正確的驅動程式;

驅動程式在執行完相應的SQL操作後,將結果通過驅動程式管理器返回給應用程式

使用ODBC管理器配置資料來源

首先必須在資料庫廠商的官網下載與你的資料庫對應的驅動程式;

例如:名字為psqlodbc_x64.msi的驅動程式支援PostgreSQL  64位資料庫;

執行

psqlodbc_x64.msi安裝PostgreSQL資料庫驅動程式;

開啟windows 7ODBC管理器,配置資料來源。

 

JDBCJava DataBase ConnectivityJava資料庫連線)技術的簡稱 ,是一種用於執行SQL語句的Java API,它由一組用Java程式語言編寫的類和介面組成。

 

JDBC訪問資料庫步驟

Java使用JDBC連線資料庫的例子

 

 

資料庫儲存過程

儲存過程(Stored Procedure)是一種資料庫的物件;

由一組能完成特定功能的

SQL 語句集構成;

是把經常會被重複使用的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迴圈可以遍歷命令的結果並操作相應的資料

 

觸發器是特殊型別的儲存過程,主要由操作事件(INSERTUPDATEDELETE) 觸發而被自動執行。

觸發器可以實現比約束更復雜的資料完整性經常用於加強資料的完整性約束和業務規則

觸發器本身是一個特殊的事務單位

觸發器

與表相關聯:必須定義在表或檢視上。

自動觸發:由執行INSERTDELETEUPDATE操作時觸發

不能直接呼叫,也不能傳遞或接受引數

是事務的一部分:觸發器和觸發語句作為可在觸 發器內回滾的單個事務

觸發器按執行的次數可分:

   1)語句級觸發器:由關鍵字FOR  EACH  STATEMENT宣告,在觸發器作用的表上執行一條SQL語句時,該觸發器只執行一次,即使是修改了零行資料的SQL,也會導致相應的觸發器執行。如果都沒有被指定,FOR EACH STATEMENT會是預設值

   2)行級觸發器:由關鍵字FOR  EACH  ROW標記的觸發器,當觸發器作用的表的資料發生變化時,每變化一行就會執行一次觸發器。例如,假設學生成績表有DELETE觸發器,當在該表執行DELETE語句刪除記錄時,如果刪除了20條記錄,則將導致 DELETE觸發器被執行20 次。

 

觸發器按觸發的時間分為三類:

1BEFORE觸發器:在觸發事件之前執行觸發器。

2AFTER觸發器:在觸發事件之後執行觸發器。

3INSTEAD OF觸發器:當觸發事件發生後,執行觸發器中指定的函式,而不是執行產生觸發事件的SQL 語句,從而替代產生觸發事件的SQL操作。在表或檢視上,對於INSERTUPDATE DELETE 三種觸發事件,每種最多可以定義一個INSTEAD OF 觸發器

 

觸發器相關的特殊變數

1NEW

      資料型別是RECORD。對於行級觸發器,它存有INSERTUPDATE操作產生的新的資料行。對於語句級觸發器,它的值是NULL

2OLD

       資料型別是RECORD。對於行級觸發器,它存有UPDATEDELETE操作修改或刪除的舊的資料行。對於語句級觸發器,它的值是NULL

3TG_OP

     資料型別是text;是值為INSERTUPDATEDELETE 的一個字串,它說明觸發器是為哪個操作引發。

 

PostgreSQL建立觸發器的基本語法

CREATE  TRIGGER  觸發器名  

    { BEFORE | AFTER | INSTEAD OF }

     ON 表名

     [ FOR [ EACH ] { ROW | STATEMENT } ]

     EXECUTE PROCEDURE 儲存過程名 ( 引數列表 )

1指明所定義的觸發器名  

2 BEFORE | AFTER | INSTEAD OF  指明觸發器被觸發的時間

3ON 表名 指明觸發器所依附的表

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為由逗號分隔的引數列表,用於開啟遊標時向遊標傳遞引數,類似於儲存過程或函式的形式引數;queryselect資料查詢語句,返回的值儲存在遊標變數中。

 

開啟遊標

1OPEN FOR:

        其宣告形式為:

        OPEN unbound_cursor FOR query;

       開啟未繫結的遊標變數,其query查詢語句是返回記錄的SELECT語句。

例如: OPEN curVars1 FOR SELECT * FROM student WHERE SID = mykey;

2OPEN 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開啟遊標,這時遊標重新查詢返回新的結果。

 

下面示例使用帶引數的遊標,從成績表中查詢分數大於某給定值的學號和課程號