Oracle学习操作(6)函数与存储过程
一、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执行插入操作,将操作前表的记录数、操作后表的记录数返回:
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)函数与存储过程的更多相关文章
- MySQL学习——操作自定义函数
MySQL学习——操作自定义函数 摘要:本文主要学习了使用DDL语句操作自定义函数的方法. 了解自定义函数 是什么 自定义函数是一种与存储过程十分相似的过程式数据库对象.它与存储过程一样,都是由SQL ...
- Oracle学习(12):存储过程,函数和触发器
存储过程和存储函数 l存储在数据库中供全部用户程序调用的子程序叫存储过程.存储函数. 注意:存储过程与存储函数声明变量时,用的是as 而不是declare 存储过程与存储函数差别 存储过程不带有返 ...
- oracle学习操作(1)
一.oracle表及表空间: 1.查看用户.用户表空间等,需要sysdba登陆: select username, default_tablespace from dba_users; 2.一个数 ...
- Oracle 11g系列:函数与存储过程
1.函数 Oracle中的函数分为两类:系统函数和自定义行数.对于自定义函数,函数的传入参数可以没有,如果有,一定要明确其数据类型.函数传入参数不能在函数内部进行修改.函数必须有返回值,并且返回值必须 ...
- Oracle学习操作(7)用户、权限、角色
一.oracle用户: 二.权限 1.系统权限: sys登陆创建c##test用户后,给用户c##test授权,并且带有传播性: SQL> create user c##test identif ...
- Oracle学习操作(5)触发器
Oracle触发器 一.触发器简介 具备某些条件,由数据库自动执行的一些DML操作行为: 二.语句触发器 现在数据库创建t_book表:t_booktype表:t_book表的typeid存在外键参考 ...
- Oracle学习笔记—常用函数
这里记录一些oracle常用的函数. TO_NUMBER()函数 将字符串类型转换成一个 number 类型的值. SELECT TO_NUMBER('100.00') FROM DUAL; TO_C ...
- Oracle学习笔记——常用函数总结
在平时写PL/SQL的时候,经常要用到很多系统自带的函数,而这些函数用起来非常好用,但是每次用完以后,就又忘到脑后了,为了加深自己的映象,以及对这些函数做一个全面的总结,就有了今天这篇文章. 首先这就 ...
- Oracle学习操作(3)
一.if条件语句 set serverout on; ; v ):='world'; begin dbms_output.put_line('hello'||n||v); end; / hello1w ...
随机推荐
- [转载]彻底卸载oracleXE数据库服务器
URL:http://www.2cto.com/database/201306/216182.html
- Java——IO类,字符流读数据
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...
- 深入理解Linux网络技术内幕——网络设备初始化
概述 内核的初始化过程过程中,与网络相关的工作如下所示: 内核引导时执行start_kernel,start_kernel结束之前会调用rest_init,rest_init初始化内核线 ...
- UINavigationController详细(转)
UINavigationController使用详解 有一阵子没有写随笔,感觉有点儿手生.一个多月以后终于又一次坐下来静下心写随笔,记录自己的学习笔记,也希望能够帮到大家. 废话少说回到正题,UINa ...
- 【转】react的高阶组件
React进阶之高阶组件 前言 本文代码浅显易懂,思想深入实用.此属于react进阶用法,如果你还不了解react,建议从文档开始看起. 我们都知道高阶函数是什么, 高阶组件其实是差不多的用法,只 ...
- cocos2dx 3.1.1移植安卓apk (lua项目交叉编译 mac环境下)
cocos2dx 3.1.1 lua项目安卓交叉编译 mac环境下 本文基于ant,sdk,ndk,adt等软件和环境已经事前设置好 1\新建项目 在mac的终端下输入命令: cocos new te ...
- 京东Java面试题(一)
1.说一下java类集2.字符串哈西相等,equals相等吗?反过来呢?3.Spring的工作原理,控制控制反转是怎么实现的,自己写过滤器过滤编码怎么实现4.框架的源码有没有看过5.动态代理是怎么实现 ...
- Ajax和SpringMVC之间JSON交互
Ajax和SpringMVC之间的json数据传输有两种方式: 1.直接传输Json对象 2.将Json序列化成json字符串 1.直接传输Json对象 前端Ajax $(document).read ...
- Codeforces1106F 【BSGS】【矩阵快速幂】【exgcd】
首先矩阵快速幂可以算出来第k项的指数,然后可以利用原根的性质,用bsgs和exgcd把答案解出来 #include<bits/stdc++.h> using namespace std; ...
- HDU 6188:Duizi and Shunzi(贪心)(广西邀请赛)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6188 题意 有n个数字,每个数字小于等于n,两个相同的数字价值为1,三个连续的数字价值为1 .问这n个 ...