Case 1:
1,查询结果显示不好看,但是每次都SET LINESIZE、PAGESIZE又太麻烦。
2,用edit命令编辑缓冲区内容(上一条命令),有时不弹出窗口,因为默认编辑器可能设置错了,windows一般设置记事本。
方法:
1,找到安装目录下的\sqlplus\admin\glogin.sql(我的:D:\myProgram\Oracle10\sqlplus\admin\glogin.sql)
2,编辑文件,在最后添加下面字段后保存:
define _editor=notepad
set pagesize 9999
set linesize 200
Case 2: SQLPLUS不支持按上下键来获取缓冲区内容(11G以前的版本)。
方法:
在DOS下登陆SQLPLUS(登陆方法 运行cmd--->执行 sqlplus "登录名/密码" 如sqlplus "scott/tiger"),用DOS的上下键获取。
Case 3: 实现ID自增长。
方法:
---------表test1,触发器trig1,序列test1_seq搭配实现表ID的自动增长------------ DROP TABLE test1; DROP SEQUENCE test1_seq; DROP TRIGGER trig1; CREATE TABLE test1( id NUMBER PRIMARY KEY, uname VARCHAR(10), age NUMBER); CREATE SEQUENCE test1_seq INCREMENT BY 1 -- 每次加几个 START WITH 1 -- 从1开始计数 NOMAXVALUE -- 不设置最大值 NOCYCLE -- 一直累加,不循环 NOCACHE -- 不建缓冲区; CREATE TRIGGER trig1 BEFORE INSERT ON test1 FOR EACH ROW WHEN (new.id IS NULL) BEGIN SELECT test1_seq.nextval INTO:new.id FROM dual; END; /
Case 4: 与标准T_SQL一些小区别
1,表和字段的命名不能以下划线打头;
2,为表取别名不支持AS,如:SELECTcount(*) FROM test2 t2
3,插入数据到表必须有 INTO关键字,不能是:INSERT test4(uname,age) VALUES('zhaoliu',44); --mysql支持
4,用连接查询join与关键字on搭配,on后面需有条件,不能是:SELECT t3.age,t4.uname FROM test3 t3 join test4 t4 --mysql支持
Case 5: 用户登录几次不成功被锁定,需要解锁比如JDBC操作的时候
方法:
1, 用system或sys用户登陆
2,ALTER USER username ACCOUNT UNLOCK;
Case 6: 忘记管理员密码或者修改用户密码
方法:
1,用system或sys用户登陆;
如果服务器在本机,忘记密码也可以直接登录,名字密码都随便,但是要加 as sysdba( 如名字为:aaa as sysdba 密码:bbb);
这是因为当前使用电脑的用户已经通过管理员验证,加as sysdba相当于跳过Oracle本地验证; 如远程连接则不行。
2,修改管理员或者用户的密码:alter user user01 identified by 123(把USER01用户密码修改为123)
Case 7:Oracle解锁
Oracle解锁和修改密码的语句:
用户已经被锁住了,一般是用错误的密码尝试次数太多,得解锁 用system或sys用户登陆,然后 ALTER USER username ACCOUNT UNLOCK;
ORACLE默认创建2个用户 SYS,密码:change_on_install
SYSTEM,密码:manager 一般登陆时可以输入:D:\>sqlplus "/as sysdba"
或:D:\>sqlplus user/password
Case 8:分钟请使用mi
日期里面的分钟请使用mi,而不要使用mm,因为oracle不区分大小写,所以会把mm当做日期MM来处理
select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual; --v
select to_char(sysdate,'yyyy-MM-dd HH24:mm:ss') from
dual; --x
Case 9:返回字段列名统一大写
oracle不区分大小写,查询返回的时候列名全转为大写
例:
select t.pk_id pk_id,
t.taskid taskid,
t.submittimes submittimes,
t.updated_date updated_date,
tl.taskname taskname,
fa.fa_name fa_name
from eoa_to_pases_task_for_trriger t,
f_account fa
返回:
PK_ID 162CDE760D373559E0531580140A301B
TASKID N0000000000101360672
SUBMITTIMES 12
UPDATED_DATE 2015-05-16 13:10:02
TASKNAME app中奖名单_lingpeng9
FA_NAME 谢和坤
Case 10:日期比较,查询最近几天(trunc)
(1) 查询最近七天的数据(trunc能将日期截取到天)
select t.updated_date, trunc(sysdate) - trunc(t.updated_date)
from EOA_TO_PASES_TASK_FOR_TRRIGER t
where trunc(sysdate) - trunc(t.updated_date) <= 7;
如果不使用trunc可能出现误差,因为包含了时分秒的加减,一天照24小时转换
select t.updated_date, (sysdate - t.updated_date)
from EOA_TO_PASES_TASK_FOR_TRRIGER t
where (sysdate - 7) <= t.updated_date;
Case 11: ROUND(四舍五入)和TRUNC(按精度截取)
(1)
SQL> select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual;
ROUND(55.5)
ROUND(-55.4) TRUNC(55.5) TRUNC(-55.5)
----------- ------------ ----------- ------------
56
-55
55 -55
decode 函数及其用法: 参考http://blog.csdn.net/oscar999/article/details/18399177
decode (expression, search_1, result_1, search_2, result_2)
decode (expression, search_1, result_1, search_2, result_2, default)比较表达式和搜索字,如果匹配,返回结果;如果不匹配,返回default值;如果未定义default值,则返回空值。
使用:
条件语句:统计男女各数
select count(decode(FA_HAVEACCOUNT,'1',1)) ,count(decode(FA_HAVEACCOUNT,'0',0)) from f_account f;
select count(*) from f_account f where FA_HAVEACCOUNT='1';
select count(*) from f_account f where FA_HAVEACCOUNT='0';
自定义排序:
select PK_ID, TASKID, SUBMITTIMES, FLAG
from (select PK_ID, TASKID, SUBMITTIMES, FLAG
from EOA_TO_PASES_TASK_FOR_TRRIGER t
where (t.flag = 0)
OR (t.flag = 1 AND ROUND(TO_NUMBER(sysdate - t.updated_date) * 24 * 60) > 10)
OR (t.flag = -1
AND t.submittimes>=10
AND (TRUNC(sysdate) - TRUNC(t.created_date)) <= (select item_value from e_syspara where item_name = 'autoReSubmitToPasesDays')
AND TRUNC(t.updated_date)!=TRUNC(sysdate))
ORDER BY decode(t.flag, 0, 1, 1, 2, -1, 3), t.created_date desc)
行列转换:
往以上table 再插入一些其他学生的成绩:
- insert into student_score (name,subject,score)values('li shi','Chinese',96);
- insert into student_score (name,subject,score)values('li shi','Mathematics',86);
- insert into student_score (name,subject,score)values('li shi','English',76);
- insert into student_score (name,subject,score)values('wang wu','Chinese',92);
- insert into student_score (name,subject,score)values('wang wu','Mathematics',82);
- insert into student_score (name,subject,score)values('wang wu','English',72);
使用以下SQL:
- select name,
- sum(decode(subject, 'Chinese', nvl(score, 0), 0)) "Chinese",
- sum(decode(subject, 'Mathematics', nvl(score, 0), 0)) "Mathematics",
- sum(decode(subject, 'English', nvl(score, 0), 0)) "English"
- from student_score
- group by name;
返回:
Oracle trunc()函数的用法
--Oracle trunc()函数的用法
/**************日期********************/
1.select trunc(sysdate) from dual --2013-01-06 今天的日期为2013-01-06
2.select trunc(sysdate, 'mm') from dual --2013-01-01 返回当月第一天.
3.select trunc(sysdate,'yy') from dual --2013-01-01 返回当年第一天
4.select trunc(sysdate,'dd') from dual --2013-01-06 返回当前年月日
5.select trunc(sysdate,'yyyy') from dual --2013-01-01 返回当年第一天
6.select trunc(sysdate,'d') from dual --2013-01-06 (星期天)返回当前星期的第一天
7.select trunc(sysdate, 'hh') from dual --2013-01-06 17:00:00 当前时间为17:35
8.select trunc(sysdate, 'mi') from dual --2013-01-06 17:35:00 TRUNC()函数没有秒的精确
/***************数字********************/
/*
TRUNC(number,num_digits)
Number 需要截尾取整的数字。
Num_digits 用于指定取整精度的数字。Num_digits 的默认值为 0。
TRUNC()函数截取时不进行四舍五入
*/
9.select trunc(123.458) from dual --123
10.select trunc(123.458,0) from dual --123
11.select trunc(123.458,1) from dual --123.4
12.select trunc(123.458,-1) from dual --120
13.select trunc(123.458,-4) from dual --0
14.select trunc(123.458,4) from dual --123.458
15.select trunc(123) from dual --123
16.select trunc(123,1) from dual --123
17.select trunc(123,-1) from dual --120