函数   

oracle 自定义函数入门

主题:ORACLE函数大全

###############################

set operators UNION, UNION ALL, INTERSECT, and MINUS
这三个操作符优先级相同,从左至右,除非有括号

单库单表操作,单库多表操作,多库多表操作(用到dblink)

transcendental function  超越函数,如:sin,cos,tan等

函数相似于操作符,它们都维护数据项并返回结果,在参数格式上又不同于操作符

没有任何参数的函数与伪列相似

伪列每行返回不同的值

没有任何参数的函数每行返回一样的值

二者相互转换

select nls_charset_name(2) from dual

select nls_charset_id('we8dec') from dual

以下三个的列名是不一样的

select length('canada') from dual  length('canada')作为列名并且大写

select length('canada') woshi from dual  woshi作为列名并且大字  单字节字符集返回6,如果是双字节数据库字符集返回12

select length('canada') “woshi” from dual  woshi作为列名原样输出(引号里是什么就是什么)  单字节字符集返回6,如果是双字节数据库字符集返回12

SELECT CONCAT(CONCAT(last_name, '''s job category is '), job_id) "Job"
FROM employees
WHERE employee_id = 152;

concat  This function is equivalent to the concatenation operator (||).

比较函数

SELECT GREATEST('HARRY', 'HARRIOT', 'HAROLD') "Greatest" FROM DUAL;
SELECT GREATEST (1, '3.925', '2.4') "Greatest" FROM DUAL;

环境与标识函数

用pl/sql 包查询主机名与ip
select UTL_INADDR.get_host_name,UTL_INADDR.get_host_address () from dual;

userenv向后兼容的目的,建议用sys_context('userenv','language')
select userenv('language') from dual;
select sys_context('userenv','language') from dual;

select uid,user from dual;
118    KYC_LCP

select userenv('terminal') from dual

select userenv('sid') from dual

select user,uid from dual

select sys_guid() from dual;
4F182AF24662344CE0536614A8C09E8C
select sys_context('userenv','host') from dual;
DESKTOP-NMUHAH0

select sys_guid() from dual;
4F182AF24662344CE0536614A8C09E8C
select sys_context('userenv','host') from dual;
DESKTOP-NMUHAH0
select sys_context('userenv','identification_type') from dual;
LOCAL select sys_context('userenv','ip_address') from dual;
36.47.162.72
select sys_context('userenv','isdba') from dual;
FALSE
select sys_context('userenv','lang') from dual;
US
select sys_context('userenv','language') from dual;
AMERICAN_AMERICA.ZHS16GBK
select sys_context('userenv','module') from dual;
SQL Developer或者
sqlplus@19-stdg (TNS V1-V3)
select sys_context('userenv','network_protocol') from dual;
tcp
select sys_context('userenv','nls_calendar') from dual;
GREGORIAN
select sys_context('userenv','nls_date_format') from dual;
DD-MON-RR
select sys_context('userenv','os_user') from dual;
fgy
select sys_context('userenv','server_host') from dual;
cu-102-db
select sys_context('userenv','session_userid') from dual;
118
select sys_context('userenv','sessionid') from dual;
780427
select sys_context('userenv','sid') from dual;
1520
select sys_context('userenv','terminal') from dual;
unknown(sql developer显示这个)
pts/1(sqlplus显示这个)

先查询某个字段并排序
select org_id from user_orgop_relation order by org_id desc;
根据上面结果,去一下重
select distinct org_id from user_orgop_relation order by org_id desc;
应用一下聚合函数,查看某个字段重复出现的次数
select org_id,count(org_id) from user_orgop_relation group by org_id order by org_id desc;
应用一下数学函数,其实min,max通过order by 中的第一个与最后一个可以看出来
select min(org_id) from user_orgop_relation;
数学函数可以嵌套,但是必须有group by子句
select avg(min(org_id)) from user_orgop_relation group by user_id;

数字函数
select abs(-20) "absolute" from dual;

###############################

dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录。我们可以用它来做很多事情,
1、查看当前用户,可以在 SQL Plus中执行下面语句
select user from dual;
2、用来调用系统函数
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;--获得当前系统时间
select SYS_CONTEXT('USERENV','TERMINAL') from dual;--获得主机名
select SYS_CONTEXT('USERENV','language') from dual;--获得当前 locale
select dbms_random.random from dual;--获得一个随机数
3、得到序列的下一个值或当前值,用下面语句
select your_sequence.nextval from dual;--获得序列your_sequence的下一个值
select your_sequence.currval from dual;--获得序列your_sequence的当前值
4、可以用做计算器
select 7*9 from dual;
select sysdate from dual;

Oracle系统中dual表是一个“神秘”的表,网上有很多网友都对该表进行了测试,该表只有一行一列,其实该表和系统中的其他表一样,一样可以执行插入、更新、删除操作,还可以执行drop操作。但是不要去执行drop表的操作,否则会使系统不能用,数据库起不了,会报Database startup crashes with ORA-1092错误。此时也不要慌乱,可以通过执行以下步骤来进行恢复。

dual是一个什么对象呢?
SQL> select owner,object_name,object_type from dba_objects where object_name like '%DUAL%';

OWNER                OBJECT_NAM OBJECT_TYPE
-------------------- ---------- -------------------
SYS                  DUAL       TABLE
PUBLIC               DUAL       SYNONYM
原来DUAL是属于SYS schema的一个表,然后以PUBLIC SYNONYM的方式供其他数据库USER使用.
再看看它的结构:
desc dual
只有一个名字叫DUMMY的字符型COLUMN.
再查询一下表里的数据
SQL> select dummy from dual;

D
-
X

SQL> insert into dual values ( 'Y');

1 row created.

SQL> commit;

Commit complete.

SQL> select count(*) from dual;

COUNT(*)
----------
         1

刚才插入的那条记录并没有显示出来 ! 明明DUAL表中有两条记录, 可就是只显示一条!
原来ORACLE对DUAL表的操作做了一些内部处理,尽量保证DUAL表中只返回一条记录

select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual;
select chr(54740) zhao,chr(65) chr65 from dual;

一、字符函数
字符函数是oracle中最常用的函数,我们来看看有哪些字符函数:
lower(char):将字符串转化为小写的格式。
upper(char):将字符串转化为大写的格式。
length(char):返回字符串的长度。
substr(char, m, n):截取字符串的子串,n代表取n个字符的意思,不是代表取到第n个
replace(char1, search_string, replace_string)
instr(C1,C2,I,J) -->判断某字符或字符串是否存在,存在返回出现的位置的索引,否则返回小于1;在一个字符串中搜索指定的字符,返回发现指定的字符的位置;
C1 被搜索的字符串
C2 希望搜索的字符串
I 搜索的开始位置,默认为1
J 出现的位置,默认为1

问题:将所有员工的名字按小写的方式显示
SQL> select lower(ename) from emp;
问题:将所有员工的名字按大写的方式显示。
SQL> select upper(ename) from emp;
问题:显示正好为5个字符的员工的姓名。
SQL> select * from emp where length(ename)=5;
问题:显示所有员工姓名的前三个字符。
SQL> select substr(ename, 1, 3) from emp;
问题:以首字母大写,后面小写的方式显示所有员工的姓名。
SQL> select upper(substr(ename,1,1)) || lower(substr(ename,2,length(ename)-1)) from emp;
问题:以首字母小写,后面大写的方式显示所有员工的姓名。
SQL> select lower(substr(ename,1,1)) || upper(substr(ename,2,length(ename)-1)) from emp;
问题:显示所有员工的姓名,用“我是老虎”替换所有“A”
SQL> select replace(ename,'A', '我是老虎') from emp;
问题:instr(char1,char2,[,n[,m]])用法
SQL> select instr('azhangsanbcd', 'zhangsan') from dual; --返回2
SQL> select instr('oracle traning', 'ra', 1, 1) instring from dual; --返回2
SQL> select instr('oracle traning', 'ra', 1, 2) instring from dual; --返回9
SQL> select instr('oracle traning', 'ra', 1, 3) instring from dual; --返回0,根据条件,由于ra只出现二次,第四个参数3,就是说第3次出现ra的位置,显然第3次是没有再出现了,所以结果返回0。注意空格也算一个字符
SQL> select instr('abc','d') from dual;  --返回0

二、数学函数
数学函数的输入参数和返回值的数据类型都是数字类型的。数学函数包括cos,cosh,exp,ln, log,sin,sinh,sqrt,tan,tanh,acos,asin,atan,round等
我们讲最常用的:
round(n,[m]) 该函数用于执行四舍五入,
如果省掉m,则四舍五入到整数。
如果m是正数,则四舍五入到小数点的m位后。
如果m是负数,则四舍五入到小数点的m位前。
eg、SELECT round(23.75123) FROM dual; --返回24
SELECT round(23.75123, -1) FROM dual; --返回20
SELECT round(27.75123, -1) FROM dual; --返回30
SELECT round(23.75123, -3) FROM dual; --返回0
SELECT round(23.75123, 1) FROM dual; --返回23.8
SELECT round(23.75123, 2) FROM dual; --返回23.75
SELECT round(23.75123, 3) FROM dual; --返回23.751
trunc(n,[m]) 该函数用于截取数字。
如果省掉m,就截去小数部分,
如果m是正数就截取到小数点的m位后,
如果m是负数,则截取到小数点的前m位。
eg、SELECT trunc(23.75123) FROM dual; --返回23
SELECT trunc(23.75123, -1) FROM dual; --返回20
SELECT trunc(27.75123, -1) FROM dual; --返回20
SELECT trunc(23.75123, -3) FROM dual; --返回0
SELECT trunc(23.75123, 1) FROM dual; --返回23.7
SELECT trunc(23.75123, 2) FROM dual; --返回23.75
SELECT trunc(23.75123, 3) FROM dual; --返回23.751
mod(m,n)取余函数
eg、select mod(10,2) from dual; --返回0
SELECT MOD(10,3) FROM dual; --返回1
floor(n) 返回小于或是等于n的最大整数
ceil(n) 返回大于或是等于n的最小整数
eg、SELECT ceil(24.56) from dual; --返回25
SELECT floor(24.56) from dual; --返回24
abs(n) 返回数字n的绝对值
对数字的处理,在财务系统或银行系统中用的最多,不同的处理方法,对财务报表有不同的结果

三、日期函数
日期函数用于处理date类型的数据。默认情况下日期格式是dd-mon-yy 即“12-7 月-12”
(1)sysdate 返回系统时间
eg、SQL> select sysdate from dual;
(2)oracle add_months函数
oracle add_months(time,months)函数可以得到某一时间之前或之后n个月的时间
eg、select add_months(sysdate,-6) from dual; --该查询的结果是当前时间半年前的时间
select add_months(sysdate,6) from dual; --该查询的结果是当前时间半年后的时间
(3)last_day(d):返回指定日期所在月份的最后一天
问题:查找已经入职8个月多的员工
SQL> select * from emp where sysdate>=add_months(hiredate,8);
问题:显示满10年服务年限的员工的姓名和受雇日期。
SQL> select ename, hiredate from emp where sysdate>=add_months(hiredate,12*10);
问题:对于每个员工,显示其加入公司的天数。
SQL> select floor(sysdate-hiredate) "入职天数",ename from emp;
或者
SQL> select trunc(sysdate-hiredate) "入职天数",ename from emp;
问题:找出各月倒数第3天受雇的所有员工。
SQL> select hiredate,ename from emp where last_day(hiredate)-2=hiredate;
          
四、转换函数
转换函数用于将数据类型从一种转为另外一种。在某些情况下,oracle server允许值的数据类型和实际的不一样,这时oracle server会隐含的转化数据类型
比如:
create table t1(id int);
insert into t1 values('10');--这样oracle会自动的将'10' -->10
create table t2 (id varchar2(10));
insert into t2 values(1); --这样oracle就会自动的将1 -->'1';
我们要说的是尽管oracle可以进行隐含的数据类型的转换,但是它并不适应所有的情况,为了提高程序的可靠性,我们应该使用转换函数进行转换。

to_char()函数
你可以使用select ename, hiredate, sal from emp where deptno = 10;显示信息,可是,在某些情况下,这个并不能满足你的需求。
问题:日期是否可以显示 时/分/秒
SQL> select ename, to_char(hiredate, 'yyyy-mm-dd hh24:mi:ss') from emp;
问题:薪水是否可以显示指定的货币符号
SQL>
yy:两位数字的年份 2004-->04
yyyy:四位数字的年份 2004年
mm:两位数字的月份 8 月-->08
dd:两位数字的天 30 号-->30
hh24: 8点-->20
hh12:8点-->08
mi、ss-->显示分钟\秒
9:显示数字,并忽略前面0
0:显示数字,如位数不足,则用0补齐
.:在指定位置显示小数点
,:在指定位置显示逗号
$:在数字前加美元
L:在数字前面加本地货币符号
C:在数字前面加国际货币符号
G:在指定位置显示组分隔符、
D:在指定位置显示小数点符号(.)

问题:显示薪水的时候,把本地货币单位加在前面
SQL> select ename, to_char(hiredate, 'yyyy-mm-dd hh24:mi:ss'), to_char(sal,'L99999.99') from emp;
问题:显示1980年入职的所有员工
SQL> select * from emp where to_char(hiredate, 'yyyy')=1980;
问题:显示所有12月份入职的员工
SQL> select * from emp where to_char(hiredate, 'mm')=12;
          
to_date()函数
函数to_date用于将字符串转换成date类型的数据。
问题:能否按照中国人习惯的方式年—月—日添加日期。
eg、SELECT to_date('2012-02-18 09:25:30','yyyy-mm-dd hh24:mi:ss') FROM dual;

五、sys_context()系统函数
1)terminal:当前会话客户所对应的终端的标示符,如计算机名
2)language: 语言
3)db_name: 当前数据库名称
4)nls_date_format: 当前会话客户所对应的日期格式
5)session_user: 当前会话客户所对应的数据库用户名
6)current_schema: 当前会话客户所对应的默认方案名
7)host: 返回数据库所在主机的名称
通过该函数,可以查询一些重要信息,比如你正在使用哪个数据库?
select sys_context('USERENV','db_name') from dual;
注意:USERENV是固定的,不能改的,db_name可以换成其它,
例如:
select sys_context('USERENV','language') from dual;
select sys_context('USERENV','current_schema') from dual;

select add_months(sysdate,-4) from dual;
select add_months(sysdate,+4) from dual;
select next_day('2016-06-12','sat') from dual;
select last_day(sysdate) from dual;

############################

函数

power(2,48)   2的48次方

select power(2,5) from dual;

numtoymintervals

numtodsintervals

SELECT last_name, hire_date, salary,
SUM(salary) OVER (ORDER BY hire_date
RANGE NUMTOYMINTERVAL(1,'year') PRECEDING) AS t_sal
FROM employees
ORDER BY last_name, hire_date; SELECT manager_id, last_name, hire_date,
COUNT(*) OVER (PARTITION BY manager_id ORDER BY hire_date
RANGE NUMTODSINTERVAL(100, 'day') PRECEDING) AS t_count
FROM employees
ORDER BY last_name, hire_date;

to_char(number)

语法是to_char(number,'fmt')

select to_char(-1234567890,'9999999999S') from dual;
select to_char(1234567890,'9999999999S') from dual;
select to_char(-1234567890,'S9999999999') from dual;
select to_char(1234567890,'S9999999999') from dual;
select to_char(0,'99.99') from dual;
select to_char(+0.1,'99.99') from dual;
select to_char(-0.2,'99.99') from dual;
select to_char(0,'90.99') from dual;
select to_char(+0.1,'90.99') from dual;
select to_char(-0.2,'90.99') from dual;
select to_char(0,'9999') from dual;
select to_char(1,'9999') from dual;
select to_char(0,'B9999') from dual;
select to_char(1,'B9999') from dual;
select to_char(0,'B90.99') from dual;

to_number  翻译char or varchar2数据类型的值到number数据类型

to_binary_float,to_binary_double  翻译char or varchar2表达式到binary_float或binary_double值

to_...。后面是目的类型

scn_to_timestamp,timestamp_to_scn

select
dbms_flashback.get_system_change_number scn1,
timestamp_to_scn(sysdate) scn2
from dual; select to_char(scn_to_timestamp(42776441), 'yyyy-mm-dd hh24:mi:ss') chr,
timestamp_to_scn(scn_to_timestamp(42776441)) dt
from dual;

select dbtimezone,sessiontimezone,current_date,systimestamp, from dual;

length

默认是按照字符来计算长度的
select length(bus_number) from tis_pay_account
where bus_number='陕D78006'; lengthb是按照字节来算的
如果是双字节数据库字符集,
select lengthb(bus_number) from tis_pay_account
where bus_number='陕D78006';

instr

返回number数据类型
如果找到,instr函数返回一个integer,指示位置。
如果没找到,instr函数返回0。
下面这个条件
instr(account_login,'187')>0; 其实instr共有4个参数,格式为“instr(string, substring, startposition, occurrence)”。可实现子串的如下搜索: 从字符串'oracle'的第一个位置开始,向后查找第一个出现子串'or'出现的位置。
select instr('Oracle','or') position from dual;
从第3个字符开始搜索
select instr('oracleor','or', 3) position from dual;
从第1个字符开始,搜索第2次出现子串的位置
select instr('oracleor','or', 1, 2) position from dual;
从倒数第1个字符开始,搜索第1次出现子串的位置
select instr('oracleor','or', -1, 1) position from dual;
从倒数第1个字符开始,搜索第2次出现子串的位置
select instr('oracleor','or', -1, 2) position from dual; oracle用instr代替like instr(title,'oracle’)>0 相当于like
instr(title,'oracle’)=0 相当于not like SQL> set timing on
SQL> select count(*) from Tis_pay_account_day_stats
2 where instr(account_login,'187')>0; COUNT(*)
----------
127900 Elapsed: 00:00:00.26
SQL> select count(*) from Tis_pay_account_day_stats
2 where instr(account_login,'18')>0; COUNT(*)
----------
725480 Elapsed: 00:00:00.28

############################

LNNVL provides a concise way to evaluate a condition when one or both operands of
the condition may be null.

create table t1(name varchar2(20),year number);
insert into t1 values('t12001',2001);
insert into t1 values('t12002',2002);
insert into t1 values('t12003',2003);
insert into t1 values('t12004',2004);
insert into t1 values('t12005',null);
insert into t1 values('t12006',2006);
insert into t1 values('t12007',null);
insert into t1 values('t12008',2008);
insert into t1 values('t12009',2009);
insert into t1 values('t12010',2010); --下面这样是查不到空的行
select * from t1
where year !=2001
--要么下面这个
select * from t1
where year !=2001 or year is null;
--要么下面这个,这个更方便
select * from t1
where lnnvl(year = 2001); LNNVL provides a concise way to evaluate a condition when one or both operands of
the condition may be null.
lnnvl提供一个简明的方式来计算一个条件,当一个或条件的两个操作数可能为空时
concise adj. 简明的,简洁的 select * from t1
--where year < 2008;
--where lnnvl(year < 2008);
--where lnnvl(year is null);
--where lnnvl(year is not null);
where lnnvl(year = 2008);

oracle schema object的更多相关文章

  1. Oracle Schema Objects(Schema Object Storage And Type)

    One characteristic of an RDBMS is the independence of physical data storage from logical data struct ...

  2. oracle schema 白话文详解

    概述: (一)什么Oracle叫用户(user): A user is a name defined in the database that can connect to and access ob ...

  3. Oracle Schema Objects——伪列ROWID Pseudocolumn(ROWNUM、ROWID)

    Oracle Schema Objects Oracle Schema Objects——Tables——Oracle Data Types Oracle伪列 在Oracle数据库之中为了实现完整的关 ...

  4. Oracle schema 的含义

    方案(Schema)为数据库对象的集合,为了区分各个集合,我们需要给这个集合起个名字,这些名字就是我们在企业管理器的方案下看到的许多类似用户名的节点,这些类似用户名的节点其实就是一个schema,sc ...

  5. Oracle Schema Objects——Tables——TableStorage

    Oracle Schema Objects Table Storage Oracle数据库如何保存表数据? Oracle Database uses a data segment in a table ...

  6. Oracle Schema

    1.这是Schema的definition: A schema is a collection of database objects (used by a user.) Schema objects ...

  7. Oracle Schema Objects——Tables——TableType

    Oracle Schema Objects Object Tables object type An Oracle object type is a user-defined type with a ...

  8. Oracle Schema Objects——Tables——Overview of Tables

    Oracle Schema Objects Overview of Tables A table is the basic unit of data organization in an Oracle ...

  9. Oracle Schema Objects——PARTITION

    Oracle Schema Objects 表分区 表- - 分区( partition )TABLE PARTITION 一段时间给出一个分区,这样方便数据的管理. 可以按照范围range分区,列表 ...

随机推荐

  1. Linux在IA-32体系结构下的地址映射

    1.概览 2.逻辑地址到线性地址 逻辑地址到线性地址的映射在IA-32体系结构中又被称为段式映射.如上图所示,段式映射我们首先需要获取逻辑地址和段选择符,段选择符用于获取GDT中段的基地址,将逻辑地址 ...

  2. BZOJ 3782 上学路线

    首先这个题需要dp.dp[i]=C(x[i]+y[i],x[i])-Σdp[j]*C(x[i]-x[j]+y[i]-y[j],x[i]-x[j])(x[i]>=x[j],y[i]>=y[j ...

  3. Unity3D入门(一):环境搭建

    1.Unity3D 目前最新正式版本是4.2.1f  官网下载,以前的版本安装时候需要序列号激活,新版本4.2.1f 不需要,完全免费,但发布的时候需要许可证 2.要学习的同学,下载频道可以找到破解补 ...

  4. 【LEETCODE OJ】Binary Tree Preorder Traversal

    Problem Link: http://oj.leetcode.com/problems/binary-tree-preorder-traversal/ Even iterative solutio ...

  5. 查单神器v1.0 升级 →B站看鬼畜神器v1.0

    去年学校实习,我去了一家快递输单公司工作.工作任务就是把运单图片上的内容(寄件人,地址之类)输入到公司的数据库里.每天输单结束后,还要对一些容易错的运单进行排查.单量多的时候一天甚至要查千张以上的运单 ...

  6. mysql主从同步报slave_sql_running:no的解决方案

    1.没有正确设置server_id(如没有正确设置从配置项) ps:可手动设置server_id 2.slave stop;set global sql_slave_skip_counter=1;sl ...

  7. HDU 4666

    http://acm.hdu.edu.cn/showproblem.php?pid=4666 求m维最远曼哈顿距离 借鉴别人的思路http://www.cnblogs.com/jackge/archi ...

  8. js 字符串转化成数字:(实例:用正则检测大于0的正数,最多保留4位小数)

    来源:http://www.cnblogs.com/hwx0807/archive/2011/06/28/2092021.html 实例: function BindSubmitEvent() { / ...

  9. LeetCode Set Matrix Zeroes(技巧+逻辑)

    题意: 给一个n*m的矩阵,如果某个格子中的数字为0,则将其所在行和列全部置为0.(注:新置的0不必操作) 思路: 主要的问题是怎样区分哪些是新来的0? 方法(1):将矩阵复制多一个,根据副本来操作原 ...

  10. window8快捷键

    win8中有很多比较重要的快捷键经常忘记: cmd快捷键:win+x; 截图工具:win+q; 添加环境变量:右键点击左下角window图标; 添加定时任务:右键点击计算机管理->任务计划程序.