oracle函数存储过程序列
Posted 大饼酥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 \'0\' AND \'9\' 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 \'0\' AND \'7\' 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以上是关于oracle函数存储过程序列的主要内容,如果未能解决你的问题,请参考以下文章oracle学习之第一个存储过程:打印Hello World