*****************************************
PLSQL异常处理
*****************************************
1、声明异常
异常名 EXCEPTION;
2、抛出异常
RAISE 异常名
3、处理异常
抛出异常后的逻辑代码不会被继续执行
异常的定义使用
―――――――――――――――――――――――――――――――――――――
begin
dbms_output.put_line(1/0);
exception
when others then
dbms_output.put_line('error');
end;
declare
v_val number;
v_ename varchar2(20);
begin
select SAL,ename into v_val,v_ename from emp where EMPNO=&aa;
dbms_output.put_line( v_ename||'的工资是:'||v_val);
exception
when no_data_found then
dbms_output.put_line('您输入的工号有误!');
end;
下面一个例子是程序员自己手动往外抛异常信息,raise,sqlcode,sqlerrm为关键字。
declare
e_myException exception;
begin
dbms_output.put_line('hello');
raise e_myException; --raise手动抛出异常,用此关键字,抛出后转到自定义的e_myException ,执行其里面的putline函数后,再跳到end处,结束PL/SQL块,raise接下面的2句不会继续执行。
dbms_output.put_line('world');
dbms_output.put_line(1/0);
exception
when e_myException then
dbms_output.put_line(sqlcode); --当前会话执行状态,错误编码
dbms_output.put_line(sqlerrm); --当前错误信息
dbms_output.put_line('my error');
when others then
dbms_output.put_line('error');
end;
―――――――――――――――――――――――――――――――――――――
*****************************************
PLSQL复合类型
*****************************************
记录类型record
record类型最常用,声明的时候可以加not null,但必须给初始值,如果record类型一致可以相互赋值,如果类型不同,里面的字段恰好相同,不能互相赋值。引用记录型变量的方法是“记录变量名.基本类型变量名”。
―――――――――――――――――――――――――――――――――――――
declare
type t_first is record(
id number(3),
name varchar2(20)
);
v_first t_first;
begin
v_first.id:=1;
v_first.name:='cheng';
dbms_output.put_line(v_first.id);
dbms_output.put_line(v_first.name);
end;
record类型变量间赋值
declare
type t_first is record(
id number,
name varchar2(20)
);
v_first t_first;
v_second t_first;
begin
v_first.id:=1;
v_first.name:='susu';
v_second:=v_first;--相互赋值
v_first.id:=2;
v_first.name:='kettas';
dbms_output.put_line(v_first.id);
dbms_output.put_line(v_first.name);
dbms_output.put_line(v_second.id);
dbms_output.put_line(v_second.name);
end;
―――――――――――――――――――――――――――――――――――――
表类型变量table
语法如下:
type 表类型 is table of 类型 index by binary_integer;
表变量名 表类型;
类型可以是前面的类型定义,index by binary_integer子句代表以符号整数为索引,这样访问表类型变量中的数据方法就是“表变量名(索引符号整数)”。table类型,相当于java中的Map容器,就是一个可变长的数组,key(符号整数索引)必须是整数,可以是负数,value(类型)可以是标量,也可以是record类型。可以不按顺序赋值,但必须先赋值后使用。
1. 定义一维表类型变量
―――――――――――――――――――――――――――――――――――――
declare
type t_tb is table of varchar2(20) index by binary_integer;
v_tb t_tb;
begin
v_tb(100):='hello';
v_tb(98):='world';
dbms_output.put_line(v_tb(100));
dbms_output.put_line(v_tb(98));
end;
类型为record的表类型变量
declare
type t_rd is record(id number,name varchar2(20));
type t_tb is table of t_rd index by binary_integer;
v_tb2 t_tb;
begin
v_tb2(100).id:=1;
v_tb2(100).name:='hello';
--dbms_output.put_line(v_tb2(100).id);
--dbms_output.put_line(v_tb2(100).name);
dbms_output.put_line(v_tb2(100).id||' '||v_tb2(100).name);
end;
―――――――――――――――――――――――――――――――――――――
2. 定义多维表类型变量
该程序定义了名为tabletype1的多维表类型,相当于多维数组,table1是多维表类型变量,将数据表tempuser.testtable中recordnumber为60的记录提取出来
存放在table1中并显示。
―――――――――――――――――――――――――――――――――――――
declare
type tabletype1 is table of testtable%rowtype index by binary_integer;
table1 tabletype1;
begin
select * into table1(60) from tempuser.testtable where recordnumber=60;
dbms_output.put_line(table1(60).recordnumber||table1(60).currentdate);
end;
备注:在定义好的表类型变量里,可以使用count、delete、first、last、next、exists和prior等属性进行操作,使用方法为“表变量名.属性”,返回的是数字。
set serveroutput on
declare
type tabletype1 is table of varchar2(9) index by binary_integer;
table1 tabletype1;
begin
table1(1):='成都市';
table1(2):='北京市';
table1(3):='青岛市';
dbms_output.put_line('总记录数:'||to_char(table1.count));
dbms_output.put_line('第一条记录:'||table1.first);
dbms_output.put_line('最后条记录:'||table1.last);
dbms_output.put_line('第二条的前一条记录:'||table1.prior(2));
dbms_output.put_line('第二条的后一条记录:'||table1.next(2));
end;
―――――――――――――――――――――――――――――――――――――
*****************************************
%type和%rowtype
*****************************************
使用%type定义变量,为了让PL/SQL中变量的类型和数据表中的字段的数据类型一致,Oracle 9i提供了%type定义方法。这样当数据表的字段类型修改后,PL/SQL程序中相应变量的类型也自动修改。
―――――――――――――――――――――――――――――――――――――
create table student(
id number,
name varchar2(20),
age number(3,0)
);
insert into student(id,name,age) values(1,'susu',23);
--查找一个字段的变量
declare
v_name varchar2(20);
v_name2 student.name%type;
begin
select name into v_name2 from student where rownum=1;
dbms_output.put_line(v_name2);
end;
--查找多个字段的变量
declare
v_id student.id%type;
v_name student.name%type;
v_age student.age%type;
begin
select id,name,age into v_id,v_name,v_age from student where rownum=1;
dbms_output.put_line(v_id||' '||v_name||' '||v_age);
end;
--查找一个类型的变量,推荐用*
declare
v_student student%rowtype;
begin
select * into v_student from student where rownum=1;
dbms_output.put_line(v_student.id||' '||v_student.name||' '||v_student.age);
end;
--也可以按字段查找,但是字段顺序必须一样,不推荐这样做
declare
v_student student%rowtype;
begin
select id,name,age into v_student from student where rownum=1;
dbms_output.put_line(v_student.id||' '||v_student.name||' '||v_student.age);
end;
declare
v_student student%rowtype;
begin
select id,name,age into v_student.id,v_student.name,v_student.age from student where id=1;
--select * into v_student.id,v_student.name,v_student.age from student where id=1;
dbms_output.put_line();
end;
―――――――――――――――――――――――――――――――――――――
备注:insert,update,delete,select都可以,create table,drop table不行。DPL,DML,和流程控制语句可以在pl/sql里用,但DDL语句不行。
declare
v_name student.name%type:='wang';
begin
insert into student(id,name,age) values(2,v_name,26);
end;
begin
insert into student(id,name,age) values(5,'hehe',25);
end;
declare
v_name student.name%type:='hexian';
begin
update student set name=v_name where id=1;
end;
begin
update student set name='qinaide' where id=2;
end;
―――――――――――――――――――――――――――――――――――――
分享到:
相关推荐
声明部分用于声明变量和子程序,执行部分用于执行业务逻辑,异常处理部分用于捕捉和处理异常。 标识符 在PL/SQL 中,标识符是用来命名变量、子程序和标签的名称。标识符可以是字母、数字或下划线的组合,但不能以...
4. **异常处理**:通过EXCEPTION关键字,PLSQL允许开发者预定义或自定义异常,并在出现错误时进行捕获和处理,增强了程序的健壮性。 5. **游标**:PLSQL中的游标用于逐行处理查询结果,可以动态地访问和操作数据库...
异常处理部分用于捕获和处理运行时错误。 2. **变量和数据类型**:PLSQL支持多种数据类型,包括数值型(如NUMBER)、字符型(如VARCHAR2、CHAR)、日期型(DATE)、布尔型(BOOLEAN)以及复合类型(如纪录和表类型...
PLSQL支持多种数据类型,包括基本类型(如NUMBER、VARCHAR2、DATE等)、复合类型(如记录、数组)、对象类型以及PL/SQL特有的匿名块。此外,它还提供了丰富的内置函数,如数学函数、字符串函数、日期时间函数等,...
- **异常处理结构**:使用BEGIN...EXCEPTION部分来捕获和处理运行时错误。 - **预定义异常**:例如NO_DATA_FOUND、TOO_MANY_ROWS等,针对特定的数据库操作错误。 - **自定义异常**:创建自己的异常并抛出,提高...
六、PLSQL异常处理 异常处理是PLSQL中非常重要的一部分,可以捕获和处理运行时错误。如使用EXCEPTION关键字定义异常处理块,捕获诸如NO_DATA_FOUND、TOO_MANY_ROWS等预定义异常,或者自定义异常。 七、PLSQL性能...
11. **错误处理和调试**:了解如何有效地捕获和处理异常,以及如何使用DBMS_DEBUG_JDWP包进行PLSQL的远程调试。 通过阅读《PLSQL用户指南与参考》,读者不仅可以掌握PLSQL编程的基本技能,还能深入理解其在实际项目...
7. **异常处理**:通过BEGIN...EXCEPTION...END结构,PLSQL提供了内置的异常处理机制,可以捕获和处理如ORA-00001这样的特定数据库错误,以及用户自定义的异常。 8. **事务管理**:PLSQL支持BEGIN、COMMIT、...
7. **异常处理**:PLSQL提供了一套完整的异常处理机制,通过BEGIN...EXCEPTION...END结构来捕获和处理运行时错误。可以使用预定义的异常(如NO_DATA_FOUND、TOO_MANY_ROWS)或自定义异常。 8. **动态SQL**:通过...
3. **异常处理**:PLSQL提供了异常处理机制,允许我们捕获和处理运行时错误。通过使用BEGIN...EXCEPTION...END结构,可以定义不同的异常处理策略,增强程序的健壮性。 4. **记录类型和复合类型**:PLSQL允许声明...
7. **异常处理**:通过EXCEPTION部分,可以捕获和处理运行时错误。例如,`EXCEPTION WHEN NO_DATA_FOUND THEN ...`捕获并处理没有找到数据的异常。 8. **存储过程和函数**:存储过程是预编译的PLSQL代码块,可重复...
异常处理部分则用于捕获和处理运行时可能出现的错误。 PLSQL中的数据类型是学习的重点之一,包括内置的数值类型(如NUMBER、INTEGER)、字符类型(VARCHAR2、CHAR)、日期类型(DATE)以及复合数据类型(如记录类型...
2. **数据类型**:PL/SQL支持多种数据类型,如数值型(NUMBER)、字符串型(VARCHAR2、CHAR)、日期型(DATE)、布尔型(BOOLEAN)等,还有Oracle特有的对象类型和复合类型。 3. **变量声明**:使用`DECLARE`关键字...
异常处理部分则用于捕获和处理运行时可能出现的错误。 在PLSQL中,块(Block)是最基本的结构。一个完整的PLSQL块通常包括BEGIN、END关键字,其中可以包含多个声明、SQL语句和控制结构。例如: ```sql DECLARE ...
3. **异常处理部分**:PLSQL允许通过`EXCEPTION`关键字来捕获和处理运行时错误。这使得代码更加健壮,能处理可能出现的异常情况: ```sql BEGIN -- 操作可能引发错误的代码 EXCEPTION WHEN OTHERS THEN -- ...
异常处理部分则用于捕获和处理程序运行时可能遇到的问题。 1. **变量和数据类型**:PL/SQL支持多种内置数据类型,如NUMBER、VARCHAR2、DATE等,以及复合数据类型如记录(RECORD)和表(TABLE)。理解并熟练运用这些...
PLSQL的异常处理机制允许开发者捕获和处理运行时错误。通过BEGIN...EXCEPTION...END结构,可以定义预定义或自定义异常,并在发生异常时执行相应的代码。 八、存储过程和函数 存储过程是一组预编译的PLSQL语句,可以...
异常处理部分则用于捕获和处理运行时错误。 2. **数据类型**:PLSQL支持多种数据类型,包括数值型(如NUMBER)、字符型(如VARCHAR2和CHAR)、日期时间型(如DATE)、布尔型(BOOLEAN)以及复合数据类型(如记录和...
6. **异常处理**:PL/SQL提供了内置的异常处理机制,通过EXCEPTION关键字来捕获和处理运行时错误,使得程序更加健壮。 7. **包(PACKAGE)**:包是PL/SQL中的一组相关对象,如过程、函数、变量和类型,它们可以一起...
7. **异常处理**:PLSQL的异常处理机制允许程序捕获和处理运行时错误,通过EXCEPTION关键字定义异常块,可以更优雅地处理程序可能出现的问题。 8. **索引和触发器**:在PLSQL 8中,开发者可以创建索引来提高表的...