oracle存储过程、函数、序列、包
一. 存储过程
1. 语法
create or replace procedure procedureName(seqName varchar2)
is
/*声明变量*/
n number(10);
cursor cur is select * from tableName;
/*用来放置游标中的一行*/
cRow cur%rowtype; begin
/*变量赋值*/
n := 5; /*循环方式一*/
for i in 1..n loop
/*做点什么*/
end loop; /*循环方式二*/
loop
exit when n = 0;
n := n - 1;
end loop; /*循环方式三*/
while i < n loop
exit;
end loop; /*游标用法一:隐式打开和关闭*/
for c in cur loop
/*做点什么*/
end loop; /*游标用法一:显式打开和关闭*/
open cur;
loop
fetch cur into cRow;
exit when cur%notfound;
end loop;
close cur; /*修改游标的所在行*/
update tableName set columnName=columnValue where current of cur; /*判断*/
if (n = 0) then
/*动态执行sql语句*/
execute immediate 'select '||seqName||'.nextval from dual' into n;
else
/*控制台输出*/
dbms_output.put_line(n);
end if; commit;
end procedureName;
二. 函数
1. 常用函数
to_char(timestamp, ''yyyy-mm-dd hh:mm:ss''):把 timestamp 转换成字符串
length(字符串):计算字符串所占的字符长度,返回字符串长度
instr(源字符串, 目标字符串, 开始位置, 第几次出现):在一个字符串中查找指定的字符,返回被查找到的指定的字符的位置。
substr(字符串, 截取开始位置, 截取长度):返回截取的字
decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值):它将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值。如果未能与任何一个实参序偶匹配成功,则函数也有默认的返回值。
power(x,y):计算x^y次方
to_number(字符串):将字符串转化为数字
floor(数字):对给定的数字取整数位
2. c2b函数:clob转blob
create or replace function c2b (b in clob default empty_clob())
return blob
is
res blob;
bLen number := dbms_lob.getlength(b);
destOffset1 number := 1;
srcOffset1 number := 1;
amountC integer := dbms_lob.lobmaxsize;
blobCsid number := dbms_lob.default_csid;
langCtx integer := dbms_lob.default_lang_ctx;
warning integer;
begin
if bLen > 0 then
dbms_lob.createtemporary(res, true);
dbms_lob.open(res, dbms_lob.lob_readwrite);
dbms_lob.convertToBlob(res, b, amountC, destOffset1, srcOffset1, blobCsid, langCtx, warning );
else
select empty_blob() into res from dual;
end if; return res;
end c2b;
3. hexToDec函数:十六进制字符串转数值型字符串
create or replace function hexToDec(icHex in varchar2)
return varchar2
is
iDecimal integer;
cNewHex varchar2(1);
iHexLen integer;
result integer;
begin
result :=0;
iHexLen := length(icHex);
for i in 1..iHexLen loop
cNewHex :=substr(icHex,iHexLen - i + 1,1);
select decode(cNewHex,'A',10,'B',11,'C',12,'D',13,'E',14,'F',15,to_number(cNewHex))
into iDecimal from dual;
result := result + iDecimal * power(16,(i-1));
end loop;
return(to_char(result));
end hexToDec;
4. decToHex函数:数值型字符串转十六进制字符串
create or replace function decToHex(iDecimal in varchar2)
return varchar2
is
nDecimal integer;
quotient integer;
residue integer;
result varchar2(50);
begin
nDecimal := to_number(iDecimal);
loop
quotient := floor(nDecimal/16);
residue := nDecimal mod 16;
select decode(residue,10,'A',11,'B',12,'C',13,'D',14,'E',15,'F',to_char(residue)) || result
into result from dual;
exit when quotient = 0;
nDecimal := quotient;
end loop;
return(result);
end decToHex;
5. splitCount函数:查找字符串中包含指定字符的个数
create or replace function splitCount (vSource in varchar2, vDelimiter in varchar2)
return integer
is
j integer;
i integer;
len integer;
delimLen integer;
cnt integer;
begin
j := 0;
i := 1;
len := 0;
delimLen := 0;
cnt := 0;
len := length(vSource);
delimLen := length(vDelimiter); while j < len loop
j := instr(vSource, vDelimiter, i);
if j = 0 then
j := len;
if i >= len then
exit;
end if;
else
i := j + delimLen;
cnt := cnt+1;
end if;
end loop; return cnt;
end splitArrayLength;
6. TRUNC():类似截取函数,按指定的格式截取输入的数据
1. 处理日期
select trunc(sysdate) from dual;--2017/2/13,返回当前时间
select trunc(sysdate,'yy') from dual;--2017/1/1,返回当年第一天
select trunc(sysdate,'mm') from dual;--2017/2/1,返回当月的第一天
select trunc(sysdate,'d') from dual;--2017/2/12,返回当前星期的第一天,即星期天
select trunc(sysdate,'dd') from dual;--2017/2/13,返回当前日期,今天是2017/2/13
select trunc(sysdate ,'HH24') from dual;--2017/2/13 15:00:00,返回本小时的开始时间
select trunc(sysdate ,'MI') from dual;--2017/2/13 15:13:00,返回本分钟的开始时间
select trunc(sysdate-5) from dual;--2017/2/8,返回前五天的时间
select trunc(sysdate-interval'5'month,'mm') from dual;--2016/9/1,返回前5个月的第一天
select trunc(sysdate-interval'5'year,'yy') from dual;--2012/1/1,返回前5年的第一天
select trunc(sysdate)+1-1/86400 from dual;--2017/2/13 23:59:59,返回当天的最后一秒 2. 处理number型数字,截取时并不对数据进行四舍五入
select trunc(123.567,2) from dual;--123.56,将小数点右边指定位数后面的截去;
select trunc(123.567,-2) from dual;--100,第二个参数可以为负数,表示将小数点左边指定位数后面的部分截去,即均以0记;
select trunc(123.567) from dual;--123,默认截去小数点后面的部分;
三. 序列
1. 创建序列
create sequence seqEmp
minvalue 0
maxvalue 99999999
start with 1
increment by 1
nocache;
2. seqReset存储过程:重置序列
create or replace procedure seqReset(vSeqName varchar2)
is
n number(10);
tSql varchar2(100);
begin
execute immediate 'select '||vSeqName||'.nextval from dual' into n;
n:=-n;
tSql:='alter sequence '||vSeqName||' increment by '||n;
execute immediate tSql;
execute immediate 'select '||vSeqName||'.nextval from dual' into n;
tSql:='alter sequence '||vSeqName||' increment by 1';
execute immediate tSql;
end seqReset;
四. 包
1. base_convert:常用类型转换函数包
a. 包头
CREATE OR REPLACE PACKAGE base_convert AS FUNCTION hex_to_dec (hexin IN VARCHAR2) RETURN NUMBER;
PRAGMA restrict_references (HEX_TO_DEC,WNDS,RNDS,WNPS,WNPS); FUNCTION dec_to_hex (decin IN NUMBER) RETURN VARCHAR2;
PRAGMA restrict_references (DEC_TO_HEX,WNDS,RNDS,WNPS,WNPS); FUNCTION oct_to_dec (octin IN NUMBER) RETURN NUMBER;
PRAGMA restrict_references (OCT_TO_DEC,WNDS,RNDS,WNPS,WNPS); FUNCTION dec_to_oct (decin IN NUMBER) RETURN VARCHAR2;
PRAGMA restrict_references (DEC_TO_OCT,WNDS,RNDS,WNPS,WNPS); FUNCTION bin_to_dec (binin IN NUMBER) RETURN NUMBER;
PRAGMA restrict_references (BIN_TO_DEC,WNDS,RNDS,WNPS,WNPS); FUNCTION dec_to_bin (decin IN NUMBER) RETURN VARCHAR2;
PRAGMA restrict_references (DEC_TO_BIN,WNDS,RNDS,WNPS,WNPS); FUNCTION hex_to_bin (hexin IN VARCHAR2) RETURN NUMBER;
PRAGMA restrict_references (HEX_TO_BIN,WNDS,RNDS,WNPS,WNPS); FUNCTION bin_to_hex (binin IN NUMBER) RETURN VARCHAR2;
PRAGMA restrict_references (BIN_TO_HEX,WNDS,RNDS,WNPS,WNPS); FUNCTION oct_to_bin (octin IN NUMBER) RETURN NUMBER;
PRAGMA restrict_references (OCT_TO_BIN,WNDS,RNDS,WNPS,WNPS); FUNCTION bin_to_oct (binin IN NUMBER) RETURN NUMBER;
PRAGMA restrict_references (BIN_TO_OCT,WNDS,RNDS,WNPS,WNPS); FUNCTION oct_to_hex (octin IN NUMBER) RETURN VARCHAR2;
PRAGMA restrict_references (OCT_TO_HEX,WNDS,RNDS,WNPS,WNPS); FUNCTION hex_to_oct (hexin IN VARCHAR2) RETURN NUMBER;
PRAGMA restrict_references (HEX_TO_OCT,WNDS,RNDS,WNPS,WNPS); END base_convert;
b. 包体
CREATE OR REPLACE PACKAGE BODY base_convert AS FUNCTION hex_to_dec (hexin IN VARCHAR2) RETURN NUMBER IS
v_charpos NUMBER;
v_charval CHAR(1);
v_return NUMBER DEFAULT 0;
v_power NUMBER DEFAULT 0;
v_string VARCHAR2(2000);
BEGIN
v_string := UPPER(hexin);
v_charpos := LENGTH(v_string);
WHILE v_charpos > 0 LOOP
v_charval := SUBSTR(v_string,v_charpos,1);
IF v_charval BETWEEN '' AND '' THEN
v_return := v_return + TO_NUMBER(v_charval) * POWER(16,v_power);
ELSE
IF v_charval = 'A' THEN
v_return := v_return + 10 * POWER(16,v_power);
ELSIF v_charval = 'B' THEN
v_return := v_return + 11 * POWER(16,v_power);
ELSIF v_charval = 'C' THEN
v_return := v_return + 12 * POWER(16,v_power);
ELSIF v_charval = 'D' THEN
v_return := v_return + 13 * POWER(16,v_power);
ELSIF v_charval = 'E' THEN
v_return := v_return + 14 * POWER(16,v_power);
ELSIF v_charval = 'F' THEN
v_return := v_return + 15 * POWER(16,v_power);
ELSE
raise_application_error(-20621,'Invalid input');
END IF;
END IF;
v_charpos := v_charpos - 1;
v_power := v_power + 1;
END LOOP;
RETURN v_return;
END hex_to_dec; FUNCTION dec_to_hex (decin IN NUMBER) RETURN VARCHAR2 IS
v_decin NUMBER;
v_next_digit NUMBER;
v_result varchar(2000);
BEGIN
v_decin := decin;
WHILE v_decin > 0 LOOP
v_next_digit := mod(v_decin,16);
IF v_next_digit > 9 THEN
IF v_next_digit = 10 THEN v_result := 'A' || v_result;
ELSIF v_next_digit = 11 THEN v_result := 'B' || v_result;
ELSIF v_next_digit = 12 THEN v_result := 'C' || v_result;
ELSIF v_next_digit = 13 THEN v_result := 'D' || v_result;
ELSIF v_next_digit = 14 THEN v_result := 'E' || v_result;
ELSIF v_next_digit = 15 THEN v_result := 'F' || v_result;
ELSE raise_application_error(-20600,'Untrapped exception');
END IF;
ELSE
v_result := to_char(v_next_digit) || v_result;
END IF;
v_decin := floor(v_decin / 16);
END LOOP;
RETURN v_result;
END dec_to_hex; FUNCTION oct_to_dec (octin IN NUMBER) RETURN NUMBER IS
v_charpos NUMBER;
v_charval CHAR(1);
v_return NUMBER DEFAULT 0;
v_power NUMBER DEFAULT 0;
v_string VARCHAR2(2000);
BEGIN
v_string := TO_CHAR(octin);
v_charpos := LENGTH(v_string);
WHILE v_charpos > 0 LOOP
v_charval := SUBSTR(v_string,v_charpos,1);
IF v_charval BETWEEN '' AND '' THEN
v_return := v_return + TO_NUMBER(v_charval) * POWER(8,v_power);
ELSE
raise_application_error(-20621,'Invalid input');
END IF;
v_charpos := v_charpos - 1;
v_power := v_power + 1;
END LOOP;
RETURN v_return;
END oct_to_dec; FUNCTION dec_to_oct (decin IN NUMBER) RETURN VARCHAR2 IS
v_decin NUMBER;
v_next_digit NUMBER;
v_result varchar(2000);
BEGIN
v_decin := decin;
WHILE v_decin > 0 LOOP
v_next_digit := mod(v_decin,8);
v_result := to_char(v_next_digit) || v_result;
v_decin := floor(v_decin / 8);
END LOOP;
RETURN v_result;
END dec_to_oct; FUNCTION bin_to_dec (binin IN NUMBER) RETURN NUMBER IS
v_charpos NUMBER;
v_charval CHAR(1);
v_return NUMBER DEFAULT 0;
v_power NUMBER DEFAULT 0;
v_string VARCHAR2(2000);
BEGIN
v_string := TO_CHAR(binin);
v_charpos := LENGTH(v_string);
WHILE v_charpos > 0 LOOP
v_charval := SUBSTR(v_string,v_charpos,1);
IF v_charval BETWEEN '' AND '' THEN
v_return := v_return + TO_NUMBER(v_charval) * POWER(2,v_power);
ELSE
raise_application_error(-20621,'Invalid input');
END IF;
v_charpos := v_charpos - 1;
v_power := v_power + 1;
END LOOP;
RETURN v_return;
END bin_to_dec; FUNCTION dec_to_bin (decin IN NUMBER) RETURN VARCHAR2 IS
v_decin NUMBER;
v_next_digit NUMBER;
v_result varchar(2000);
BEGIN
v_decin := decin;
WHILE v_decin > 0 LOOP
v_next_digit := mod(v_decin,2);
v_result := to_char(v_next_digit) || v_result;
v_decin := floor(v_decin / 2);
END LOOP;
RETURN v_result;
END dec_to_bin; FUNCTION hex_to_bin (hexin IN VARCHAR2) RETURN NUMBER IS
BEGIN
RETURN dec_to_bin(hex_to_dec(hexin));
END hex_to_bin; FUNCTION bin_to_hex (binin IN NUMBER) RETURN VARCHAR2 IS
BEGIN
RETURN dec_to_hex(bin_to_dec(binin));
END bin_to_hex; FUNCTION oct_to_bin (octin IN NUMBER) RETURN NUMBER IS
BEGIN
RETURN dec_to_bin(oct_to_dec(octin));
END oct_to_bin; FUNCTION bin_to_oct (binin IN NUMBER) RETURN NUMBER IS
BEGIN
RETURN dec_to_oct(bin_to_dec(binin));
END bin_to_oct; FUNCTION oct_to_hex (octin IN NUMBER) RETURN VARCHAR2 IS
BEGIN
RETURN dec_to_hex(oct_to_dec(octin));
END oct_to_hex; FUNCTION hex_to_oct (hexin IN VARCHAR2) RETURN NUMBER IS
BEGIN
RETURN dec_to_oct(hex_to_dec(hexin));
END hex_to_oct; END base_convert;
c. 包中函数的调用,如:base_convert.hex_to_dec(hexString)
oracle存储过程、函数、序列、包的更多相关文章
- Oracle存储过程和程序包
一.为什么要用存储过程? 如果在应用程序中经常需要执行特定的操作,可以基于这些操作简历一个特定的过程.通过使用过程可以简化客户端程序的开发和维护,而且还能提高客户端程序的运行性能. 二.过程的优点? ...
- oracle 过程函数,包的区别和联系
一.过程与函数区别 1.过程可以有0~N个返回参数,通过OUT or IN OUT参数返回:函数有且仅有1个返回值,通过return语句返回. 2.调用过程时,可做为单独的语句执行:调用函数时,函数必 ...
- oracle存储过程函数
1.函数 create or replace function get_Destroy_no return varchar2 is Result varchar2(50);begin SELECT m ...
- Oracle存储过程 函数 计算使用资源
目录 存储过程与函数 存储过程的优势 存储过程 打印语句 选择语句 函数 计算使用资源 存储过程与函数 存储过程的优势 存储过程 /* 多行注释 */ -- 单行注释 //展示错误信息 show er ...
- hibernate调用oracle存储过程||函数
pakeage dao.Impl; //调用函数FUN_GET(); public String get(String Id,String Name){ return getSession().cre ...
- Oracle中如何导出存储过程、函数、包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句?
Oracle中如何导出存储过程.函数.包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句? QQ群里有人问:如何导出一个用户下的存储过程? 麦苗答:方法有多种,可以使用DBMS_MET ...
- oracle 存储过程,存储函数,包,
http://heisetoufa.iteye.com/blog/366957 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过 ...
- oracle存储过程和存储函数&触发器
oracle存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程,存储函数 存储过程和存储函数的相同点:完成特定功能的程序 存储过程和存储函数的区别:是否用return语句返回值 ...
- oracle中函数和存储过程的区别和联系【转载竹沥半夏】
oracle中函数和存储过程的区别和联系[转载竹沥半夏] 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己 ...
- oracle 存储过程 包 【转】
一.为什么要用存储过程? 如果在应用程序中经常需要执行特定的操作,可以基于这些操作简历一个特定的过程.通过使用过程可以简化客户端程序的开发和维护,而且还能提高客户端程序的运行性能. 二.过程的优点? ...
随机推荐
- 第 26 章 CSS3 动画效果
学习要点: 1.动画简介 2.属性详解 3.简写和版本 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS3 的动画效果,可以通过类似 Flash 那样的关键帧模式控制运行. 一.动画简介 CSS ...
- Gym 100703G---Game of numbers(DP)
题目链接 http://vjudge.net/contest/132391#problem/G Description standard input/outputStatements — It' s ...
- PHP替代正则匹配的高效函数
strpos() - 查找字符串首次出现的位置 strrpos() 函数查找字符串在另一字符串中最后一次出现的位置(区分大小写). strripos() 函数查找字符串在另一字符串中最后一次出现的位置 ...
- 15款优雅的 WordPress 电子商务网站主题
WordPress 电子商务网站主题今年非常流行,特别是对那些想要在几分钟内创建一个在线商店,但又没有掌握网络开发的很多知识的人来说.WordPress 是一个功能强大的 CMS,它的灵活性和可用性是 ...
- 国外经典设计:12个漂亮的移动APP网站案例
优秀的移动应用程序网站是设计灵感的重要来源.从美丽的图像,合理的使用空白到排版和颜色的使用,似乎设计师都加倍努力以创造一些美好和独特的设计来推广自己的应用程序. 因此,在这篇文章中,我们已经聚集了13 ...
- Font Combiner – 自定义网页字体和图标生成工具
Font Combiner 是一个功能丰富的 Web 字体生成工具和字体改进工具,提供字距调整.构造子集.各种提示选项和自定义字体字形组合.您可以生成您自己的自定义字体的格式和文件大小. 另外还有成千 ...
- MyEclipse之无法连接到MySQL数据库
问题描述: 在连接mysql中出现如下警告 Fri Oct 28 02:21:53 CST 2016 WARN: Establishing SSL connection without server' ...
- 对比MS Test与NUnit Test框架
前言: 项目中进行Unit Test时,肯定会用到框架,因为这样能够更快捷.方便的进行测试. .Net环境下的测试框架非常多,在这里只是对MS Test和NUnit Test进行一下比较, 因为这两个 ...
- crm2013关于contentIFrame不能使用
在CRM2011里面,我们可以在页面的控制台里面输入: contentIFrame.Xrm.Page.data.entity.getEntityName(); contentIFrame.Xrm.Pa ...
- Android基础面试题
1. 请描述一下Activity 生命周期. 答: 如下图所示.共有七个周期函数,按顺序分别是: onCreate(), onStart(), onRestart(), onResume(), onP ...