--oracle函数和存储过程
--区别:(1)函数大部分是一些工具性的东西;(2)存储过程重点在于一些DML操作;(3)函数有返回值类型;(4)存储过程是参数形式的,没有返回值;
--1.oracle自定义函数
create or replace function 函数名称 return 返回值类型 as
begin
.....
end 函数名称;
--示例1:查询图书数量返回
create function getBookCount return number as
begin
declare bookCount number;
begin
select count(*) into bookCount from t_book;
return bookCount;
end;
end getBookCount;
/
--调用:
set serveroutput on
begin
dbms_output.put_line('表t_book有:'|| getBookCount() ||'条数据');
end;
--示例2:查询某个表的记录数,带参数:表名,!!!!此示例常用!!!!!
create function getTableCount(tablename varchar2) return number as
begin
declare recordCount number;
query_sql varchar2(300);
begin
query_sql := 'select count(*) from '||tablename;
--execute immediate常用
execute immediate query_sql into recordCount;
return recordCount;
end;
end getTableCount;
/
--调用:
set serveroutput on
begin
dbms_output.put_line('表t_book有:'|| getTableCount('t_book') ||'条数据');
end;
--2.oracle存储过程
create or replace procedure 存储过程名称 as
begin
......
end 存储过程名称;
--参数
in : 只进不出
out :只出不进
in out :可进可出
--示例1:t_book新增数据
create procedure addBook(bookName in varchar2,type_id in number,bookPrice in number) as
begin
declare maxId number;
begin
select max(id) into maxId from t_book;
insert into t_book values(maxId+1,bookName,type_id,bookPrice);
--可以在此处直接提交事务
commit;
end;
end addBook;
--执行:
--在Command窗口直接执行:
execute addBook('java案例教学',1,110);
--示例2: 加入判断,如果书名以及存在则不存进去 n1:操作前表记录数 n2:执行后记录数
create procedure addBookNotExits2(bookName in varchar2,type_id in number,bookPrice in number,n1 out number,n2 out number ) as
begin
declare maxId number;
n number;
begin
select count(*) into n1 from t_book;
select count(*) into n from t_book where book_name = bookName;
if(n > 0) then
return;
end if;
select max(id) into maxId from t_book;
insert into t_book values(maxId+1,bookName,type_id,bookPrice);
select count(*) into n2 from t_book;
commit;
end;
end addBookNotExits2;
--调用:
declare n1 number;
n2 number;
begin
addBookNotExits2('呵呵达',2,89,n1,n2);
dbms_output.put_line('n1='||n1);
dbms_output.put_line('n2='||n2);
end;