白嫖就完了
重装。。。。
前后必须一致
developer是指的pl/sql developer?
http://blog.sina.com.cn/s/blog_53a1165e01016ja9.html
一张虚表,dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录。我们可以用它来做很多事情。
CSDN上有很多
select * from emp where (sysdate - regdate ) > (365 * 5);
日期相减可以获取相隔天数。
慕课上面的讲的很好啊。。collen7788老师讲的很不错,,值得学习,触发器,存储过程,存储函数,高级查询,plsql,你就这么学等等
INITCAP(字符串 | 列):开头首字母大写;
看下?
只能匹配第一个 然后如果第一个没有就不可以去除,就直接结束 ,如果第一个是 就去除 然后看第二个 ,第二个是就去除 不是就结束
一般,如果你以前对基础函数比较扎实的话可以不用学习,如果你是零基础的话建议你看一遍对你很有用的哦
你这问题回答方式
1、能够掌握Oracle的常用函数 2、能够在查询中熟练使用Oracle函数,以方便数据的查询统计。
先通学一遍,尽量多记,等到用的时候至少知道有这个函数,记不住的在百度。
带耳机会好很多
你知道啊 1、能够掌握Oracle的常用函数 2、能够在查询中熟练使用Oracle函数,以方便数据的查询统计
trim(c2 from c1) 表示从c1字符串中去除c2这个字符,注意截取集只能有一个字符;
例:select trim('a' from 'abc') from dual; 结果为bc
如果写成select trim('ab' from 'abc') from dual;就会提示出错
注意:只能匹配第一个 然后如果第一个没有就不可以去除,就直接结束 ,如果第一个是 就去除 然后看第二个 ,第二个是就去除 不是就结束
例:select trim(‘b’ from ‘abc’) from dual;
结果:abc
MOD(m,n)的意思是m对n取余数,如MOD(5,2)即5÷2=2...1,5除以2等于2余1,余数即那个1,任何数对0取余都是他本身
函数分类
内置函数:数值函数、字符函数、日期函数、转换函数
1、数值函数
(1)、四舍五入
round(n,m)
省略m:默认为:0
m>0:小数点后m位
m<0:小数点前m位
注意:oracle中不能直接使用函数,必须包含一个目标表dual,即select 函数 from dual; (dual作为目标表)
如:select round(23.4),round(23.45,1),round(23.45,-1) from dual;
结果:23 23.5 20
(2)、取整函数
ceil(n):--取最大值
floor(n):--取最小值
如:select ceil(23.45),floor(23.45) from dual;
结果:24 23
(3)、常用计算
1)取绝对值:abs(n)
如:select abs(23.45),abs(-23) from dual;
结果:23.45 23
2)取余数:mod(m,n)
如果m和n中有一个为null值,则结果为null
如:select mod(5,2),mod(5,null) from dual;
结果:1
3)数值的n次幂:power(m,n)
如:23用power(2,3)表示,结果8
Select power(2,3),power(null,2) from dual;
结果:8、有null值,则结果也为null
4)平方根:sqrt(n)
如:Select sqrt(16),sqrt(null) from dual;
结果:4、有null值,则结果也为null
(4)、三角函数
sin(n) 、asin(n) 反正弦
cos(n)、acos(n) 反余弦
tan(n)、atan(n) 反真切
例:select sin(3.14159265359/6) from dual;
结果:0.5
2.字符函数
(1)、大小写转换函数
1)upper(chars):表示全部转大写
2)lower(chars):表示全部转小写
3)initcap(chars):表示把首字母大写,后面的字符全部小写
(2)、获取子字符串函数
substr(char,[m,n]) m表示取子串的开始位置 n表示截取子串的位数
例:select substr('abcde',2,3) ,substr('abcde',2),substr('abcde',-2,1) from dual;
结果为: bcd bcde d
注意:m=0表示从首字母开始截取,n可以省略表示从m的位置截取到字符串末尾;
如果m=0且省略n那么结果仍为源字符串;
如果m为负数表示从字符串的尾部开始截取
select substr('abcdefg',-5,4) from dual;
结果:cdef
3、日期函数
1)、系统函数
sysdate
默认格式:DD-MON-RR(日月年)
如:Select sysdate from dual;
2)、日期操作
①add_months(date,i)
如:select add_months(sysdate,3),add_months(sysdate,-3) from dual;
结果:04-9月 -16 04-3月 -16
②next_day(date,char)
如:select next_day(sysdate,'星期日') from dual;;
结果:显示下一个的周日的日期 05-6月 -16
③last_day(date)
如:select last_day(sysdate) from dual;
结果:查看当月最后一天 30-6月 -16
④months——between(date1,date2)
如:select months_between(sysdate,'4-8月-16') from dual;
结果:查看两个日期之间相隔的月份,返回值是小数 -2
PS:要获取两个日期相隔多少天,可以用两个日期直接相减得到多少天。
⑤extract(date from datetime)--获取时间戳
如:select extract(year from sysdate) from dual;(month或者day)
如果想得到时分秒,例子如下:(用timestamp)
select extract(hour from timestamp '2016-10-1 9:56:4') from dual;
(minute或second)
4、转换函数
1)、日期转换成字符的函数
to_char(date,fmt,params)
参数说明:
date:将要转换的日期
fmt:转换的格式
params:日期的语言
默认格式:DD-MON-RR(天月年)
YY YYYY YEAR(年)
MM MONTH(月)
DD DAY(天)
HH24 HH12(24、12制)
MI(分) SS(秒)
如:select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual;
结果:2016-06-04 10:03:50
2)、字符转换成日期的函数
to_date(char,fmt,params)
params:用于指定日期的语言(一般不写)
如:select to_date('2016-05-22','YYYY-MM-DD') from dual;
注意:to_date() 按照系统默认格式显示日期
3)、数字转换成字符的函数
to_char(number,fmt)
9:显示数字并忽略前面的0
0:显示数字,位数不足,用0补齐
.或D:显示小数点
,或G:显示千位符
$:美元符号
S:加正负号(前后都可以,但不可同时加)
如:select to_char(5123.456,'S$99,999.99')from dual;
结果:+$5,123.46
4)、字符转换成数字的函数
to_number(char,fmt)
fmt是转换的格式,可以省略
如:select to_number('$2,000','$9999') from dual;
结果:2000
无法直接保存到excel中,但是可以保存到csv文件,同样是excel的格式,方法如下:
譬如要把文件生成在d盘下的test目录下:
1,在d盘根目录下新建test目录
2,sqlplus以system用sysdba登录
3,create or replace directory TMP as ’d:\test’;
4,grant read on directory TMP to user;
5,alter system set utl_file_dir='d:\test' scope=spfile;
然后建立存储过程,表是随便建了一个,最后的文件名按要求需要按照当前日期的前一天生成,所以后边文件名的地方write_file_name处就按照要求来了
create or replace PROCEDURE SP_OUTPUT
(
on_flag OUT NUMBER,
out_reason OUT VARCHAR2)
is
v_code number;
v_text varchar2(255);
file_handle utl_file.file_type;
Write_content VARCHAR2(1024);
Write_file_name VARCHAR2(50);
v_aaa varchar2(5);
v_bbb varchar2(5);
cursor cur_sp_out
is
select aaa,bbb
from aaa;
begin
open cur_sp_out;
loop
fetch cur_sp_out into v_aaa,v_bbb;
exit when cur_sp_out%notfound;
write_file_name := to_char(SYSDATE,'YYYYMMDD')||'.xls';
file_handle := utl_file.fopen('TMP',write_file_name,'a');
write_content := v_aaa||' '||v_bbb;
--write file
IF utl_file.is_open(file_handle) THEN
utl_file.put_line(file_handle,write_content);
END IF;
--close file
utl_file.fclose(file_handle);
end loop;
close cur_sp_out;
v_code := 0;
v_text := '完成';
exception
when others then
on_flag := SQLCODE;
out_reason := SQLERRM;
begin
IF utl_file.is_open(file_handle) THEN
utl_file.fclose(file_handle);
end IF;
end;
rollback;
end;
这样基本就完成了,但是建立完毕后需要重启数据库,否则文件写不进指定的目录下
需要注意的是: write_content := v_aaa||' '||v_bbb; 这个位置
v_aaa|| 和v_bbb中间引号的地方是TAB符,否则输出来的XLS文件中,会把这些字符串合在一个单元格中。