将汉字转为全拼或返回拼音首字母的函数
最近itpub上有很多关于汉字转拼音的问题,正好今晚有兴致就整理了一下。create or replace type spell_code as object(spell varchar2(10),code number);create or replace type t_spellcode is table of spell_code;--返回拼音与代码的对应关系create or replace function f_getSpellcode return t_spellcode PipelinedisBeginPIPE Row(spell_code('a', -20319)); PIPE Row(spell_code('ai', -20317)); PIPE Row(spell_code('an', -20304)); PIPE Row(spell_code('ang', -20295)); PIPE Row(spell_code('ao', -20292)); PIPE Row(spell_c
一个可以提取汉字的函数
此函数引自itpub,原文http://www.itpub.net/847680.html该函数只适用于 数据库字符集是 ZHS16GBK的,且只提取 6763个简体汉字,也就是一二级汉字但是实际上编码的判断适用于 GB18030, ZHS16GBK, ZHS16CGB231280, GB 13000.1/ISO 10646.1等标准,这些标准对于简体汉字的编码都是一样的写一函数,准确地判断字段是否含有汉字或者提取汉字等 从表里提取汉字, 需要考虑字符集, 不同的字符集汉字的编码有所不同这里以GB2312为例, 写一函数准确地从表里提取简体汉字.假设数据库字符集编码是GB2312, 环境变量(注册表或其它)的字符集也是GB2312编
一个利用substr后转换成number出错的问题
此问题总结自itpub,原文链接http://www.itpub.net/873682.html引入问题SQL> select cashier_no,sum(substr(lpad(time,4),1,2)*60+substr(lpad(time,4),3,2)) mintus from invoice_timewhere cashier 2 _no=112group 3 by cashier_no;CASHIER_NO MINTUS---------- ----------112 9117SQL> select cashier_no,sum(substr(lpad(time,4),1,2)*60+substr(lpad(time,4),3,2)) mintus from invoice_time2 group by cashier_no;ERROR:ORA-01722: invalid numberno rows selected我想问一下,下面这条语句是那里错了??为了分析问题,我们测
利用utl_file读写文件
利用utl包来读写文件需要先设置文件目录已sys用户登录CREATE DIRECTORY recv_area AS 'd:test' ;CREATE DIRECTORY send_area AS 'd:test' ;这样就创建了目录,下面将对此目录的读写权限授予指定的用户GRANT READ,WRITE ON DIRECTORY recv_area TO hanjs;GRANT READ,WRITE ON DIRECTORY send_area TO hanjs;--GRANT EXECUTE ON utl_file TO hanjs;以hanjs登录,进行测试。确认目录设置信息SELECT * FROM ALL_DIRECTORIES;1 SYS RECV_AREA d:test2 SYS SEND_AREA d:test--写文件的例子CREATE OR REPLACE PROCEDURE CREATE_DIR_WRITE_SAMPLE
oracle中trigger的使用
理论知识:Basic Trigger SyntaxBelow is the syntax for creating a trigger in Oracle (which differs slightly from standard SQL syntax): CREATE [OR REPLACE] TRIGGER <trigger_name> {BEFORE|AFTER} {INSERT|DELETE|UPDATE} ON <table_name> [REFERENCING [NEW AS <new_row_name>] [OLD AS <old_row_name>]] [FOR EACH ROW [WHEN (<trigger_condition>)]] <trigger_body>Some important points to note: You can create only BEFORE and AFTER triggers for tables. (INSTEAD OF
使用XMLELEMENT构建xml信息
目前做个项目中有个接口,接口约定格式为xml,最初我们支持是这样处理的:把查询出来的记录在前台通过dom4j来构建xml信息。后来我通过oracle提供的XMLELEMENT函数来在数据库中构建了,下面把使用方法介绍一下,希望对有这样需求的朋友有帮助!准备测试数据:create table teacher (id varchar2(10),name varchar2(20),remark varchar2(50));create table course (id varchar2(10),name varchar2(50),tid varchar2(10));insert into teacher values ('101','张老师','数学专业硕士);insert into teacher('102','王老师','英语专业硕士');in
分析函数——rollup
原文出处(http://www.itpub.net/showthread.php?threadid=704960&pagenumber=)有一张表test 如下, (NO 学生编号 ,cj 成绩)NO name KM CJ001 张三 语文 80 001 张三 数学 86 001 张三 英语 75 002 李四 语文 78 002 李四 数学 85 002 李四 英语 78 写了以下语句来算每项个科目的总分,select decode(grouping(name),1,'总分',name) 姓名, sum(decode(km, '数学',cj,0)) 数学,sum(decode(km, '英语',cj,0)) 英语, sum(decode(km, '语文',cj,0)) 语文,sum(cj) 总成绩 from test group by rollup(name)结果如下:姓名 数学 英语 语文 总
关于数字求积、求和的处理
1、数字求积(原文处理http://www.itpub.net/434561.html)我们有时可能会有这样的需求,一表A结构大致如下ID QTY1 22 43 64 5要求能够得到QTY字段的乘积2*4*6*5,利用sql如何实现?oldwain是这样处理的,完全利用数学的函数知识解决了。看来要好好温习数学了,呵呵!运用一下数学知识, 可以这样简化:a * b * c = power(10, log(10, a) + log(10, b) + log(10, c)测试数据:create table t (id number, qty number);insert into t values(1, 2);insert into t values(2, 4);insert into t values(3, 6);insert into t values(4, 5);Sele
oracle中几个特殊的函数
1、全角转办角函数 TO_SINGLE_BYTESQL> select TO_SINGLE_BYTE('oracle') from dual;TO_SINGLE_BYTE('ORACLE')------------------------------oracle2、数字转英文,利用to_char、to_dateSQL> select to_char(to_date('12345','J'),'Jsp') en from dual;en----------------------------------------Twelve Thousand Three Hundred Forty-Five不过有限制:一是长度的限制,二是不能转换带小数的SQL> select to_char(to_date('88888882345','J'),'Jsp') from dual;select to_char(to_date('88888882345','J'),'Jsp') f
巧妙的使用decode函数
我们会经常有这样的需求,就是能不能把行转换成列。下面介绍下如何使用decode函数来实现。1、例如有这样一张表:model item timeA1 B1 30A1 B2 40A2 B1 50A2 B2 60想实现这样的效果,如何实现呢? B1 B2A1 30 40A2 50 60select model,sum(decode(item,'B1', time)) B1,sum(decode(item,'B2', time)) B2from table_namegroup by model;model B1 B2A1 30 40A2 50 602、有表A, 包含 ply_no,ins_cde 字段,里面有数据 ply_no ins_cde2006 10012006 1002
oracle中job的使用
一、设置初始化参数 job_queue_processes sql> alter system set job_queue_processes=n;(n>0) job_queue_processes最大值为1000 查看job queue 后台进程 sql>select name,description from v$bgprocess; 二,dbms_job package 用法介绍 包含以下子过程: Broken()过程。 change()过程。 Interval()过程。 Isubmit()过程。 Next_Date()过程。 Remove()过程。 Run()过程。 Submit()过程。 User_Export()过程。 What()过程。 1、Broken()过程更新一个已
分析函数——avg、sum和count
下面通过一个简单的例子,来理解下分析函数中sum、avg和count的用法。需求:计算员工表中各个部门每个员工的平均薪水报告,该平均值由当前员工和与之具有相同经理的前一个和后一个三者的平均数.分析:一要按部门分组,可以按雇佣日期来排序 二设置开窗窗口的大小,ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING这样就可以实现了,为了标识出平均数是如何算出来的,以便更好的理解分析函数。SQL> SELECT deptno, ename, hiredate, sal, 2 AVG(sal) OVER (PARTITION BY deptno ORDER BY hiredate 3 ROWS BETWEEN 1 PRECEDING AND 1
字符串分割的处理
下面是转自itpub上zhouwf0726的一篇文章上对于字符串的处理,但是我个人还是认为写一个字定义函数来处理比较通用。/*怎样支掉字符串中逗号间重复的字符 如 ',1,2,5,9,1,2,5,9,1,2,9,1,2,9,1,2,3,9,1,2,3,9,1,2,9,1,2,9,1,2,3,9,1,2,3,9,'怎样支掉字符串中逗号间重复的字符,并将字符升序排列,得到',1,2,3,5,9,'百思不得其解,是高手的试一下。解答:select col from(select sys_connect_by_path(col,',')||',' col,level from(select col,row_number() over(order by rownum) rn from (select distinct substr(col,instr(col,',',1,rownum
分析函数——lead与lag
lag(expression<,offset><,default>)函数可以访问组内当前行之前的行,而lead(expression<,offset><,default>)函数则正相反,可以反问组内当前行之后的行.其中,offset是正整数,默认为1.因组内第一个条记录没有之前的行,最后一行没有之后的行,default就是用于处理这样的信息,默认为空.注意:这2个函数必须指定 order By 字句.SQL> select id,name,salary,lag(salary) over (order by salary) lag,2 lead(salary) over (order by salary) lead from emp;ID NAME SALARY LAG LEAD---------- ----------
要善于利用pipelined function
Pipelined functions are useful if there is a need for a data source other than a table in a select statement.当不需要利用表来存储而仅仅是一个结果集的话就可以使用这个函数了。问题的提出:itpub xxxzheng表table 1DATE2007-01-012007-01-02.........2007-01-30表table2empId datejc001 2007-01-01jc001 2007-01-02jc001 2007-01-03jc001 2007-01-08jc001 2007-01-20jc002 2007-01-01jc002 2007-01-02jc002 2007-01-02jc003 2007-01-15jc002 2007-01-30 ....................我想的结果是连个表进行连接查询得到DATE ID 2007-01-
translate与replace
Oracle/PLSQL: Translate FunctionIn Oracle/PLSQL, the translate function replaces a sequence of characters in a string with another set of characters. However, it replaces a single character at a time. For example, it will replace the 1st character in the string_to_replace with the 1st character in the replacement_string.Then it will replace the 2nd character in the string_to_replace with the 2nd character in the replacement_string, and so on.The syntax for the translate function is:translate( st
分析函数——first_value()与last_value()
刚开始接触分析函数,总有些头绪梳理不清楚,下面是引用了itpub上nyfor的一些。问题的提出:在使用first_value()或last_value()的时候,同时使用partition和order by会得不到想要的效果。SQL> select deptno,empno,ename,sal,2 last_value(sal) over( partition by deptno )3 from emp;DEPTNO EMPNO ENAME SAL LAST_VALUE(SAL)OVER(PARTITIONB------ ----- ---------- --------- ------------------------------10 7782 CLARK 2450.00 130010 7839 KING 5000.00 130010 7934 MILLER 1300.00 130020 7369 SMITH 800.00 297520 7876 ADAM
分析函数——rank()、dense_rank()与row_number()
在itpub上经常会看到这样的貌似的问题......问题的提出(yuanfang2008)在ORACLE如何用SQL实现最接近某一个值且大于等于这个值的一条记录.例如有如下记录:COL1 COL2 COL3A 1 2007/1/29 上午 06:36:43A 2 2007/1/30 下午 04:06:39B 3 2007/1/29上午04:13:55B 4 2007/1/28下午11:34:41C 5 2007/1/30下午04:06:39C 6 2007/1/29上午05:40:32D 7 2007/1/29上午05:22:17D 8 2007/1/28下午11:34:43A 9 2007/1/30下午03:59:38要求以COL1分组,取出每一分组内,COL3最接近于给出值且大于等于给出值的相应的COL2的值.例如:当我给出时间为2007/1/30 下午
对树型结构表的遍历
职位,部门,政府收支科目等等很多都存在父子关系,在数据存储上我们会利用id与pid的关系来确定,但是在展现上可能就需要借助start with ... connect by来实现了。现在有这样一个表test_treeSQL> desc test_tree;Name Type Nullable Default Comments ----- ------------- -------- ------- -------- ID VARCHAR2(10) Y 代码 NAME VARCHAR2(100) Y 名称 PID VARCHAR2(10) Y 父级代码 LEAF VARCHAR2(3) Y '1' 是否叶子 GLASS VARCHAR2(3) Y
动态生成日期
1、动态生成一年中的日期select to_date('2007-01-01','yyyy-mm-dd')+(rownum-1) 日期 from dual Connect By rownum<=to_char(to_date('20071231', 'yyyymmdd'), 'ddd');注意,上面的语句在10g以上版本可以全部显示,对于92只能显示100条。不过可以利用一个记录数超过366的表来实现。select to_date('2007-01-01','yyyy-mm-dd')+(rownum-1) 日期 from user_objects where rownum<=to_char(to_date('20071231', 'yyyymmdd'), 'ddd');2、动态生成一年中季度与月份的对应Select to_char(日期,'q') 季度,to_char(日期,'yyyy-mm') 年月 f