一、oracle自定义函数                                    

1.不带参数的函数:

返回t_book表的总条数:

SQL> create function getBookCount return number as
2 begin
3 declare book_count number;
4 begin
5 select count(*) into book_count from t_book;
6 return book_count;
7 end;
8 end getBookCount;
9 / 函数已创建。 //sys dba给当前用户授权创建函数、创建存储过程的权限,function 跟 procedure 原来是两位一体的。
//SQL> grant create any procedure to c##chengyu;

调用函数:

SQL> set serveroutput on;
SQL> begin
2 dbms_output.put_line('表t_book有'||getBookCount()||'条记录');
3 end;
4 /
表t_book有3条记录 PL/SQL 过程已成功完成。

2.函数,带参数

例1.查某个表的记录数:

SQL> create function getTableRecord(table_name varchar2) return number as
2 begin
3 declare table_count number;
4 query_sql varchar2(200);
5 begin
6 query_sql:='select count(*) from '|| table_name;
7 execute immediate query_sql into table_count;
8 return table_count;
9 end;
10 end getTableRecord;
11 / 函数已创建。 //execute immediate 立即执行;

调用:

SQL> begin
2 dbms_output.put_line('表有'|| getTableRecord('emp') ||'条数据');
3 end;
4 /
表有14条数据 PL/SQL 过程已成功完成。

例2:显示emp表的sal的税收情况:

SQL> create or replace function sal_tax(v_sal number) return number as
2 begin
3 if v_sal < 2000 then
4 return 0.10;
5 else if v_sal < 2750 then
6 return 0.15;
7 else
8 return 0.20;
9 end if;
10 end if;
11 end sal_tax;
12 / 函数已创建。 SQL> select lower(ename), sal_tax(sal) from emp; LOWER(ENAM SAL_TAX(SAL)
---------- ------------
smith .1
allen .1
ward .1
jones .2
martin .1
blake .2
clark .15
scott .2
king .2.... 已选择 14 行。

二、存储过程                                            

1.不带参数的存储过程:

SQL> create or replace procedure p as
2 begin
3 declare cursor c is select * from emp2 for update;
4 begin
5 for v_emp in c loop
6 if(v_emp.deptno = 10) then
7 update emp2 set sal = sal+1 where current of c;
8 else if(v_emp.deptno = 20) then
9 update emp2 set sal = sal+2 where current of c;
10 else
11 update emp2 set sal = sal+5 where current of c;
12 end if;
13 end if;
14 end loop;
15 commit;
16 end;
17 end p;
18 / 过程已创建。

执行存储过程p:

SQL> execute p;

PL/SQL 过程已成功完成。

SQL> select ename, sal from emp2;

ENAME             SAL
---------- ----------
SMITH 802
ALLEN 1605
WARD 1255
JONES 2977
MARTIN 1255
BLAKE 2855
CLARK 2451
SCOTT 3002
KING 5001... 已选择 14 行。

2.带参数的存储过程:

1)需求:添加记录到t_book,如果bookname存在,则不执行插入操作:

SQL> create procedure addBook(book_name in varchar2, typeId in number) as
2 begin
3 declare maxId number;
4 n number;
5 begin
6 select count(*) into n from t_book where bookname = book_name;
7 if (n>0) then
8 return;
9 end if;
10 select max(id) into maxId from t_book;
11 insert into t_book values (maxId+1, book_name, typeId);
12 commit;
13 end;
14 end addBook;
15 / 过程已创建。

执行存储过程:

SQL> execute addBook('java好东西',1);

PL/SQL 过程已成功完成。

SQL> select * from t_book;

        ID BOOKNAME       TYPEID
---------- ---------- ----------
1 java编程思 1
2 一头扎进ja 1
3 生物起源 2
4 java好东西 1 SQL> execute addBook('java好东西',1); PL/SQL 过程已成功完成。 SQL> select * from t_book; ID BOOKNAME TYPEID
---------- ---------- ----------
1 java编程思 1
2 一头扎进ja 1
3 生物起源 2
4 java好东西 1

2)out:只出不进:相当于一个返回值;

