PL/SQL動(dòng)態(tài)執(zhí)行DDL語(yǔ)句
PL/SQL程序中可以執(zhí)行DML語(yǔ)句和事物控制等語(yǔ)句,如經(jīng)常用到selectinto進(jìn)行但賦值語(yǔ)句,但是直接執(zhí)行DDL語(yǔ)句(createtable等操作)是不可以的,但是可以通過(guò)動(dòng)態(tài)SQL語(yǔ)句執(zhí)行,間接到達(dá)執(zhí)行DDL操作的目的。
PL/SQL程序是通過(guò)PL/SQL執(zhí)行時(shí),把SQL語(yǔ)句當(dāng)做字符串的形式傳給動(dòng)態(tài)SQL執(zhí)行語(yǔ)句執(zhí)行。動(dòng)態(tài)SQL語(yǔ)句的寫(xiě)法如下:
EXECUTEIMMEDIATE動(dòng)態(tài)SQL語(yǔ)句
[into變量列表]
[using參數(shù)列表]
語(yǔ)法解析:
如果動(dòng)態(tài)SQL語(yǔ)句是SELECT語(yǔ)句,可以把查詢的結(jié)果保存到INTO后面的變量中。如果動(dòng)態(tài)語(yǔ)句中存在參數(shù),USING為SQL語(yǔ)句中的參數(shù)傳值。動(dòng)態(tài)SQL中的參數(shù)格式是:[:參數(shù)名],參數(shù)在運(yùn)行時(shí)需要使用USING傳值。下面我們通過(guò)案例代碼分析動(dòng)態(tài)SQL語(yǔ)句的寫(xiě)法。
案例1、利用動(dòng)態(tài)語(yǔ)句創(chuàng)建學(xué)生信息表的備份表(stuinfo_201812):
declaresql_yjvarchar(500);--動(dòng)態(tài)SQL執(zhí)行的語(yǔ)句beginsql_yj:='createtableSTUINFO_201812(stuidVARCHAr2(11),stunameVARCHAr2(50),sexCHAr(1),ageNUMBER(2),classnoVARCHAr2(7),stuaddressVARCHAr2(100),gradeCHAr(4),enroldateDATE,idnumberVARCHAr2(18))';
--利用動(dòng)態(tài)語(yǔ)句創(chuàng)建學(xué)生備份表(stuinfo_201812)
executeimmediatesql_yj;
end;
結(jié)果如下:
案例2、給備份表插入一個(gè)學(xué)生信息,代碼如下:
declaresql_yjvarchar(500);--動(dòng)態(tài)SQL執(zhí)行的語(yǔ)句ls_stuidVARCHAr2(11);ls_stunameVARCHAr2(50);ls_sexCHAr(1);ls_ageNUMBER(2);begin
--查詢出學(xué)生信息表中學(xué)生"張三豐"的基本信息
selectt.stuid,t.stuname,t.sex,t.ageintols_stuid,ls_stuname,ls_sex,ls_agefromstuinfotwheret.stuid='SC201801006';
--利用動(dòng)態(tài)語(yǔ)句執(zhí)行插入操作,插入“張三豐”的信息
sql_yj:='insertintostuinfo_201812values(:1,:2,:3,:4,null,null,null,null,null)';executeimmediatesql_yjusingls_stuid,ls_stuname,ls_sex,ls_age;
end;
結(jié)果如下:
案例3、利用動(dòng)態(tài)SQL語(yǔ)句查詢出剛剛插入的學(xué)生信息:
declare
sql_yjvarchar(500);--動(dòng)態(tài)SQL執(zhí)行的語(yǔ)句
ls_stuinfostuinfo%rowtype;
ls_stuidVARCHAr2(11);
ls_stunameVARCHAr2(50);
ls_sexCHAr(1);
ls_ageNUMBER(2);
begin
--查詢出學(xué)生信息表中學(xué)生"張三豐"的基本信息
selectt.stuid,t.stuname,t.sex,t.age
intols_stuid,ls_stuname,ls_sex,ls_age
fromstuinfot
wheret.stuid='SC201801006';
--利用動(dòng)態(tài)語(yǔ)句查詢獲取"張三豐"的信息
sql_yj:='select*fromstuinfo_201812wherestuid=:1';
executeimmediatesql_yjintols_stuinfousingls_stuid;
dbms_output.put_line('學(xué)號(hào):'||ls_stuinfo.stuid||'姓名:'
||ls_stuinfo.stuname||'性別:'||ls_stuinfo.sex||'年齡:'||ls_stuinfo.age);
end;
結(jié)果如下:
總結(jié):PL/SQL動(dòng)態(tài)執(zhí)行SQL語(yǔ)句,是先進(jìn)行解析編譯后,執(zhí)行后再傳入?yún)?shù)進(jìn)行執(zhí)行,因此,動(dòng)態(tài)SQL有一個(gè)優(yōu)勢(shì)就是綁定變量,只需一次解析,假如是一個(gè)SQL操作where條件后的值經(jīng)常變換,而且經(jīng)常用到,可以考慮使用Oracle動(dòng)態(tài)執(zhí)行SQL。因?yàn)?,Oracle中SQL語(yǔ)句是通過(guò)SGA共享池進(jìn)行緩存的,下次再次執(zhí)行該SQL語(yǔ)句,直接從緩存當(dāng)中取出,提高執(zhí)行效率,減少Oracle數(shù)據(jù)庫(kù)負(fù)擔(dān),不然,隨著每次變量值的不同,Oracle把他當(dāng)作不同的SQL語(yǔ)句,進(jìn)行再次預(yù)解析,會(huì)大大加大數(shù)據(jù)庫(kù)負(fù)擔(dān)。
以上就是深圳達(dá)內(nèi)教育java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“Java數(shù)據(jù)庫(kù)編程視頻,Oracle動(dòng)態(tài)執(zhí)行SQL語(yǔ)句”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專(zhuān)業(yè)老師隨時(shí)為你服務(wù)。
Java數(shù)據(jù)庫(kù)免費(fèi)視頻教程
老杜最新MySQL教程:http://www.bjpowernode.com/javavideo/111.html
老杜最新JDBC教程:http://www.bjpowernode.com/javavideo/112.html
Java視頻