存储过程 学习笔记一

create table mytest(
name varchar2(30),
password varchar2(30)
);

create or replace procedure sp_pro1 is
begin
--执行部分
insert into huangbiao.mytest values ('huangbiao','123');
end;

create or replace procedure sp_pro2 is
begin
delete from huangbiao.mytest where name='huangbiao';
end;
/

exec sp_pro2;
如何查看错误信息
show error;

如何调用该过程
1、exec 过程名(参数1,参数2....)
2、call 过程名(参数1,参数2....)


单行注释--
多行注释/*....*/
定义变量,建议v_作为前缀v_sal
定义常量,建议c_作为前缀c_rate
定义游标,建议_cursor结尾 emp_cursor
定义例外,建议e_作为前缀e_error

pl/sql块由三部分构成:
定义部分----declear,该部分是可选的
执行部分----begin,该部分是必须的
例外处理部分----exception,该部分是可选的


最简单的块
set serveroutput on----打开输出选项
begin
dbms_output.put_line('hello');
end;
dbms_output是Oracle所提供的包,类似于JAVA中提供的包,put_line是dbms_output包中的函数

定义部分和执行部分
declare
v_ename varchar2(500);----定义变量
begin
select name into v_ename from mytest where password='123';
dbms_output.put_line('name is ' || v_ename);
end;

declare
v_ename varchar2(500);----定义变量
begin
--&password 表示用户手动的输入值进去
select name into v_ename from mytest where password=&password;
dbms_output.put_line('name is ' || v_ename);
end;

关于多值对应(当前用户需要有访问scott.emp表的查询权限)
declare
v_ename varchar2(500);----定义变量
v_sal number(7,2);
begin
select ename,sal into v_ename,v_sal from scott.emp where ename='SCOTT';
dbms_output.put_line('name is ' || v_ename || ' sal is '|| v_sal);
end;

异常处理
declare
v_ename varchar2(500);----定义变量
v_sal number(7,2);
begin
select ename,sal into v_ename,v_sal from scott.emp where ename='&ename';
----&ename一定要被引号包裹起来,否则会出现语法错误
dbms_output.put_line('name is ' || v_ename || ' sal is '|| v_sal);
----异常处理
exception
when no_data_found then
dbms_output.put_line('查不到指定的数据');
end;
备注:
1、当随便输入一个不存在的值就会抛出异常
2、利用异常来处理某些逻辑
3、Oracle利用事先预定义好的异常来处理

案例:
输入雇员的姓名和新工资,可以修改雇员的工资
create or replace procedure sp_pro3(spename in varchar2,spsal in number) is
begin
--执行部分,根据用户名取修改工资
update scott.emp set sal=spsal where emp.ename=spename;
end;

函数用于返回特定的数据,当建立函数时,在函数头必须包含return子句,而在函数体内必须包含return语句返回的数据。
案例
----输入雇员姓名,返回雇员的年薪
create or replace function sp_fun2(spname varchar2)return number is yearsal number(7,2);
begin
----执行部分
select sal*12+nvl(comm,0) into yearsal from scott.emp where ename=spname;
return yearsal;
end;

var income number;
call sp_fun2('SCOTT') into:income;
----into:incom 中间不能有空格,否则查询不到东西
print income

包用于在逻辑上组合过程和函数
create or replace package sp_package is
procedure update_sal(name varchar2,newsal number);
function annual_income(name varchar2) return number;
end;
给包实现包体
create package body sp_package is
procedure

猜你喜欢

转载自hbiao68.iteye.com/blog/1477727