需求:对t_book执行插入操作,将操作前表的记录数、操作后表的记录数返回:

n1:操作前表的记录数;
n2:操作后表的记录数;
execute是执行单句存储过程的;
SQL> create or replace procedure addBook2(book_name in varchar2, typeId in numbe
r, n1 out number, n2 out number) as
2 begin
3 declare maxId number;
4 n number;
5 begin
6 select count(*) into n1 from t_book;
7 select count(*) into n from t_book where bookname = book_name;
8 if (n>0) then
9 return;
10 end if;
11 select max(id) into maxId from t_book;
12 insert into t_book values (maxId+1, book_name, typeId);
13 select count(*) into n2 from t_book;
14 commit;
15 end;
16 end addBook2;
17 / 过程已创建。

执行:

SQL> declare n1 number;
2 n2 number;
3 begin
4 addBook2('jaas阿斯达',2,n1,n2);
5 dbms_output.put_line('n1='||n1);
6 dbms_output.put_line('n2='||n2);
7 end;
8 /
n1=4
n2=5 PL/SQL 过程已成功完成。

out的另外例子:

SQL> create or replace procedure p_inout(a in number, b number, ret out number, temp in out number) as
2 begin
3 if(a > b) then
4 ret := a;
5 else
6 ret := b;
7 end if;
8 temp := temp + 1;
9 end p_inout;
10 / 过程已创建。

执行p_inout:

SQL> declare a number:=3;
2 b number:=4;
3 ret number;
4 temp number:=5;
5 begin
6 p_inout(a, b, ret, temp);
7 dbms_output.put_line(ret);
8 dbms_output.put_line(temp);
9 end;
10 /
4
6 PL/SQL 过程已成功完成。 //存储过程中参数分为不同的类型:
// in传入参数,谁调用这个存储过程,谁负责给a赋值;
//out传出参数, 将ret传出到调用环境中去;
//什么都没写,b默认是传入参数;
//in out temp既可以接收,又可以传出

三、程序包                                                          

当项目中模块很多的时候,用程序包管理下面的函数和存储过程,这样就能包.函数 或者 包.存储过程,方便管理了;
变量在包下面的 函数和存储过程 是共享的变量;
 
创建程序包:
SQL> create or replace package pkg_book as
2 function getBookCount return number;
3 function getTableRecord(table_name varchar2) return number;
4 procedure addBook(book_name in varchar2, typeId in number);
5 end pkg_book;
6 / 程序包已创建。

创建包体:

SQL> create package body pkg_book as
2
3 function getBookCount return number as
4 begin
5 declare book_count number;
6 begin
7 select count(*) into book_count from t_book;
8 return book_count;
9 end;
10 end getBookCount;
11
12 function getTableRecord(table_name varchar2) return number as
13 begin
14 declare table_count number;
15 query_sql varchar2(200);
16 begin
17 query_sql:='select count(*) from '|| table_name;
18 execute immediate query_sql into table_count;
19 return table_count;
20 end;
21 end getTableRecord;
22
23 procedure addBook(book_name in varchar2, typeId in number) as
24 begin
25 declare maxId number;
26 n number;
27 begin
28 select count(*) into n from t_book where bookname = book_name;
29 if (n>0) then
30 return;
31 end if;
32 select max(id) into maxId from t_book;
33 insert into t_book values (maxId+1, book_name, typeId);
34 commit;
35 end;
36 end addBook;
37
38 end pkg_book;
39 / 程序包体已创建。

调用:使用程序包.函数名来调用;

SQL> set serveroutput on;
SQL> begin
2 dbms_output.put_line('表t_book有'||pkg_book.getBookCount()||'条记录');
3 end;
4 /
表t_book有5条记录 PL/SQL 过程已成功完成。

