PL/SQL
来源:互联网 发布:梦里花落知多少txt 编辑:程序博客网 时间:2024/05/08 19:59
PL/SQL(ProcedureLanguage/SQL)
定义:PLSQL是Oracle对sql语言的过程化扩展,指在SQL命令语言中增加了过程处理语句(如分支、循环等),使SQL语言具有过程处理能力。
组成:PL/SQL程序由三个块组成,即声明部分、执行部分、异常处理部分。
PL/SQL块的结构如下:
DECLARE
/* 声明部分: 在此声明PL/SQL用到的变量,类型及游标,以及局部的存储过程和函数 */
BEGIN
/* 执行部分: 过程及SQL 语句 , 即程序的主要部分 */
EXCEPTION
/* 执行异常部分: 错误处理 */
END;
其中执行部分是必须的。
例:输出helloworld
setserveroutput on 默认是不显示结果的,要设置serveroutput后才能显示。
declare
--变量常量的说明
begin
--程序体
dbms_output.put_line('Hello World'); 调用dbms_output程序包的put_line方法进行打印
end;
/ 执行上一个PLSQL
变量的数据类型的定义
变量类型(char,varchar2, date, number, boolean, long) 与创建数据库表的类型一样
例:varl char(15);
married boolean:=true;
psal number(7,2); 基本变量类型
my_name emp.ename%type;
emp_rec emp%rowtype
例1:查询并打印7839的姓名和薪水(引用型变量)
set serveroutput on
declare
pename emp.ename%type; 引用型变量
psal emp.sal%type; 引用型变量
begin
--7839的姓名和薪水
select ename,sal into pename,psalfrom emp where empno=7839;
dbms_output.put_line(pename||'的薪水是'||psal);打印
end;
/
例2:查询并打印7839的姓名和薪水(记录型变量)
set serveroutput on
declare
emp_rec emp%rowtype;
begin
select * into emp_rec from emp whereempno=7839;
dbms_output.put_line(emp_rec.ename ||'的薪水是'||emp_rec.sal);
end;
/
IF语句
三种形式
1、IF 条件 THEN 语句1;
语句2;
END IF;
2、 IF 条件 THEN 语句序列1;
ELSE 语句序列 2;
END IF;
3、 IF 条件 THEN 语句;
ELSIF 语句 THEN 语句;
ELSE 语句;
END IF;
例:判断用户输入的数字
set serveroutput on
accept num prompt '请输入一个数字';
declare
--
--
pnum number := & num;
begin
if pnum=0 then dbms_output.put_line('您输入的是0');
elsif pnum=1 then dbms_output.put_line('您输入的是1');
elsif pnum=2 then dbms_output.put_line('您输入的是2');
else dbms_output.put_line('其他数字');
end if;
end;
/
循环语句
三种形式
1、 WHILE total <= 25000
LOOP
total : = total + salary;
END LOOP;
2、Loop
EXIT [when 条件];
……
End loop
3、FOR I IN 1 . . 3
LOOP
语句序列 ;
END LOOP ;
光标(Cursor)
语法:CURSOR 光标名 [ (参数名 数据类型[,参数名 数据类型]...)]
IS SELECT 语句;
光标的属性:
%isopen: 是否打开
%rowcount: 行数
%notfound: 没有记录
例:cursor c1 is select ename from emp;
打开光标: open c1; (打开光标执行查询)
取一行光标的值:fetch c1 into pjob; (取一行到变量中)
关闭光标: close c1;(关闭游标释放资源)
例:使用游标查询员工姓名和工资,并打印
set serveroutput on
declare
cursor cemp is select ename,sal from emp;
pename emp.ename%type;
psal emp.sal%type;
begin
open cemp;
loop
fetchcemp into pename,psal;
exit when cemp%notfound;
dbms_output.put_line(pename||'的薪水是'||psal);
end loop;
close cemp;
end;
/
例:按员工的工种长工资,总裁1000元,经理长800元其,他人员长400元。
set serveroutput on
declare
cursor cemp is select empno,empjob from emp;
pempno emp.empno%type;
pjob emp.empjob%type;
begin
open cemp;
loop
fetch cemp into pempno,pjob;
exit when cemp%notfound;
if pjob = 'PRESIDENT' then update emp setsal=sal+1000 where empno =pempno;
elsif pjob = 'MANAGER' then update empset sal=sal+800 where empno =pempno;
else update emp set sal=sal+400 whereempno =pempno;
end if;
end loop;
close cemp;
commit;
dbms_output.put_line('涨工资完成');
end;
/
带参数的光标
例:查询某个部门的员工姓名
set serveroutput on
declare
--带参数的光标
cursor cemp(dno number) isselect ename from emp where deptno=dno;
pename emp.ename%type;
begin
open cemp(20);
loop
fetch cemp into pename;
exitwhen cemp%notfound;
dbms_output.put_line(pename);
end loop;
close cemp;
end;
/
例外(异常)
例外是程序设计语言提供的一种功能,用来增强程序的健壮性和容错性。
面试题:用语言表述一下java中的异常处理机制
答:java中的异常采用父类处理机制,这里的父类不是继承关系,在A类调用B类的时候,A类就是B类的父类,在B类中没有处理的异常(处理了就trycatch了)就交给A类来处理(抛了)。如果A还不处理就再次向A的父类抛,如果所有的类都没有处理,那么就将异常交给虚拟机来处理。之后打印出了错误信息。
oracle的例外分类
系统定义的例外
No_data_found (没有找到数据)
Too_many_rows (select …into语句匹配多个行)
Zero_Divide (被零除)
Value_error (算术或转换错误)
Timeout_on_resource (在等待资源时发生超时)
用户定义的例外
例:被0除例外
set serveroutput on
declare
pnum number;
begin
pnum := 1/0;
exception
when Zero_Divide then dbms_output.put_line('1:0不能做被除数');
dbms_output.put_line('2:0不能做被除数');
when Value_error then dbms_output.put_line('算术或转换错误');
when others then dbms_output.put_line('其他例外');
end;
/
例:自定义例外—查询50号部门的员工姓名(如果没有找到,抛出例外)
set serveroutput on
declare
--自定义例外
no_emp_found exception;
cursor cemp is select ename from emp wheredeptno=50;
pename emp.ename%type;
begin
open cemp;
fetch cemp into pename;
if cemp%notfound then
--抛出例外
raise no_emp_found;
end if;
close cemp;
exception
when no_emp_found then dbms_output.put_line('没有找到员工');
when others then dbms_output.put_line('其他例外');
end;
- PL SQL
- pl/sql
- pl/sql
- PL/SQL
- pl/sql
- PL SQL
- PL/SQL
- PL/SQL
- pl/sql
- PL SQL
- PL/SQL
- PL/SQL
- pl/sql
- pl/sql
- PL/SQL
- PL/SQL
- PL/SQL
- pl/sql
- objective-c
- Android Activity和Intent机制学习笔记
- 面试题-java接口和抽象类的区别
- ios 重用UITableViewCell created from a XIB
- 大型网站系统架构分析
- PL/SQL
- Apache组件commons的BeanUtils的一个bug[待定]
- Android 计时与倒计时
- “为硬件保留的内存“过大
- 重建oracle 11g的em命令
- spket插件的安装与使用完整图文版
- opengl中main函数的内容
- S5PC100 串口配置
- 免安装执行mysql,并且导入数据库(Linux)