一、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. DBGridEh 在粘贴中文时出现乱码和错位 100zhx_888]

    http://www.fx114.net/qa-29-3439.aspx 回复于: -- :: unit DBGridEh; 把下面这个函数替换成这样 procedure TDBGridInplace ...

  2. JavaScript事件简述

    事件简述 技术一般水平有限,有什么错的地方,望大家指正. 事件是我们平时经常使用,这次就来了解一下事件.首先我们要明确几个概念,JavaScript是单线程,浏览器是多线程的,并不是所有的事件处理函数 ...

  3. 2019.1.3 WLAN 802.11 a/b/g PHY Specification and EDVT Measurement II - Transmit Spectrum Mask & Current Consumption

    Transmit Spectrum Mask Specification – 802.11b SpecificationFor 802.11b 18.4.7.3The transmitted spec ...

  4. IOS常用代码整理

    常用代码整理: 12.判断邮箱格式是否正确的代码: //利用正则表达式验证 -(BOOL)isValidateEmail:(NSString *)email { NSString *emailRege ...

  5. Axure使用笔记1:如何去除IE中每次“已限制网页运行脚本或ActiveX控件”

    每次在Axure中画原型预览的时候,IE每次都有 这个比较烦,在Internent做如下设置,即可不再烦恼 看到没,给允许活动内容在我的计算机上的文件中运行打上勾

  6. tomcat部署和启动3

    点击STATUES,弹出登陆框 You are not authorized to view this page. If you have not changed any configuration ...

  7. 1.1.4 A+B for Input-Output Practice (V)

    A+B for Input-Output Practice (V) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...

  8. PyTorch 数据集类 和 数据加载类 的一些尝试

    最近在学习PyTorch,  但是对里面的数据类和数据加载类比较迷糊,可能是封装的太好大部分情况下是不需要有什么自己的操作的,不过偶然遇到一些自己导入的数据时就会遇到一些问题,因此自己对此做了一些小实 ...

  9. RESTful API 学习

    /********************************************************************************* * RESTful API 学习 ...

  10. Nim Game,一个有趣的游戏,也是一道入门算法题。

    Nim Game,其实很多人都玩过.其实就是我们玩的划线游戏. 一张纸上,画若干条线,双方一人划一次,每次划掉1~3条线.可以选择画1条,也可以划2条,也可以3条.具体划去几条线完全看自己的策略.谁划 ...