Oracle学习操作(6)函数与存储过程的更多相关文章

  1. MySQL学习——操作自定义函数

    MySQL学习——操作自定义函数 摘要:本文主要学习了使用DDL语句操作自定义函数的方法. 了解自定义函数 是什么 自定义函数是一种与存储过程十分相似的过程式数据库对象.它与存储过程一样,都是由SQL ...

  2. Oracle学习(12):存储过程,函数和触发器

    存储过程和存储函数 l存储在数据库中供全部用户程序调用的子程序叫存储过程.存储函数. 注意:存储过程与存储函数声明变量时,用的是as   而不是declare 存储过程与存储函数差别 存储过程不带有返 ...

  3. oracle学习操作(1)

    一.oracle表及表空间: 1.查看用户.用户表空间等,需要sysdba登陆: select username, default_tablespace from dba_users;   2.一个数 ...

  4. Oracle 11g系列:函数与存储过程

    1.函数 Oracle中的函数分为两类:系统函数和自定义行数.对于自定义函数,函数的传入参数可以没有,如果有,一定要明确其数据类型.函数传入参数不能在函数内部进行修改.函数必须有返回值,并且返回值必须 ...

  5. Oracle学习操作(7)用户、权限、角色

    一.oracle用户: 二.权限 1.系统权限: sys登陆创建c##test用户后,给用户c##test授权,并且带有传播性: SQL> create user c##test identif ...

  6. Oracle学习操作(5)触发器

    Oracle触发器 一.触发器简介 具备某些条件,由数据库自动执行的一些DML操作行为: 二.语句触发器 现在数据库创建t_book表:t_booktype表:t_book表的typeid存在外键参考 ...

  7. Oracle学习笔记—常用函数

    这里记录一些oracle常用的函数. TO_NUMBER()函数 将字符串类型转换成一个 number 类型的值. SELECT TO_NUMBER('100.00') FROM DUAL; TO_C ...

  8. Oracle学习笔记——常用函数总结

    在平时写PL/SQL的时候,经常要用到很多系统自带的函数,而这些函数用起来非常好用,但是每次用完以后,就又忘到脑后了,为了加深自己的映象,以及对这些函数做一个全面的总结,就有了今天这篇文章. 首先这就 ...

  9. Oracle学习操作(3)

    一.if条件语句 set serverout on; ; v ):='world'; begin dbms_output.put_line('hello'||n||v); end; / hello1w ...

随机推荐

  1. bzoj1053&&51nod1060

    题解: 其实就是求1-n之中拥有最多约数的数 一个数x的质因数分解为p1^e1*p2^e2*...*pn^en,则正因数的个数为(e1+1)(e2+1)...(en+1) 那么发现,正因数的个数和p没 ...

  2. AnsiStartsStr 和 空字符串

    function AnsiStartsStr(const ASubText, AText: string): Boolean; begin Result := AnsiSameStr(ASubText ...

  3. 【转】POJ百道水题列表

    以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight ...

  4. Lightbox JS v2.0图片切换效果

    代码下载

  5. js 怎样获取div 图片等的宽度,只要值,不要px

    给你的div命名id=“abc”,js中用下面的语句就能获取到js的宽度并赋值给a a=document.all.abc.offsetWidth; 然后通过 alert(a); 就能弹出这个值来了.

  6. CentOS 7 目录布局变化

    /bin转移到/usr/bin;/sbin转移到/usr/sbin;/lib转移到/usr/lib;/lib64转移到/usr/lib64. /var/run符号连接到/run;/var/lock符号 ...

  7. 201621123010《Java程序设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1. 常用异常 结合题集题目7-1回答 1.1 自己以前编写的代码中经常出现 ...

  8. caffe编译问题-nvcc fatal:Unsupported gpu architecture 'compute_20'

    错误描述 nvcc fatal : Unsupported gpu architecture 'compute_20' Makefile:: recipe for target '.build_rel ...

  9. CodeForces - 1093D:Beautiful Graph(二分图判定+方案数)

    题意:给定无向图,让你给点加权(1,2,3),使得每条边是两端点点权和维奇数. 思路:一个连通块是个二分图,判定二分图可以dfs,并查集,2-sat染色. 这里用的并查集(还可以带权并查集优化一下,或 ...

  10. HDU2034:人见人爱A-B

    Problem Description 参加过上个月月赛的同学一定还记得其中的一个最简单的题目,就是{A}+{B},那个题目求的是两个集合的并集,今天我们这个A-B求的是两个集合的差,就是做集合的减法 ...