PL/SQL
- PL/SQL是Oracle在关系数据库结构化查询语言SQL基础上扩展得到的一种过程化查询语言。
- SQL与编程语言之间的不同在于,SQL没有变量,SQL没有流程控制(分支,循环)。而PL/SQL是结构化的和过程化的结合体,而且最为重要的是,在用户执行多条SQL语句时,每条SQL语句都是逐一的发送给数据库,而PL/SQL可以一次性将多条SQL语句一起发送给数据库,减少网络流量
SQL执行 |
PL/SQL执行 |
|
|
- 匿名Pl/SQL块
- – 动态构造,只能执行一次
- 一次性完成,没有名字
- 存储过程,函数,触发器
- 给它一个名字,保存到数据库,可以反复使用,调用.
- – 存储在数据库中编译过的代码,可以反复执行。
PL/SQL语法结构
语法:
DECLARE -- 声明部分,例如:定义变量、常量、游标。 BEGIN -- 程序编写、SQL语句 EXECTPION -- 处理异常 END ; / |
说明:
声明部分(DECLARE) |
包含变量定义、用户定义的PL/SQL类型、游标、引用的函数或过程; |
执行部分(BEGIN) |
包含变量赋值、对象初始化、条件结构、迭代结构、嵌套的PL/SQL匿名块,或是对局部或存储PL/SQL命名块的调用; |
异常部分(EXCEPTION) |
包含错误处理语句,该语句可以像执行部分一样使用所有项; |
结束部分(END) |
程序执行到END表示结束,分号用于结束匿名块,而正斜杠(/)执行块程序; |
默认情况下系统输出显示被关闭的,需要设定 SET SERVEROUTPUT ON
匿名Pl/SQL块
– 动态构造,只能执行一次
一次性完成,没有名字
范例
编写不做任何工作的PL/SQL块 |
BEGIN NULL ; END ; / |
最简单的循环PL/SQL匿名块,null表示什么也没干 |
BEGIN for i in 1..10 loop null; end loop; END; / |
编写HELLO WORD |
SQL> BEGIN 2 DBMS_OUTPUT.put_line(‘HELLO,WENDY‘); 3 END; 4 / HELLO,WENDY PL/SQL procedure successfully completed. |
匿名PL/SQL块,循环显示2遍HELLOW,WENDY |
BEGIN For I in 1..2 loop DBMS_OUTPUT.put_line(‘HELLO,WENDY‘); End loop; END; / |
匿名PL/SQL块,循环插入数据 SQL> insert into t select rownum,‘x‘ from dba_objects where rownum<101; 能用SQL解决的就不要用PL/SQL PL/SQL会消耗资源,效率很低 |
BEGIN for i in 1..100 loop insert into t values(i,‘w‘); end loop; END; / |
编写一个简单的PL/SQL程序 := 为变量复制 |
DECLARE v_num NUMBER ; -- 定义一个变量v_num BEGIN v_num := 30 ; -- 设置v_num的内容 DBMS_OUTPUT.put_line(‘V_NUM变量的内容是:‘ || v_num) ; END ; / |
编写PL/SQL块,输入一个雇员编号,而后取得指定的雇员姓名 |
DECLARE v_eno NUMBER ; v_ename VARCHAR2(10) ; BEGIN v_eno := &empno ; -- 由键盘输入雇员编号 SELECT ename INTO v_ename FROM emp WHERE empno=v_eno ; DBMS_OUTPUT.put_line(‘编号为:‘ || v_eno || ‘雇员的名字为:‘|| v_ename) ; END ; / |