存储过程是一组为了完成特定功能的SQL 语句块,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
1、存储过程和函数以命名的数据库对象形式存储于数据库当中。存储在数据库中的优点是很明显的,因为代码不保存在本地,用户可以在任何客户机上登录到数据库,并调用或修改代码。
2、存储过程和函数可由数据库提供安全保证,要想使用存储过程和函数,需要有存储过程和函数的所有者的授权,只有被授权的用户或创建者本身才能执行存储过程或调用函数。
3、存储过程可以看作是一个公用模块,用户编写的PL/SQL程序或其他存储过程都可以调用它(但存储过程和函数不能调用PL/SQL程序)。一个重复使用的功能,可以设计成为存储过程。
createor replace procedure 存储过程名 as
声明语句段;
begin
执行语句段;
exception
异常处理语句段;
end;
其中CREATE OR REPLACE PROCEDURE 是一个SQL语句,通知Oracle数据库去创建一个存储过程, or replace表示如果存在就覆盖它。
IS关键词表明后面将跟随一个PL/SQL体。
BEGIN关键词表明PL/SQL体的开始。
END关键词表明PL/SQL体的结束。
使用PLSQL Developer调用存储过程是可以使用call或begin...end命令,在SQL Tools中执行的话,可以使用EXECUTE、exec和call来调用已经写好的存储过程。
调用时”()”是不可少的,无论是有参数还是无参数。
不加”()”会报错,错误如下:
定义对数据库过程的调用时:
1、无参数过程:call procedure_name();
2、仅有输入参数的过程:call procedure_name(?,?,...);
这里?表示输入参数,创建存储过程时用in表示输入参数
3、仅有输出参数的过程:call procedure_name(?,?,...);
这里的?表示输出参数,创建存储过程时用out表示输入参数
4、既有输入参数又有输出参数的过程:call procedure_name(?,?...);
这里的?有表示输出参数的,也有表示输入参数的
drop procedure procedure_name --在存储过程中能调用另外一个存储过程,而不能删除另外一个存储过程
创建一张student表
create table STUDENT
(
sid NUMBER,
sname VARCHAR2(20),
sage NUMBER,
sgender VARCHAR2(2)
)
使用存储过程来为student表插入一条数据
create or replaceprocedure pro_addstudent
(sid instudent.sid%type,sname in student.sname%type , sage instudent.sage%type,sgender in student.sgender%type)
is
begin
insert into student (sid,sname,sage,sgender)values(sid,sname,sage,sgender);
end;
注释:sname为输入参数使用关键字in标识,类型为 student表中sname字段的类型,sage同理。
begin
pro_addstudent(2,'小李',23,'女');
end;
或
call pro_addstudent(1,'汉汉',23,'男');
Commit;
使用存储过程实现在为student删除一条记录是,先返回要删除的学生的姓名,如果存在删除成功,如果不存在,抛出异常,显示未找到数据。
create or replaceprocedure pro_delstudent (s in student.sid%type,sn out student.sname%type)
is
begin --将查询到的sname值赋给输出参数sn
select sname into sn from student wheresid=s;
delete from student where sid=s;
--异常处理
exception --未查询相关的sname数据时抛出异常
when no_data_found then sn:='未找到数据';
end;
注释: s为输入参数,sn为输出参数使用out关键字标识,类型为student表中sname的类型
declaresname student.sname%type;
--声明一个sname的变量,来保存存储过程输出的结果
begin
pro_delstudent(1,sname);--调用存储过程
dbms_output.put_line(sname);--打印存储过程输出的结果,此句添加至存储过程中也可,dbms_output.put_line();可添加至任何begin...end;语句中间
end;
Oracle自治事务是指的存储过程和函数可以自己处理内部事务不受外部事务的影响,用pragma autonomous_transaction来声明,要创建一个自治事务,您必须在匿名块的最高层或者存储过程、函数、数据包或触发的定义部分中,使用PL/SQL中的PRAGMA AUTONOMOUS_TRANSACTION语句。在这样的模块或过程中执行的SQL语句都是自治的PRAGMA AUTONOMOUS_TRANSACTION
当前的存储过程作为已有事务的子事务运行,子事务的commit,rollback操作不影响父事务的状态
可以用于
(1)匿名块
(2)触发器
(3)存储过程
自治事务可以用于在客户化程序中记录调试信息
1、用处:是从给定的字符表达式或备注字段中返回一个子字符串。
2、语法格式:
substr( string, start_position, [ length ] )
参数分析:
String 字符串值
Start_position 截取字符串的初始位置,Number型,start_position为负数时,表示从字符串右边数起。
Length 截取位数,Number型
其中,length为可选,如果length为空(即不填)则返回start_position后面的所有字符。
意思就是:从start_position开始,取出length个字符并返回取出的字符串。
如:
substr('This is a test', 6, 2) would return 'is'
substr('This is a test', 6) would return 'is a test'
substr('TechOnTheNet', -3, 3) would return 'Net'
substr('TechOnTheNet', -6, 3) would return 'The'
select substr('Thisisatest', -4, 2) value from dual结果是 te
select substr('emros',-3,1) value from dual 结果是 r
substr('abcde',-6) = null
substr('abcde',-5) = 'abcde'
substr('abcde',-4) = 'bcde'
substr('abcde',-3) = 'cde'
substr('abcde',-2) = 'de'
substr('abcde',-1) = 'e'
substr('abcde',-0) = 'abcde'
在Oracle中,可以使用instr函数对某个字符串进行判断,判断其是否含有指定的字符。 在一个字符串中查找指定的字符,返回被查找到的指定的字符的位置。
语法:
instr(sourceString,destString,start,appearPosition)
instr('源字符串' , '目标字符串' ,'开始位置','第几次出现')
其中sourceString代表源字符串;
destString代表要从源字符串中查找的子串;
start代表查找的开始位置,这个参数可选的,默认为1;
appearPosition代表想从源字符中查找出第几次出现的destString,这个参数也是可选的,默认为1
如果start的值为负数,则代表从右往左进行查找,但是位置数据仍然从左向右计算。返回值为:查找到的字符串的位置。
Oracle中的trim函数是用来删除给定字符串或者给定数字中的头部或者尾部的给定字符。
trim函数具有如下的形式:
trim([leading/trailing/both][匹配字符串或数值][from][需要被处理的字符串或数值])
这里如果指明了leading表示从删除头部匹配的字符串,如果指明了trailing表示从删除尾部匹配的字符串,如果指明了both,或者不指明任何位置,则两端都将被删除;如果不指明任何匹配字符串或数值则认为是空格,即删除前面或者后面的空格。
trim函数返回的类型是varchar2。