軟件測試數據庫中基于Oracle的高性能動(dòng)態(tài)SQL程序開(kāi)發(fā)
1. 靜態(tài)SQLSQL與動(dòng)態(tài)SQL
Oracle編譯PL/SQL程序塊分為兩個(gè)種:其一為前期聯(lián)編(early binding),即SQL語(yǔ)句在程序編譯期間就已經(jīng)確定,大多數的編譯情況屬于這種類(lèi)型;另外一種是后期聯(lián)編(late binding),即SQL語(yǔ)句只有在運行階段才能建立,例如當查詢(xún)條件為用戶(hù)輸入時(shí),那么Oracle的SQL引擎就無(wú)法在編譯期對該程序語(yǔ)句進(jìn)行確定,只能在用戶(hù)輸入一定的查詢(xún)條件后才能提交給SQL引擎進(jìn)行處理。通常,靜態(tài)SQL采用前一種編譯方式,而動(dòng)態(tài)SQL采用后一種編譯方式。
本文主要就動(dòng)態(tài)SQL的開(kāi)發(fā)進(jìn)行討論,并在最后給出一些實(shí)際開(kāi)發(fā)的技巧。
2. 動(dòng)態(tài)SQL程序開(kāi)發(fā)
理解了動(dòng)態(tài)SQL編譯的原理,也就掌握了其基本的開(kāi)發(fā)思想。動(dòng)態(tài)SQL既然是一種”不確定”的SQL,那其執行就有其相應的特點(diǎn)。Oracle中提供了Execute immediate語(yǔ)句來(lái)執行動(dòng)態(tài)SQL,語(yǔ)法如下:
Excute immediate 動(dòng)態(tài)SQL語(yǔ)句 using 綁定參數列表 returning into 輸出參數列表;
對這一語(yǔ)句作如下說(shuō)明:
1) 動(dòng)態(tài)SQL是指DDL和不確定的DML(即帶參數的DML)
2) 綁定參數列表為輸入參數列表,即其類(lèi)型為in類(lèi)型,在運行時(shí)刻與動(dòng)態(tài)SQL語(yǔ)句中的參數(實(shí)際上占位符,可以理解為函數里面的形式參數)進(jìn)行綁定。
3) 輸出參數列表為動(dòng)態(tài)SQL語(yǔ)句執行后返回的參數列表。
4) 由于動(dòng)態(tài)SQL是在運行時(shí)刻進(jìn)行確定的,所以相對于靜態(tài)而言,其更多的會(huì )損失一些系統性能來(lái)?yè)Q取其靈活性。
為了更好的說(shuō)明其開(kāi)發(fā)的過(guò)程,下面列舉一個(gè)實(shí)例:
設數據庫的emp表,其數據為如下:

要求:
1.創(chuàng )建該表并輸入相應的數據。
2.根據特定ID可以查詢(xún)到其姓名和薪水的信息。
3.根據大于特定的薪水的查詢(xún)相應的員工信息。
根據前面的要求,可以分別創(chuàng )建三個(gè)過(guò)程(均使用動(dòng)態(tài)SQL)來(lái)實(shí)現:
過(guò)程一:
create or replace procedure create_table as begin execute immediate ' create table emp(id number, name varchar2(10) salary number; )'; --動(dòng)態(tài)SQL為DDL語(yǔ)句 insert into emp values (100,'jacky',5600); insert into emp values (101,'rose',3000); insert into emp values (102,'john',4500); end create_table; |
過(guò)程二:
create or replace procedure find_info(p_id number) as v_name varchar2(10); v_salary number; begin execute immediate ' select name,salary from emp where id=:1' using p_id returning into v_name,v_salary; --動(dòng)態(tài)SQL為查詢(xún)語(yǔ)句 dbms_output.put_line(v_name ||'的收入為:'||to_char(v_salary)); exception when others then dbms_output.put_line('找不到相應數據'); end find_info; |
文章來(lái)源于領(lǐng)測軟件測試網(wǎng) http://kjueaiud.com/