數據庫:數據庫編程


sql編程

為什么要使用sql編程?

標准的sql是非過程化的查詢語言

特點:操作簡單、面向集合、功能豐富、使用簡單等

缺點缺少流程控制能力,難以實現應用業務中的邏輯控制

辦法:使用sql編程,可以提高應用系統和數據庫管理系統間的互操作性

使用sql編程來訪問和管理數據庫中的數據的方式有:

嵌入式sql【ESQL】過程化sql(PL/SQL)存儲過程和函數開放數據庫互聯【ODBC】java數據庫連接【JDBC】

嵌入式sql

sql的特點之一:

交互式嵌入式兩種不同的使用方式下,sql的語法結構基本是一致的

嵌入式sql:就是將sql語句嵌入到程序設計語言中,例如:C、C++、java等成為宿主語言,簡稱主語言SQL語句負責操作數據庫,高級語言負責控制邏輯流程

將sql嵌入其他語言中,必須解決三個問題:

ESQL的處理過程

面對ESQL,DBMS采用預編譯方法處理:

1、由DBMS的預處理程序,識別出ESQL語句

2、將之轉換成主語言調用語句,使主語言編譯程序能識別他們

3、然后由主語言的編譯程序將純的主語言程序編譯成目標代碼

在ESQL中,為了快速區分sql語句和主語言語句,所有sql語句必須加前綴:

若主語言是C,則前綴是EXEC SQL

若主語言是Java,則ESQL 成為SQLJ

一般形式:SQL< SQL語句 >

ESQL與主語言之間的通信

SQL語句負責操作數據庫,高級語言負責控制邏輯流程,這時,程序中會有兩種不同計算模型的語句,它們之間會如何通信?

數據庫工作單元和源程序工作單元之間的通信:

1、向主語言傳遞sql語句的執行狀態信息,使主語言能夠根據此信息控制程序流程,主要用於SQL通信區實現

2、主語句向SQL語句提供參數,主要用於主變量實現

3、將SQL語句查詢數據庫的結果交予主語言處理,主要用於主變量游標實現

SQl通信區

向主語言傳遞sql語句的執行狀態信息,使主語言能夠根據此信息控制程序流程

主變量

主語言向sql語句提供參數

將sql語句查詢數據庫的結果交主語言進一步處理

游標

解決集合型操作語言與過程性操作語言的不匹配

 

過程化SQL

過程化sql是對sql的擴展,使其增加了過程化語句功能

過程化sql程序的基本結構是,所有的過程化sql程序都是由塊組成,這些塊之間可以相互嵌套,每個塊完成一個邏輯操作。

塊的基本結構:

變量和常量的定義:

1、變量定義
變量名 數據類型 [[NOT NULL] :=初值表達式]
或者
變量名 數據類型 [[NOT NULL] 初值表達式]
2、常量定義
常量名 數據類型 CONSTANT:=常量表達式
常量必須要給一個值,並且該值在存在期間或常量的作用域內不能改變。如果試圖修改它,過程化SQL將返回一個異常。
3、賦值語句
變量名 :=表達式

流程控制

過程化SQL提供了流程控制語句,主要有條件控制語句和循環控制語句。這些語句的語法、定義和一般的高級語言類似。

1. 條件控制語句

IF語句

IF  condition  THEN
    Sequence_of_statements;     /*條件為真時語句序列才被執行*/
END IF      /*條件為假或NULL時什么也不做,控制轉移至下一個語句*/

IF-THEN語句

IF  condition  THEN
    Sequence_of_statements1;     /*條件為真時語句序列才被執行*/
ELSE
    Sequence_of_statements2;     /*條件為假或NULL時才被執行*/  
END IF

嵌套的IF語句

在THEN和ELSE子句中還可以包含IF語句,IF語句可以嵌套。

2. 循環控制語句

最簡單的循環語句LOOP

LOOP
    Sequence_of_statements;    /*循環體,一組過程化SQL語句*/
END LOOP;

多數數據庫服務器的過程化SQL都提供EXITBREAKLEAVE等循環結束語句以保證LOOP語句塊能夠在適當的條件下提前結束。

