一、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. ansible 列表变量、字典变量

    ansible的变量不仅可以是单个的值,也可以为列表. - hosts: localhost gather_facts: no vars: - list: [1,2,3] tasks: - name: ...

  2. DevExpress v17.2新版亮点—WPF篇(五)

    用户界面套包DevExpress v17.2终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WPF v17.2 新的Hamburger Menu.Sched ...

  3. ora-01830:日期格式图片在转换整个输入字符串之前结束

    在to_date的时候因为 fldsj这个字段的大小 与 ‘yyyy-MM-dd’不符合 所以需要截取下fldsj字段的大小  to_char(to_date(substr(fldsj,1,10),' ...

  4. Ubuntu:系统启动服务

    系统启动服务 针对Ubuntu 5级别服务的说明 安装sysv-rc-conf sudo apt-get install sysv-rc-conf acpi-support 高级电源管理支持 acpi ...

  5. xxx/labelKeypoint/utils/qt.py:81: RuntimeWarning: invalid value encountered in double_scalars

    原代码: return np.linalg.norm(np.cross(p2 - p1, p1 - p3)) / np.linalg.norm(p2 - p1) 出现报错: xxx/labelKeyp ...

  6. 配置阿里云ECS支持IPv6,解决苹果app审核失败问题

    前几天iOS的App提交给苹果审核没通过,给出的原因是:该应用在 IPv6 的环境下无法使用.检查发现:阿里云优化过的系统没有启用IPv6协议,需要配置启用一下,但是只单独启用IPv6也是无法直接提供 ...

  7. zzuli2228: 神奇的排名

    题目描述 小明最近沉迷上了打codeforces的比赛,和acm不同的是,这种比赛是积分制的,按照做题用时,错误次数以及hack来计分的.在某一场比赛,共有n个人参加比赛,现在给出你所有人的分数,小明 ...

  8. java面试题12

    1.  jsp与servlet的区分? 答:Servlet和JSP都是基于java语言上的动态网页技术,Servlet程序其实就是java程序,只不过它所使用的类库为JAVA Servlet API, ...

  9. 几本不错的graphql 电子书

    当前专门讲graphql 的数据不是很多,但是越来越多的graphql 项目的出现以及graphql 自身的 便捷,老外已经有人去写graphql 的设计以及基本使用了. ebooks 地址 http ...

  10. java 的关键字 native

    native native 关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中.Java语言本身不能对操作系统底层进行访问和操作,但是可 ...