什么是pl/sql
pl/sql是一种编程语言,是oracle对sql语句的扩展。在普通语句的使用上增加了编程语言的特点,所以PL/sql就是把数据操作和查询语句组织在PL/sql代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算的程序语言。
PL/sql的作用
使用PL/sql可以编写具有很多高级功能的程序,虽然通过多个sql语句可能也能实现同样的功能,但是相比而言,PL/sql具有更为明显的一些优点:
⒈能够使一组sql语句的功能更具模块化程序特点;
⒉采用了过程性语言控制程序的结构;
⒊可以对程序中的错误进行自动处理,使程序能够在遇到错误的时候不会被中断;
⒋具有较好的可移植性,可以移植到另一个Oracle数据库中;
⒌集成在数据库中,调用更快;
⒍减少了网络的交互,有助于提高程序性能。
PL/sql程序的基本结构
块由四个基本部分组成:声明、执行体开始、、执行体结束。
下面是四个部分的基本结构:
DECLARE——可选部分
变量、常量、游标、用户定义异常的声明
……
BEGIN——必要部分
语句和语句构成的执行程序
EXCEPTION——程序出现异常时,捕捉异常并处理异常
END;——必须部分
在数据库执行
PL/sql
程序时,
语句和
语句是分别进行解析和执行的。
块被数据库内部的
引擎提取,将
语句取出送给
Oracle
的
引擎处理,两种语句分别在两种引擎中分析处理,在数据库内部完成数据交互、处理过程。
变量:
1.普通变量*v_i varchar2(20);
2.列变量*v_cos student.stu_name%type;
3.记录(行)变量*v_row student%rowtype;
declare
v_stut_student%rowtype;
begin
select * into v_stu fromt_studentwhere sid = 1207;
dbms_output.put_line(v_stu.sname);
end;
VARIABLE变量名数据类型;
不能在sql window中写要在Command window中或者黑窗口展示
:VAR[IABLE] [ [ NUMBER |CHAR | CHAR (n [CHAR|BYTE]) |
VARCHAR2 (n [CHAR|BYTE]) |NCHAR | NCHAR (n) |
NVARCHAR2 (n) | CLOB |NCLOB | REFCURSOR |
BINARY_FLOAT |BINARY_DOUBLE ] ]
variable v_all varchar2;
begin
:v_all:=:v_all||'~abc';
dbms_output.put_line(:v_all);
end;5.表一位数组变量
type类型名字is table of类型index bybinary_integer;
引用名字;
declare
type t_table is table ofvarchar2(20)index by binary_integer;
(typet_abcis table oft_student.sid%typeindex by binary_integer;)
v_tablet_table;
begin
v_table(1):='abc';
v_table(2):='def';
v_table(3):='lll';
v_table(4):='kkk';
dbms_output.put_line(v_table(2));
end
;
条件控制
:单分支结构、双分支、多分支结构
单分支结构
IF条件 THEN
--条件结构体
END IF;
说明:
① 用IF 关键字开始,END IF关键字结束,注意END IF后面有一个分号。
② 条件部分可以不使用括号,但是必须以关键字THEN来标识条件结束,如果条件成
立,则执行THEN后到对应END IF之间的语句块内容。如果条件不成立,则不执行
条件语句块的内容。
③ java结构用一对大括号来包含条件结构体的内容。PL/sql中关键字THEN到ENDIF之
间的内容是条件结构体内容。
④ 条件可以使用关系运算符合逻辑运算符。
双分支
IF条件 THEN
--条件成立结构体
ELSE
--条件不成立结构体
END IF;
多分支结构
IF条件1 THEN
--条件1成立结构体
ELSIF条件2 THEN
--条件2成立结构体
ELSE
--以上条件都不成立结构体
END IF;
或:
CASE [selector]
WHEN表达式1 THEN语句序列1;
WHEN表达式2 THEN语句序列2;
WHEN表达式3 THEN语句序列3;
……
[ELSE语句序列N];
END CASE;
或
CASE
WHEN判断1 THEN语句序列1;
WHEN判断2 THEN语句序列2;
WHEN判断3 THEN语句序列3;
……
[ELSE语句序列N];
END CASE;
循环结构
PL/sql提供了丰富的循环结构来重复执行一些列语句。Oracle提供的循环类型有:
1.无条件循环LOOP-ENDLOOP语句
LOOP
--循环体
(exit when ***; if *** then exid;)
END LOOP;
2. WHILE循环语句
WHILE 条件 LOOP
--循环体
END LOOP;
3.FOR循环语句
FOR循环变量 IN [REVERSE]循环下限..循环上限 LOOP LOOP
--循环体
END LOOP;
在上面的三类循环中EXIT用来强制结束循环,相当于java循环中的break。
例:使用loop:计算1到100的和;
declare
v_i binary_integer := 1;
v_sum binary_integer := 0;
begin
loop
v_sum := v_sum + v_i;
v_i := v_i + 1;
if v_i = 101 then
exit;
end if;
end loop;
dbms_output.put_line(v_sum);
end;
使用while
declare
v_i binary_integer := 1;
v_sum binary_integer := 0;
begin
while v_i <= 50 loop
v_sum := v_sum + v_i;
v_i := v_i + 1;
end loop;
dbms_output.put_line(v_sum);
end;
使用for
declare
v_i binary_integer := 1;
v_sum binary_integer := 0;
begin
for v_i in 1..100loop
v_sum := v_sum + v_i;
end loop;
dbms_output.put_line(v_sum);
end
;
顺序结构
在程序顺序结构中有两个特殊的语句。GOTO和NULL
GOTO语句
GOTO语句将无条件的跳转到标签指定的语句去执行。标签是用双尖括号括起来的标示
符,在PL/sql块中必须具有唯一的名称,标签后必须紧跟可执行语句或者PL/sql块。
GOTO不能跳转到IF语句、CASE语句、LOOP语句、或者子块中。
NULL语句
NULL语句什么都不做,只是将控制权转到下一行语句。NULL语句是可执行语句。NULL
语句在IF或者其他语句语法要求至少需要一条可执行语句,但又不需要具体操作的地
方。比如GOTO的目标地方不需要执行任何语句时。
declare
v_i number := 10;
begin
if v_i > 5 then
goto f_label;
else
goto s_label;
end if;
<>
dbms_output.put_line('哈哈');
<>
null
执行ddl语句
begin
execute immediate 'createtable T(id number)';
end;
PL/sql的异常处理
BEGIN
--可执行部分
EXCEPTION--异常处理开始
WHEN异常名1 THEN
--对应异常处理
WHEN异常名2 THEN
--对应异常处理
……
WHEN OTHERS THEN
--其他异常处理
END;
declare
v_i number;
begin
select sid into v_i fromt_studentwhere sename ='Orange';
exception
whenno_data_found then
dbms_output.put_line('哈哈');
end;
declare
v_inumber;
begin
v_i := 10/0;
exception
whenno_data_found then
dbms_output.put_line('哈哈');
when others then
dbms_output.put_line('ok');
end
;
注意:
Set serveroutputon(显示输出)
/ 可以执行前一次的sql语句
begin
dbms_output.put_line('hello world!');
end;
dbms_output.put('hello world!');
这句后面必须有dbms_output.put_line
(
'hello world!'
);
才会输出put中的内容(必须有put_line)
总结
以上是编程之家为你收集整理的Oracle中的pl/sql全部内容,希望文章能够帮你解决Oracle中的pl/sql所遇到的程序开发问题。
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。