1、PL/SQL概述
1)概念
pl/sql(procedural language)是Oracle在标准sql语言的基础上的扩展,可以实现定义变量、使用逻辑控制语句等
作用:默认oracle一次只能处理一条SQL语句,每条SQL语句都会向服务器发送请求调用,如果使用PL/SQL,一个块中的语句作为一个组,只向服务器发送一次请求调用,减少了网络传输,节省带宽,提高效率,提高安全性
缺点:移值性差,只有oracle中可用
2)组成
pl/sql程序由块组成,由块可组成不同的程序形式,包括:匿名块、存储过程、函数、包、触发器等
3)注释
--单行注释
/*多行注释*/
4)命名
当定义变量时,建议以v_作为前缀:v_name
当定义常量时,建议以c_作为前缀:c_rate
当定义过程时,建议以p_作为前缀
当定义函数时,建议以fun_作为前缀
当定义包时,建议以pac_作为前缀
当定义游标时,建议以cur_作为前缀
当定义例外时,建议以err_作为前缀
2、块block
1)概述
块是pl/sql的基本组成单元,编写pl/sql实际上就是块
块由三部分组成:定义部分、执行部分、异常处理部分(例外处理部分)
定义部分declare:定义变量、常量、复杂数据类型、游标、异常等,可选
执行部分begin:要执行的sql语句或pl/sql语句,必选
异常处理部分exception:用来处理运行时的各种错误,可选
以上为常规基础。。。。。。。。。。。。。。。。开始吧
例1:只包含执行部分的pl/sql块
--打开输出,使pl/sql程序能够输出信息
set serveroutput on;(在Sqlplus中使用,用于打开oracle自带的输出方法dbms_output)
begin
dbms_output.put_line('Hello Oracle!');
end;
注:如果使用工具是类似sqlplus等终端工具以 /结束语句;(如下图)
例2:包含定义部分和执行部分的pl/sql块
定义变量语法:变量名 [constant] 数据类型 [not null]
为变量赋值:变量名:=变量值
注:常量在声明时必须赋初始值
注:常量在声明时必须赋初始值(上图为变量赋值方法)
例3:包含定义部分和执行部分的pl/sql块,使用查询为变量赋值(表数据为Oracle下scott账户自带表)
declare
v_ename varchar2(20);
v_empno number(4);
begin
v_empno:=&请输入雇员编号;
select ename into v_ename from emp where empno=v_empno;
dbms_output.put_line(v_empno||'的姓名:'||v_ename);
end;
注:红色部分为 提示输入数据,会根据使用平台的差异,提示方式不一样,所起到的效果类似于java下的Scanner提示输入。
例4:同时输出指定雇员的姓名和工资(查询多个值)
declare
v_ename varchar2(20);
v_sal number(7,2);
begin
select ename,sal into v_ename,v_sal from emp where empno=&no;
dbms_output.put_line(v_ename||','||v_sal);
end;
注:into只能用于通过查询为变量赋值,对于增删改,需要使用returning into 赋值
例5:插入一个部门,将插入的部门信息显示出来
declare
v_deptno number(4);
v_dname varchar2(20);
v_loc varchar2(30);
begin
insert into dept values (50,'Development','NanJing')
returning deptno,dname,loc into v_deptno,v_dname,v_loc;
dbms_output.put_line('编号:'||v_deptno||',名称:'||v_dname||',位置:'||v_loc);
end;
获取插入值的方法。
例6:包含定义部分、执行部分、异常处理部分的块(异常块处理)
declare
v_ename varchar2(20);
v_sal number(7,2);
begin
select ename,sal into v_ename,v_sal from emp where empno=&no;
dbms_output.put_line(v_ename||','||v_sal);
exception --异常处理
when no_data_found then
dbms_output.put_line('您查找的雇员不存在!');
end;
no_data_found为系统报错原因,根据异常原因,输出特定异常原因。