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 ...
随机推荐
- python *args **kwargs,传入不固定的参数给函数,或者传入很多的内容给函数,常用在构造函数中。
''' 例1:展示*args的用法,传入多个参数,不进行预先定义. 本例传入了3个参数.没有预先定义.在函数内自动生成元组() ''' def q1(*args): print('例1') print ...
- pyinstaller又踩一坑, configparser os.mknod
在使用pyinstaller时,有使用configparser模块. 使用相对路径.在pycharm中测试,正常,打包成exe,就出错了 换用绝对路径, print(os.getcwd()) fp_d ...
- Linux内核分析-使用gdb跟踪调试内核从start_kernel到init进程启动
姓名:江军 ID:fuchen1994 实验日期:2016.3.13 实验指导 使用实验楼的虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-3.18.6/a ...
- firefox下reset()不好使的问题
最近在测试项目时发现,在firefox下,form.reset()方法对于隐藏的<input>等不起效果,导致程序中出现了错误,以下面为例: js代码: document.agentFor ...
- jQuery实现按Esc清除信息功能
1.jQuery实现按Esc清除信息功能 function clearLogs(){ $(".logs").empty(); } $(document).ready(fu ...
- 将PS/2接口鼠标改造成USB接口鼠标
改造接线图 不是所有PS/2鼠标都可以改为USB鼠标的,可以改的PS/2鼠标的特征: A.早期PS/2鼠标电路板一般带有两块集成电路,(一块光电感应,一块按键或USB协议转换,和一只24M的晶体振荡器 ...
- ubuntu 安装最新的python3.7.0
原文:https://www.cnblogs.com/ningvsban/p/4384995.html 1. 安装pyenv git clone git://github.com/yyuu/pyenv ...
- c++ 与 java 中的 继承
C++ 代码: #include <iostream> #include <string> using namespace std; class Parent { public ...
- Buildroot Qt 5
/********************************************************************************* * Buildroot Qt 5 ...
- TX2平台CAN总线收发功能的测试
前言 项目实现过程中需要将获取的数据信息通过CAN总线传输到控制规划模块,本文主要介绍如何在TX2平台测试CAN总线的收发功能. TX2是英伟达旗下为嵌入式平台人工智能应用开发出的一个硬件平台,TX1 ...