Oracle 原理: PL/SQL基础
一、PL/SQL 功能和特點(diǎn)
?PL/SQL 是過(guò)程語(yǔ)言(Procedural Language)和結(jié)構(gòu)化查詢(xún)(SQL)語(yǔ)言結(jié)合而成的編程語(yǔ)言;PL/SQL是SQL的擴(kuò)展,支持大對(duì)象、集合類(lèi)型。還可以給SQL語(yǔ)言增加程序邏輯。支持SQL,在PL/SQL種可以使用:數(shù)據(jù)操縱命令、事物控制命令、游標(biāo)控制、SQL函數(shù)和SQL運(yùn)算符。PL/SQL有更佳的性能,當(dāng)用戶(hù)把PL/SQL塊發(fā)送到服務(wù)器端,由Oracle服務(wù)器端編譯、運(yùn)行、再把結(jié)果返回給用戶(hù),可以移植性,可執(zhí)行在任何操作系統(tǒng)上。PL/SQL可以通過(guò)存儲(chǔ)過(guò)程限制對(duì)用戶(hù)的訪問(wèn)來(lái)提高安全性。
? Oracle服務(wù)器中有PL/SQL引擎 和 SQL引擎 ,PL/SQL引擎執(zhí)行 for ,if 等過(guò)程語(yǔ)句 , 而SQL引擎執(zhí)行 insert、delete等SQL語(yǔ)句
PL/SQL分為三個(gè)部分,聲明部分、可執(zhí)行部分、異常處理部分,其中可執(zhí)行部分是必須要有的。
DECLARE --聲明變量在這里寫(xiě) BEGIN --過(guò)程程序在這里寫(xiě) EXCEPTION --異常處理在這里寫(xiě) END;?
二、Oracle 11g的PL/SQL對(duì)序列的改進(jìn),即無(wú)dual序列的使用
----創(chuàng)建一個(gè)序列 seq ---- create sequence seq start with 1 increment by 1; ----SQL語(yǔ)句的序列取值必須用select ----- select seq.nextval from dual ; ----過(guò)程語(yǔ)句不需要select 也可以進(jìn)行序列取值 declare se positive ; --正整數(shù) beginse :=seq.nextval ;-- select seq.nextval into se from dual ;dbms_output.put_line(se); end; / drop sequence seq;三、控制語(yǔ)句和continue語(yǔ)句
條件判斷語(yǔ)句: if ..then? ? ;? ? if..then..else; if..then.elsif..;? ?case? 語(yǔ)句;
循環(huán)語(yǔ)句: Loop? [無(wú)條件循環(huán)內(nèi)容?]?end loop ;? ? while [循環(huán)條件] loop [循環(huán)內(nèi)容] end loop;? ?
? ? ? ? ? ? ? ? ? for [循環(huán)體變量]?in [循環(huán)體變量的取值范圍]? loop? [循環(huán)內(nèi)容]? end loop;
注: Loop? [無(wú)條件循環(huán)內(nèi)容?]?end loop 通常和exit搭配,相當(dāng)于JAVA的break ,如果沒(méi)有控制語(yǔ)句搭配,相當(dāng)于無(wú)限循環(huán)。
? ? ?continue; 直接進(jìn)入下一個(gè)循環(huán);
?
在PL過(guò)程語(yǔ)句中是不能使用DDL語(yǔ)句的,即create、drop、truncate等操作。想要用DDL語(yǔ)句必須用動(dòng)態(tài)SQL執(zhí)行:
execute immediate sql_command [into 執(zhí)行結(jié)果集][using 綁定變量集?]
---可重跑的SQL腳本:創(chuàng)建并初始化表示例------ declaresql_command varchar2(500);isExsit number ; beginselect count(1) into isExsit from user_tables where table_name ='SALARY_TBL'; if isExsit <> 0 then sql_command :='truncate table salary_tbl';execute immediate sql_command;sql_command :='drop table salary_tbl';execute immediate sql_command;end if;sql_command := ' create table salary_tbl(employer_nm varchar(20),department varchar(20) not null,salary number not null,leader_nm varchar(20) )';execute immediate sql_command;for i in 1..13000loopinsert into salary_tbl values('雇傭者'||i,'部門(mén)'||Mod(i,50),100+sqrt(i),'雇傭者'||Mod(i,20)); if Mod(i,1000)=0 then commit;end if;end loop;commit; end; /---goto 語(yǔ)句示例declaresql_command varchar2(500);isExsit number ;i number := 1; beginselect count(1) into isExsit from user_tables where table_name ='SALARY_TBL'; if isExsit <> 0 then sql_command :='truncate table salary_tbl';execute immediate sql_command;sql_command :='drop table salary_tbl';execute immediate sql_command;end if; sql_command := ' create table salary_tbl(employer_nm varchar(20),department varchar(20) not null,salary number not null,leader_nm varchar(20) )';execute immediate sql_command;<<code_aa>> -insert into salary_tbl values('雇傭者'||i,'部門(mén)'||Mod(i,50),100+sqrt(i),'雇傭者'||Mod(i,20)); if Mod(i,1000)=0 then commit;end if;i :=i+1;if i <13000 then goto code_bb;else goto code_aa;end if ; <<code_bb>> commit; end; /?
四,Oracle11g 中的錯(cuò)誤處理
異常分為預(yù)定義異常和用戶(hù)自定義異常。預(yù)定義異常就是系統(tǒng)自帶的異常,而用戶(hù)自定義異常(raise)是自己聲明的相當(dāng)于java的throw。
預(yù)定義異常? exception? when [異常名] then ... when [異常名2 ] then ...??
raise_application_error (異常編號(hào),異常信息)? 即異常中斷程序并輸出異常信息
declare department varchar(20) := '';nullinserterror1 exception; beginif department is null thenraise nullinserterror1;end if;insert into salary_tbl values('雇傭者9999',department,100,'雇傭者4'); exception when nullinserterror1 thendbms_output.put_line('自定義空值插入異常');raise_application_error (-20001,'空值異常'); end; /在輸出結(jié)果中顯示
總結(jié)
以上是生活随笔為你收集整理的Oracle 原理: PL/SQL基础的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Oracle原理: 归档方式和日志文件
- 下一篇: Oracle 原理: 数据类型