Oracle中的pl/sql

前端之家收集整理的这篇文章主要介绍了Oracle中的pl/sql前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

什么是pl/sql

pl/sql是一种编程语言,是oracle对sql语句的扩展。在普通sql语句的使用上增加了编程语言的特点,所以PL/sql就是把数据操作和查询语句组织在PL/sql代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算的程序语言。


PL/sql的作用

使用PL/sql可以编写具有很多高级功能的程序,虽然通过多个sql语句可能也能实现同样的功能,但是相比而言,PL/sql具有更为明显的一些优点:

⒈能够使一组sql语句的功能更具模块化程序特点;

⒉采用了过程性语言控制程序的结构;

⒊可以对程序中的错误进行自动处理,使程序能够在遇到错误的时候不会被中断;

⒋具有较好的可移植性,可以移植到另一个Oracle数据库

集成在数据库中,调用更快;

减少了网络的交互,有助于提高程序性能


PL/sql程序的基本结构

块由四个基本部分组成:声明、执行体开始、异常处理、执行体结束

下面是四个部分的基本结构:

DECLARE—— 可选部分

变量常量游标、用户定义异常的声明

……

BEGIN—— 必要部分

sql语句和语句构成的执行程序

EXCEPTION—— 程序出现异常时,捕捉异常并处理异常

END——必须部分

数据库执行 PL/sql 程序时, 语句和 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;

4.全局变量

VARIABLE变量名数据类型;

不能在sql window中写要在Command window中或者黑窗口展示

用法:VAR[IABLE] [ <variable> [ 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;

<<f_label>>

dbms_output.put_line('哈哈');

<<s_label>>

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) 原文链接:https://www.f2er.com/oracle/212053.html

猜你在找的Oracle相关文章