Oracle 原理: PL/SQL基础
一、PL/SQL 功能和特點
?PL/SQL 是過程語言(Procedural Language)和結構化查詢(SQL)語言結合而成的編程語言;PL/SQL是SQL的擴展,支持大對象、集合類型。還可以給SQL語言增加程序邏輯。支持SQL,在PL/SQL種可以使用:數據操縱命令、事物控制命令、游標控制、SQL函數和SQL運算符。PL/SQL有更佳的性能,當用戶把PL/SQL塊發送到服務器端,由Oracle服務器端編譯、運行、再把結果返回給用戶,可以移植性,可執行在任何操作系統上。PL/SQL可以通過存儲過程限制對用戶的訪問來提高安全性。
? Oracle服務器中有PL/SQL引擎 和 SQL引擎 ,PL/SQL引擎執行 for ,if 等過程語句 , 而SQL引擎執行 insert、delete等SQL語句
PL/SQL分為三個部分,聲明部分、可執行部分、異常處理部分,其中可執行部分是必須要有的。
DECLARE --聲明變量在這里寫 BEGIN --過程程序在這里寫 EXCEPTION --異常處理在這里寫 END;?
二、Oracle 11g的PL/SQL對序列的改進,即無dual序列的使用
----創建一個序列 seq ---- create sequence seq start with 1 increment by 1; ----SQL語句的序列取值必須用select ----- select seq.nextval from dual ; ----過程語句不需要select 也可以進行序列取值 declare se positive ; --正整數 beginse :=seq.nextval ;-- select seq.nextval into se from dual ;dbms_output.put_line(se); end; / drop sequence seq;三、控制語句和continue語句
條件判斷語句: if ..then? ? ;? ? if..then..else; if..then.elsif..;? ?case? 語句;
循環語句: Loop? [無條件循環內容?]?end loop ;? ? while [循環條件] loop [循環內容] end loop;? ?
? ? ? ? ? ? ? ? ? for [循環體變量]?in [循環體變量的取值范圍]? loop? [循環內容]? end loop;
注: Loop? [無條件循環內容?]?end loop 通常和exit搭配,相當于JAVA的break ,如果沒有控制語句搭配,相當于無限循環。
? ? ?continue; 直接進入下一個循環;
?
在PL過程語句中是不能使用DDL語句的,即create、drop、truncate等操作。想要用DDL語句必須用動態SQL執行:
execute immediate sql_command [into 執行結果集][using 綁定變量集?]
---可重跑的SQL腳本:創建并初始化表示例------ 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,'部門'||Mod(i,50),100+sqrt(i),'雇傭者'||Mod(i,20)); if Mod(i,1000)=0 then commit;end if;end loop;commit; end; /---goto 語句示例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,'部門'||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 中的錯誤處理
異常分為預定義異常和用戶自定義異常。預定義異常就是系統自帶的異常,而用戶自定義異常(raise)是自己聲明的相當于java的throw。
預定義異常? exception? when [異常名] then ... when [異常名2 ] then ...??
raise_application_error (異常編號,異常信息)? 即異常中斷程序并輸出異常信息
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; /在輸出結果中顯示
總結
以上是生活随笔為你收集整理的Oracle 原理: PL/SQL基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle原理: 归档方式和日志文件
- 下一篇: Oracle 原理:DML触发器和数据库