WHERE-LOOP循環語句

WHERE condition LOOP
    Sequence_of_statements;    /*條件為真時執行循環體內的語句序列*/
END LOOP;

每次執行循環體語句之前首先對條件進行求值,如果條件為真則執行循環體內的語句序列,如果條件為假則跳過循環並把控制傳遞給下一個語句。

FOR-LOOP

FOR count IN [REVERSE] bound1...bound2  LOOP
     Sequence_of_statements;
END LOOP;

FOR循環的基本執行過程:
將count設置為循環的下界bound1,檢查它是否小於上界bound2。當指定REVERSE時則將count設置為循環的上界bound2,檢查count是否大於下界bound1。如果越界則執行跳出循環,否則執行循環體,然后按照步長(+1或-1)更新count的值,重新判斷條件。

3、錯誤處理

如果過程化SQL在執行時出現異常,則應該讓程序在產生異常的語句處停下來,根據異常的類型去執行異常處理語句
SQL標准對數據庫服務器提供什么樣的異常處理作出了建議,要求過程化SQL管理器提供完善的一次處理機制。 

存儲過程和函數

過程化SQL塊主要有命名塊匿名塊。匿名塊每次執行時都要進行編譯,它不能被存儲到數據庫中,也不能在其他過程化SQL塊中調用。

過程和函數是命名塊,他們被編譯后保存在數據庫中,稱為持久性存儲模塊(PSM),可以 被反復調用,運行速度較快。

存儲過程

存儲過程是由過程化SQL語句書寫的過程,這個過程經編譯和優化后存儲在數據庫服務器中,因此稱它為存儲過程,使用時只要調用即可。

1. 存儲過程的優點

1)由於存儲過程不像解釋執行的SQL語句那樣在提出操作請求時才進行語法分析和優化工作,因而運行效率高它提供了在服務器端快速執行SQL語句的有效途徑
2)存儲過程降低了客戶機和服務器之間的通信量。客戶機上的應用程序只要通過網絡向服務器發出調用存儲過程的名字和參數,就可以讓關系數據庫管理系統執行其中的多條SQL語句並進行數據處理,只有最終的處理結果才返回客戶端
3)方便實施企業規則。可以把企業規則的運算程序寫成存儲過程放入數據庫服務器中,由關系數據庫管理系統管理,既有利於集中控制,又能夠方便地進行維護。當企業規則發生變化時只要修改存儲過程即可,無需修改其他應用程序。

2. 存儲過程的用戶接口

1)創建存儲過程
CREATE OR REPLACE PROCEDURE 過程名([參數1,參數2,,,])   /*存儲過程首部*/
AS <過程化SQL塊>  /*存儲過程體,描述該存儲過程的操作*/

存儲過程包括過程首部過程體,在過程首部,“過程名”是數據庫服務器合法的對象標識;參數列表[參數1,參數2,,,]用名字來標識調用時給出的參數值,必須指定值的數據類型。
過程體是一個<過程化SQL塊>,包括聲明部分和可執行語句部分。

2)執行存儲過程 
CALL/PERFORM PROCEDURE 過程名([參數1,參數2,,,])

使用CALL或者PERFORM等方式激活存儲過程的執行,在過程化SQL中,數據庫服務器支持在過程體中調用其他存儲過程。

3)修改存儲過程
ALTER PROCEDURE 過程名1 RENAME TO 過程名2;(重新命名一個存儲過程)
ALTER PROCEDURE 過程名 COMPILEL;(重新編譯一個存儲過程)
4)刪除存儲過程 
DROP PROCEDURE 過程名();

函數

函數必須指定返回的類型。.

1. 函數的定義語句格式

CREATE OR REPLACE FUNCTION 函數名([參數名1,參數名2,...]) RETURNS<類型> AS <過程化SQL塊>

2、函數的執行語句格式

CALL/SELECT  函數名([參數名1,參數名2,...])

3、修改函數 -- 重命名一個自定義函數 

ALTER FUNCTION 函數名1 RENAME TO 函數名2

4、重新編譯一個函數  

ALTER FUNCTION 函數名 COMPILE;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM