时间:2021-07-01 10:21:17 帮助过:3人阅读
exception
例外处理部分,处理运行的各种错误
定义部分是从declare开始的,可选
执行部分从begin开始,必选
例外处理部分从exception,可选
下面编写一条最简单的块,输出hello world
编写之前打开系统的屏幕输出信息,不然看不到效果
SQL> set serveroutput on;
SQL> begin
2 dbms_output.put_line(‘hello world‘);
3 end;
4 /
hello world
PL/SQL procedure successfully completed.
最简单的块编程,只有执行部分,而且只输出了一条信息hello world。
相关说明:dbms_output是oracle所提供的包(类似java的开发包),该包包含一些过程,put_line就是
dbms_output包的一个过程(包里面的一个过程)
实例2:包含定义部分和执行部分
SQL> declare
2 v_name varchar2(20); 改行表示定义的变量,变量名v_name,数据类型为varchar2
3 begin
4 select ename into v_name from emp where empno=&empno; &由键盘输出
5 dbms_output.put_line(v_name);
6 end;
7 /
Enter value for empno: 7788
old 4: select ename into v_name from emp where empno=&empno;
new 4: select ename into v_name from emp where empno=7788;
SCOTT 输出到屏幕的信息v_name
PL/SQL procedure successfully completed.
实例3:包含定义部分、执行部分和例外处理部分
为了避免pl/sql程序的运行错误,提高pl/sql的健壮性,应该对可能的错误进行处理
相关说明:oracle事先预定义了一些例外,no_data_found就是找不到数据的例外
如上述例子,如果输入烦人不是emp表中的empno号码,那么将会报错,报错该如何处理呢,这里就定义例外部分,交给他处理
SQL> declare
2 v_name varchar2(20);
3 v_sal number(7,2);
4 begin
5 select ename,sal into v_name,v_sal from emp where empno=&empno;
6 dbms_output.put_line(v_name||‘ ‘||v_sal);
7 exception 定义例外关键字exception
8 when no_data_found then 当查询不到数据时,采取措施打印error
9 dbms_output.put_line(‘error‘);
10 end;
11 /
Enter value for empno: 78 78并不在emp表中的empno好中
old 5: select ename,sal into v_name,v_sal from emp where empno=&empno;
new 5: select ename,sal into v_name,v_sal from emp where empno=78;
error 打印error
过程
过程用于执行特定的操作,当建立过程时,既可以指定输入参数(in),也可以指定输出参数(out)。通过在过程中使用输入参数可以将数据传递带执行部分;通过使用输出参数,可以将执行部分的数据传递到应用环境。在sqlplus中使用create procedure 命令来建立过程
SQL> --过程编写
SQL> create or replace procedure sp_pro1(name varchar2,pass varchar2) is
2 begin
3 insert into names values (name,pass);
4 end;
5 /
Procedure created.
sp_pro1(name varchar2,pass varchar2):这里面的参数相当于编程里面的形参,传递的数据
然后调用该存储过程
SQL> exec sp_pro1(‘xiaobai‘,‘redhat‘);
PL/SQL procedure successfully completed.
然后查询数据是否已经插入了
SQL> select * from names;
NAME PASSWORD
-------------------- ------------------------------
xiaoming redhat
xiaobai redhat
修改表emp的雇员为smith的薪水,编写存储过程实现
SQL> create or replace procedure sp_pro1(name varchar2,v_sal number) is
2 begin
3 update emp set sal=v_sal where ename=name;
4 end;
5 /
Procedure created.
调用存储过程,传递形参数据
SQL> exec sp_pro1(‘SMITH‘,1200);
PL/SQL procedure successfully completed.
查询改变结果
SQL> select ename,sal from emp where ename=‘SMITH‘;
ENAME SAL
---------- ----------
SMITH 1200
过程用于执行特定的操作,当建立过程时,既可以指定输入参数(in),也可以指定输出参数(out)
sp_pro1(name varchar2,pass varchar2)这里面加入的参数默认是in,如果要输出有返回值的存储过程必须加上out,看下面例子
给定一个empno雇员号,返回雇员名,编写一个存储过程
SQL> create or replace procedure sp_pro1(spno in number,spname out varchar2) is
2 begin
3 select ename into spname from emp where empno=spno;
4 end;
5 /
Procedure created.
该如何调用了,这里就不能直接exec procedure_name这样了,调用方式如下
SQL> declare
2 v_name varchar(20); 定义一个变量,将存储过程返回出来的值存入到这个变量中
3 begin
4 sp_pro1(7788,v_name);
5 dbms_output.put_line(v_name); 打印变量的值,也就是返回出来的值
6 end;
7 /
SCOTT
PL/SQL procedure successfully completed.
什么情况下用exec调用,什么情况下用PLSQL调用存储过程?
exec适合于调用存储过程无返回值
plsql适合于调用存储过程有返回值,不管多少个
函数
过程用于返回特定的数据,当建立函数时,在函数头必须包含return字句,而在函数体内必须包含return语句
返回的数据,创建函数用create function
SQL> --函数案例
结构:create or replace function return ..is,看下面例子
SQL> create or replace function sp_fun1(name varchar2) return number is
2 yearsal number(7,2);
3 begin
4 select sal*12 into yearsal from emp where ename=name;
5 return yearsal; 定义需要返回的
6 end;
7 /
Function created.
函数创建完成,该如何调用呢?
SQL> declare
2 v_sal number(7,2); 定义一个变量用来接收函数返回的值
3 begin
4 v_sal:=sp_fun1(‘SMITH‘); 将函数返回的值赋值给v_sal,赋值为:=
5 dbms_output.put_line(v_sal);
6 end;
7 /
14400
PL/SQL procedure successfully completed.
pl/sql编程基础
标签:oracle