1.删除重复项, 只保留第一条delete table t1 where t1.ID not in ( select min(t2.ID) from table t2 group by t2.ColName)
2.查找重复记录select t1.ID, count(*) from table group by t1.ID having count(*) > 1 order by count(*) desc
3.导入数据时, 如果目标表存在主键且主键在源表中没有对应的字段时, 使用触发器+序列
create or replace trigger res_circuit_uuid_insert before insert on table for each rowbegin select SEQ_TABLE_ID.Nextval into :new.ID from dual;end ;
4.导入数据(目标表已存在, 目标表没有主键或主键约束禁用)
insert into table2 t2 (
t2.col1, t2.col2, ... )select distinct t1.col1, t1.col1, ...from table1 t1;
5.通过查询直接生成一个新表(结构+数据)
create table new_tableas select * from old_table
nologging
6.通过查询直接生成一个新表(复制表结构)
(1).复制所有字段
create table new_tableas select * from old_tablewhere 1=2;
(2).复制部分字段
create table new_tableas select col1, col2from old_tablenologging;
7.修改表结构
(1). 添加列alter table tableNameADD( col1 col_type, col2 date default sysdate);
(2). 修改列alter table tableNameMODIFY(col1 new_col_type, --更改为新类型 col2 default null);
(3).删除列alter table department DROP(col1, col2...)cascade constraints; --删除相关约束
(4).软删除(标记为 unused 状态);alter table tableNameset UNUSED(col1, col2)cascade constraints;
(5).彻底删除alter table tableNamedrop unused columns;
8.删除表
(1).删除所有记录(适用于记录数量小的表)delete from tableName;
(2).drop table tableName
create table new_tableas select * from old_table;
(3).(适用于大量记录的表)truncate table tableName;
9.表重命名
rename old_tableName to new_tableName
10.添加注释
(1). 给表添加注释comment on table tableNameis '这是一个新表...'
(2). 给列添加注释comment on COLUMN tableName.columnName is'这是一个列'
11.字典表
<1>.用户和概要文件相关的数据字典视图
(1).dba_users--DBA视图描述数据库中的所有用户select * from dba_users db
db.username --用户名db.user_id --用户IDdb.password --口令(加密)db.account_status --账户状态:OPNE || EXPIRED || LOCKEDdb.expiry_date --终止日期db.default_tablespace --表空间db.created --创建日期
(2).all_users--all视图列出当前用户可以看见的用户, --但不予描述, 即只列出 UserName, User_ID, Created(date)select * from all_users
(3).user_users--仅仅列出当前用户的信息select * from user_users
(4).dba_profiles--显示所有的概要文件的资源参数--pro.profile: 概要文件名称--pro.resource_name: 资源名称:如 password_grace_time--pro.resource_type: 资源类型:如:password--pro.limit: 是否限制select * from dba_profiles pro
(5).user_password_limits--通过概要文件为用户设置的口令资源参数视图--resusece_name: 资源名称:failed_login_attempts--limit:限制状态select * from user_password_limits
<2>.权限与角色字典视图
(1).dba_col_privs--DBA视图描述了数据库中的所有列对象的授权select * from dba_col_privs pripri.grantee --用户或角色(因为权限可以直接赋予用户)pri.owner --所有者pri.table_name --(列所属表名称)pri.column_name --列pri.grantor --pri.privilege --权限pri.grantable
(2).user_col_privs--当前用户的所有列对象的授权
(3).dba_tab_privs--DBA视图描述了数据库中的所有对象的(非系统的)授权select * from dba_tab_privs prpr.grantee --用户或角色(被授权者)pr.owner --使用者pr.table_name --表pr.grantor --授权者pr.privilege --权限pr.grantable --是否table对象
(4).user_tab_privs--当前用户被授予的所有 对象的(非系统)授权--对象权限包括:privilege:select, delete, update....select * from user_tab_privs
(5).user_sys_privs--当前用户的所有系统权限select * from user_sys_privs
--系统权限包括:--: create role,rule, type, user, view, table, cluster, trigger--: create library, session, synonym, trigger, sequence, procedure.select * from user_sys_privs p1 where p1.privilege like 'CREATE%'
(6).dba_sys_privs--dba的系统权限select * from dba_sys_privs
(7).user_role_privs--授予给当前用户的角色--userName: 用户名--granted_role: 被授予的角色--admin_option: 此用户下的用户是否可以被继承此用户的角色
(8).role_sys_privs--授予给角色的系统权限的信息--role : name--privilege: 权限
--amdin_option: 是否可以被继承
(9).role_tab_privs--授予给角色的对象的(table)权限--role:Name--owner: user--table_name:tableName--column_name:--privilege:alter, debuge, insert;;;;;
(10).session_privs--用户当前启用的权限
(11).session_roles --用户当前启用的角色
<3>.其他字典表
(1). 注释表user_tab_comments
(2).软删除表user_unused_col_tabs;
12.添加约束
(1).Not NULLAlter table tableName Modify column Not null; 相当于是更改列定义,故为 Modify
(2).Unique Alter table tableNameAdd Unique(col1, col2); 一个列只能定义一个唯一约束(名称) (3).CheckAlter table tableName Add Constraint Check_Col1 Check(col1 betweetn 12 to 34);不适当的数据类型上定义约束条件(如字符类型上定义数字范围)会报错
(4).Foreign KeyAlter table tableName Add Constraint new_FKForeing Key (col1) References tableName2 (col2) on Delete Set NULL; 说明: a: Delete Cascade: 删除子表中所有相关的记录 b: Delete Set NULL: 将所有相关记录的外键列的值设置为NULL c: Delete No Action: 不进行任何操作,关联表没影响 d: 父表: tableName2; 子表: tableName e: 外键不可重复定义(尽管可能名称不同)
13.激活,禁用, 验证约束
(1).激活 CHK_SEX 约束Alter table tableName Enable constraint to CHK_SEX;
(2).激活 Unique 约束Alter table tableNameEnable Unique (col1);
(3).禁用约束 CHK_SEXAlter table tableNameDisable constraint CHK_SEX;
(4).验证约束Alter Table tableNameEnable Validate constraint CHK_SEX;
(5).非验证约束Alter table tableNameEnable NoValidate constraint CHK_SEX;
14.删除约束
(1).删除名称 Chk_Sex约束Alter table tableName Drop Contraint Chk_Sex;
(2).删除 Unique 约束Alter table tableName drop unique (col1);
(3).删除外键 约束Alter table tableName Drop primary key cascade;说明: 加入 casecade表示删除主键时同时会删除 子表中的外键约束
(4).删除 Not NULLAlter Table tableName modify col1 NULL;
15. 修改约束名
(1).alter table tableName rename constraint check_sex to chk_sex;
16.延迟执行约束
原因:有时必须得延迟某个约束比如: 如果某个表有外键约束(子表), 当向此表插入一条数据时, 而此记录数据还没有相应的父表中插入;
因为约束是默认是立即执行的, 这时通不过外键约束, 插入到子表中的记录会被回退.但是如果延迟些外键约束, 把给子表和父表插入记录的过程放在在一个事务中, 用户可以随便颠倒父子表的次序的插入记录当提交事务时再执行外键约束.
e.galter table tableNamemodify constraint FK_tableNameInitially Deferred;
SQL>Insert Into tablName (xx, xx) values (xx, xx);
SQL>Insert Into tableName2(xx, xx) values (xx, xx);
SQL>Commit;
OK!
17.前 n 行
where rownum <= num
18.触发器
create or replace trigger tr_emp_sal_commbefore update of sal, commor delete
on empfor each rowwhen( old.job='salesman') --指定条件: 此触发器只针对销售部门有效begin case when updating ( 'sal') then if :NEW.sal < :OLD.sal then Raise_application_error(-20001, '销售人员工资只能涨不能降'); end if; when deleting then Raise_application_error(-20003, '不能删除emp表的销售人员记录'); end case; end;
19.过程
(1).定义过程
create or replace procedure query_emp(v_no emp.impno%TYPE, v_name out emp.ename%TYPE, v_sal out emp.sal%TYPE)ISe_sal_error exception;beginselect ename, sal --给变量赋值into v_name, v_sal from emp where empon=v_no;
if v_sal <= 2500 thenDBMS_OUTPUT.PUT_LINE('该员工工资: '|| v_sal);Raise e_sal_error; --捕获异常: 如果不符合条件都可以当作异常来对待end if;
exception --抛出异常when no_data_found then dbms_output.put_line('没有该员工':'||v_no);when e_sal_error thendbms_output.put_line('该员工工资高于 2500了');end query_emp;
(2).调用过程
set serveroutput on --开启输出declare v_a1 emp.ename%TYPE;v_a2 emp.sal%TYPE;BEGIN
--调用存储过程;-- => 表示按名称 对应关系;注: 后面必须要有分号query_emp(v_name => v_a1, v_sal => v_a2, v_no => 5678);
if v_a2 > 2500 dbms_output.put_line('工资高于2500')end if; End;
20.函数
(1)创建函数
函数与过程的区别1.函数必须要有 return; 2.函数更侧重于数据相关;过程更侧重于常用操作相关;
create or replace function get_salary_by_deptno(v_dept_no in emp_deptno%TYPE, --输入部门号 v_emp_cnt out number) --输出部门人数
return numberIS
v_sum number(10, 2); --返回指定部门的工资总和
begin select sum(sal), count(*) into v_sum, v_emp_cnt from emp where deptno=v_dept_no;
return v_sum;
end get_salary_by_deptno;
(2)调用函数
set serveroutput ondeclare v_a1 emp.deptno%TYPE;v_a2 number;v_sum number(10,2);
beginv_sum := get_salary_by_deptno(v_emp_cnt => v_a2, v_dept_no => 10);
if v_a2 =0 then --可直接使用 v_a2; 因为它是函数输出的; DBMS_OUTPUT.PUT_LINE('该部门无人');else DBMS_OUTPUT.PUT_LINE('该部门工资总合: ' || v_sum || '人数: ' || va2 );end if; end;
21. Oracle客户端用户管理文件
(Oracle客户端安装目录)
C:\oracle\ora92\network\ADMIN\tnsnames
22.创建序列
create sequence SEQ_TABLE_IDminvalue 1maxvalue 999999start with 10001increment by 1cache 20;
23.游标应用
create or replace procedure curor_check_wrong_cols isbegin EXECUTE IMMEDIATE 'DELETE FROM result_table; DECLARE S_TABLENAME VARCHAR(100); S_CHECK_VALUES VARCHAR(4000); CURSOR C_FOR_TABLE IS SELECT TABLE_NAME, NAME FROM table; BEGIN OPEN C_FOR_TABLE; LOOP FETCH C_FOR_TABLE INTO S_TABLENAME; EXIT WHEN C_FOR_TABLE%NOTFOUND; S_CHECK_VALUES := 'INSERT INTO table_result (TABLE_NAME, ID, ERROR_ROWS_COUNT)
(SELECT ''' || S_TABLENAME || ''', ''', '1001', COUNT(*) FROM ' || S_TABLENAME || ' WHERE col2 IS NULL)'; --NOT IN ( SELECT table2.col2 FROM table2 GROUP BY col2))'; EXECUTE IMMEDIATE S_CHECK_VALUES; END LOOP; S_CHECK_VALUES := 'DELETE FROM table_result WHERE ERROR_ROWS_COUNT < 1 '; EXECUTE IMMEDIATE S_CHECK_VALUES; END;end curor_check_wrong_cols;
24. 利用 union 结合游标将 表1中的字段1, 字段2插入到 表2字段 1中.create or replace procedure pro_imp_colName isbegin DECLARE col1 varchar(1000); sqlstr VARCHAR(4000); CURSOR C_FOR_TABLE IS select distinct col1 from (select distinct col1 from tableName union select distinct col2 from tableName BEGIN OPEN C_FOR_TABLE; LOOP FETCH C_FOR_TABLE INTO col1; EXIT WHEN C_FOR_TABLE%NOTFOUND; sqlstr := 'INSERT INTO table2(col1,col2) values ( ''' || col1|| ''', 0)'; EXECUTE IMMEDIATE sqlstr; END LOOP; END;end pro_imp_colName;
25.导入数据时屏蔽重复记录(从table1向table2导入数据)create or replace trigger table2_col1_insert after insert on table1 for each rowdeclare -- local variables here col1Count integer;begin --调用存储过程判断 col1 字段是否有已经存在当前要插入的值. col1_is_null(colName1 => :NEW.colName1, intcount => col1Count); EXECUTE IMMEDIATE sqlstr; if( col1Count =0) then insert into table2 (col1, col2, col3) values (:NEW.col1, :NEW.col2,0); end if; end ;
--对应的存储过程create or replace procedure col1_is_null(colName1 in varchar, intcount out integer )asbegin select count(*) into intcount from table2 where col1=colName;end ;
26. 创建3种类型的索引
创建索引过程:1.创建索引时会对全表进行扫描2.对索引列的数据进行排序 --原理3.为索引分配存储空间4.将索引的定义信息保存到数据字典中.
创建:<1>. 创建标准(B树)索引:条件: 如果在 where 条件子句中要经常引用 某列或某几列, 就应该基于这些列创建B树索引.1.创建单列索引create INDEX idx_table_col on table(colName)PCTFREE 30 TABLESPACE tablespace_Index;
说明: pctfree 指定将来 insert 操作预留的空间.因为插入新记录总会创引入新索引值进来.因此预留空间要求较大.
2.创建多列索引create INDEX idx_table_col1_col2 on table(col1, col2)pctfree 30tablespace tablespace_index;
<2>.创建位图索引条件: 某列上记录值的基数很小, 只是有限的几个固定值,如性别,婚姻状态等如果需要建立索引, 就应该建立位图索引.1.单列位图索引create bitmap index bmidx_table_col on table(colName);
<3>.创建函数索引.条件: 当 where 子句中使用了函数和表达式时, 为这些函数和表达式建立函数索引后, select 的速度会提高.1. 创建函数索引create Index funidx_col on table(col1+col2+col3*0.5)
查询下列语句时速度会加快:select * from table where (col1+col2+col3*0.5) < 500;
2.创建函数索引2create Index funidx_table_col on table Substr(col1, 1, 2)compute statistics;
查询col1列的头两位时速度会明显加快select * from table where Substr(col1, 1, 2) in ('12', '34');
27.更改,重命名,合并, 重建
(1).更改: Alter Index indexName **;
(2).重命名: Alter Index indexName RENAME TO indexName2;
(3).合并索引: (清除更新产生的磁片)Alter Index indexName COALESCE;
(4).重建索引:(重新建立一个索引, 删除还来的索引, 但是各种参数不变);Alter Index indexName REBUILDTABLESPACE ANOTHER;
28.监视索引
(1).查询 V$object_usage, 了解索引的被监视情况select index_name, monitoring, used, start_monitoring, end_monitoringfrom V$OBJECT_USAGE;
结果:未选定行说明没有任何索引被监视.
(2).修改索引使之被监视.Alter Index indexName MONITORING USAGE;
(3).再查询被监视情况: 结果:indexName, yes, no, timeNow;
(4).执行查询后(利用索引)再查询结果:indexName, yes, yes, timeNow;可见, usered=yes; 表示从开始监视以来索引已经被使用过了.
29.索引的空间控制
(1).分配索引空间Alter index indexName ALLOCATE EXTENT(SIZE 100K);
(2).释放多余空间Alter INDEX indexName DEALLOCATE UNUSED;
30.查看与删除索引
(1).查看
select index_name, index_type, tablespace_name, uniquesness, loggingfrom user_indexes where table_name='tableName';
--DBA_INDEXES; --所有索引--ALL_INDEXES;--USER_INDEXES;--DBA_IND_COLUMNS; --索引列--ALL_IND_COLUMNS;--USER_IND_COLUMNS;
(2).删除
drop INDEX indexName;
31.同义词
引入同义词原因:在开发数据库应用程序时, 应该普遍遵守的规则是尽量避免直接引用表,视图或其他对象.否则,当DBA改变了表的名称或者结构,就必须重新改变并编译应用程序.因此需要为对象建立同义词.
建立对象条件:1.重要的对象;2.分布式系统;3.名称长而复杂;
语法:create [or replace] public Synonym synonym_namefor [schema.]ojbect;
ege:create or replace SYNONYM syn_studentsfor students
使用同义词:select * from syn_students;insert into syn_students values (**, **, **,..);
32.序列
需求1.主键, 外键;2.流水号;
创建:create Sequence sequence[start with n1] --起始值[increment by n2] --递增量[{maxvlue n3 | nomaxvalue }] --最大值(如果没有指定最大值则为:1027)[{minvlue n4 | nominvalue }] --最小值(同上:-1026)[{cache n5 | nocache}] --预分配的序列个数,使用不完作废[{cycle | nocycle}] --序列使用完后是否循环[order]; --按顺序生成序列
ege;create SEQUENCE Seq_idIncrement by 1Start with 300MaxVulue 999999999MinVule 1Cache 10Order;
使用序列:(1).下一个序列sequence_name.nextval;
(2).当前序列sequence_name.currval;
ege: select * from sequence_name.currval from dual;
更改序列Alter Sequence sequence--同创建相同;
删除:Drop Sequence sequence;
查看所有序列:select * from user_sequence;
33. 视图
引入视图目的:(1).提供各种数据表现形式(2).提供某些数据的安全性(3).隐藏数据的复杂性(4).简化数据的查询语句(5).执行特殊查询(6).保存复杂查询
<1>.创建视图:Create [Or Replace] [force] View [Schema.] view_name[(col1, col2, ...)]As select ...[With Check Option] [Constraint constraint_name][Woth Read Only];
说明:--force: 强制创建视图,不考虑基础表是否存在或是否有权限, 这样保证操作的独立性;--With Check Option: 使用视图时,检查涉及的数据是否通过select子查询的约束条件,否则不允许操作。
ege:创建一般视图Create View v_tableasselect * from tableName;
创建连接视图:Create View v_tableasselect a.col1, a.col2, b.col1, b.col5from table1 a, table2 bwhere a.col1=b.col5and a.col2 in (values1, values2);
创建复杂视图Create View v_tableAsselect col1, avg(col2), sum(col3), max(col4), min(col5)from tablegroup by col1;
<2>.使用视图1.selectselect * from view_name;
2.DML操作对于基础表为一张表的直接使用 DML语句对于基础表为多张表的视图使用下列方法:键保存表概念:--如果连接视图中的一个基础表的键(主键,唯一键)在它的视图中仍然存在, 则称这个基础表为 键保存表(key-preserved)。键保存表中的主键在他的视图中仍然是主键。 即:子表为键保存表,父表为非键保存表;
原则:1.一次只能对视图中的一个键保存表进行更新。2.如果视图有 With Check Option选项 则不能对连接视图执行 DML 操作
<3>.修改视图:由于视图只是一个虚表,更改只是更改它的定义。使用下面方法会重新创建一个新的视图,但会保留原视图上的所有设置(如授权等)Create or replace view v_table
<4>.删除视图Drop View view_table
<5>.查看视图字典:user_views;
34. 口令策略
--创建用于口令的概要文件(口令策略)--此概要文件为系统自带的口令策略文件create profile default limitpassword_life_time 60 --60天内必须使用此口令password_grace_time 10 --60天后的10天里必须更改此口令password_reuse_time 1800 --1800天内不可重用此口令password_reuse_max unlimited --下次使用此口令时中间要换口令无限次(也就是说:永远不再使用此口令)password_login_attempts 3 --口令输入累计的失败次数, 3次后用户锁死此用户password_lock_time 1 --锁死时间:1天
--系统自带的口令校验脚本password_verify_function verify_function; --口令校验脚本(为一函数,名称为:verify_function)
--创建用户或修改用户时添加口令管理(default)create user userName Profile default;alter user userName2 profile default;
--锁定账户Alter user userName Account Lock;
--解锁账户Alter user userName Account UnLock;
35. ORACLE函数大全 (SQL中的单记录函数)
一. 字符1.ASCII返回与指定的字符对应的十进制数;SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual;
A A ZERO SPACE--------- --------- --------- --------- 65 97 48 32
2.CHR给出整数,返回对应的字符;SQL> select chr(54740) zhao,chr(65) chr65 from dual;
ZH C-- -赵 A
3.CONCAT连接两个字符串;SQL> select concat('010-','88888888')||'转23' 高乾竞电话 from dual;
高乾竞电话----------------010-88888888转23
4.INITCAP返回字符串并将字符串的第一个字母变为大写;SQL> select initcap('smith') upp from dual;
UPP-----Smith
5.INSTR(C1,C2,I,J)在一个字符串中搜索指定的字符,返回发现指定的字符的位置;C1 被搜索的字符串C2 希望搜索的字符串I 搜索的开始位置,默认为1J 出现的位置,默认为1SQL> select instr('oracle traning','ra',1,2) instring from dual;
INSTRING--------- 9
6.LENGTH返回字符串的长度;SQL> select name,length(name),addr,length(addr),sal,length(to_char(sal)) from gao.nchar_tst;
NAME LENGTH(NAME) ADDR LENGTH(ADDR) SAL LENGTH(TO_CHAR(SAL))------ ------------ ---------------- ------------ --------- --------------------高乾竞 3 北京市海锭区 6 9999.99 7
7.LOWER返回字符串,并将所有的字符小写SQL> select lower('AaBbCcDd')AaBbCcDd from dual;
AABBCCDD--------aabbccdd
8.UPPER返回字符串,并将所有的字符大写SQL> select upper('AaBbCcDd') upper from dual;
UPPER--------AABBCCDD
9.RPAD和LPAD(粘贴字符)RPAD 在列的右边粘贴字符LPAD 在列的左边粘贴字符SQL> select lpad(rpad('gao',10,'*'),17,'*')from dual;
LPAD(RPAD('GAO',1-----------------*******gao*******不够字符则用*来填满
10.LTRIM和RTRIMLTRIM 删除左边出现的字符串RTRIM 删除右边出现的字符串SQL> select ltrim(rtrim(' gao qian jing ',' '),' ') from dual;
LTRIM(RTRIM('-------------gao qian jing
11.SUBSTR(string,start,count)取子字符串,从start开始,取count个SQL> select substr('13088888888',3,8) from dual;
SUBSTR('--------08888888
12.REPLACE('string','s1','s2')string 希望被替换的字符或变量 s1 被替换的字符串s2 要替换的字符串SQL> select replace('he love you','he','i') from dual;
REPLACE('H----------i love you
13.SOUNDEX返回一个与给定的字符串读音相同的字符串SQL> create table table1(xm varchar(8));SQL> insert into table1 values('weather');SQL> insert into table1 values('wether');SQL> insert into table1 values('gao');
SQL> select xm from table1 where soundex(xm)=soundex('weather');
XM--------weatherwether
14.TRIM('s' from 'string')LEADING 剪掉前面的字符TRAILING 剪掉后面的字符如果不指定,默认为空格符
二.数字处理
15.ABS返回指定值的绝对值SQL> select abs(100),abs(-100) from dual;
ABS(100) ABS(-100)--------- --------- 100 100
16.ACOS给出反余弦的值SQL> select acos(-1) from dual;
ACOS(-1)---------3.1415927
17.ASIN给出反正弦的值SQL> select asin(0.5) from dual;
ASIN(0.5)---------.52359878
18.ATAN返回一个数字的反正切值SQL> select atan(1) from dual;
ATAN(1)---------.78539816
19.CEIL返回大于或等于给出数字的最小整数SQL> select ceil(3.1415927) from dual;
CEIL(3.1415927)--------------- 4
20.COS返回一个给定数字的余弦SQL> select cos(-3.1415927) from dual;
COS(-3.1415927)--------------- -1
21.COSH返回一个数字反余弦值SQL> select cosh(20) from dual;
COSH(20)---------242582598
22.EXP返回一个数字e的n次方根SQL> select exp(2),exp(1) from dual;
EXP(2) EXP(1)--------- ---------7.3890561 2.7182818
23.FLOOR对给定的数字取整数SQL> select floor(2345.67) from dual;
FLOOR(2345.67)-------------- 2345
24.LN返回一个数字的对数值SQL> select ln(1),ln(2),ln(2.7182818) from dual;
LN(1) LN(2) LN(2.7182818)--------- --------- ------------- 0 .69314718 .99999999
25.LOG(n1,n2)返回一个以n1为底n2的对数 SQL> select log(2,1),log(2,4) from dual;
LOG(2,1) LOG(2,4)--------- --------- 0 2
26.MOD(n1,n2)返回一个n1除以n2的余数SQL> select mod(10,3),mod(3,3),mod(2,3) from dual;
MOD(10,3) MOD(3,3) MOD(2,3)--------- --------- --------- 1 0 2
27.POWER返回n1的n2次方根SQL> select power(2,10),power(3,3) from dual;
POWER(2,10) POWER(3,3)----------- ---------- 1024 27
28.ROUND和TRUNC按照指定的精度进行舍入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
29.SIGN取数字n的符号,大于0返回1,小于0返回-1,等于0返回0SQL> select sign(123),sign(-100),sign(0) from dual;
SIGN(123) SIGN(-100) SIGN(0)--------- ---------- --------- 1 -1 0
30.SIN返回一个数字的正弦值SQL> select sin(1.57079) from dual;
SIN(1.57079)------------ 1
31.SIGH返回双曲正弦的值SQL> select sin(20),sinh(20) from dual;
SIN(20) SINH(20)--------- ---------.91294525 242582598
32.SQRT返回数字n的根SQL> select sqrt(64),sqrt(10) from dual;
SQRT(64) SQRT(10)--------- --------- 8 3.1622777
33.TAN返回数字的正切值SQL> select tan(20),tan(10) from dual;
TAN(20) TAN(10)--------- ---------2.2371609 .64836083
34.TANH返回数字n的双曲正切值SQL> select tanh(20),tan(20) from dual;
TANH(20) TAN(20)--------- --------- 1 2.2371609
35.TRUNC按照指定的精度截取一个数SQL> select trunc(124.1666,-2) trunc1,trunc(124.16666,2) from dual;
TRUNC1 TRUNC(124.16666,2)--------- ------------------ 100 124.16
三. 日期
36.ADD_MONTHS增加或减去月份SQL> select to_char(add_months(to_date('199912','yyyymm'),2),'yyyymm') from dual;
TO_CHA------200002SQL> select to_char(add_months(to_date('199912','yyyymm'),-2),'yyyymm') from dual;
TO_CHA------199910
37.LAST_DAY返回日期的最后一天SQL> select to_char(sysdate,'yyyy.mm.dd'),to_char((sysdate)+1,'yyyy.mm.dd') from dual;
TO_CHAR(SY TO_CHAR((S---------- ----------2004.05.09 2004.05.10SQL> select last_day(sysdate) from dual;
LAST_DAY(S----------31-5月 -04
38.MONTHS_BETWEEN(date2,date1)给出date2-date1的月份SQL> select months_between('19-12月-1999','19-3月-1999') mon_between from dual;
MON_BETWEEN----------- 9SQL>selectmonths_between(to_date('2000.05.20','yyyy.mm.dd'),to_date('2005.05.20','yyyy.mm.dd')) mon_betw from dual;
MON_BETW--------- -60
39.NEW_TIME(date,'this','that')给出在this时区=other时区的日期和时间SQL> select to_char(sysdate,'yyyy.mm.dd hh24:mi:ss') bj_time,to_char(new_time 2 (sysdate,'PDT','GMT'),'yyyy.mm.dd hh24:mi:ss') los_angles from dual;
BJ_TIME LOS_ANGLES------------------- -------------------2004.05.09 11:05:32 2004.05.09 18:05:32
40.NEXT_DAY(date,'day')给出日期date和星期x之后计算下一个星期的日期SQL> select next_day('18-5月-2001','星期五') next_day from dual;
NEXT_DAY----------25-5月 -01
41.SYSDATE用来得到系统的当前日期SQL> select to_char(sysdate,'dd-mm-yyyy day') from dual;
TO_CHAR(SYSDATE,'-----------------09-05-2004 星期日trunc(date,fmt)按照给出的要求将日期截断,如果fmt='mi'表示保留分,截断秒SQL> select to_char(trunc(sysdate,'hh'),'yyyy.mm.dd hh24:mi:ss') hh, 2 to_char(trunc(sysdate,'mi'),'yyyy.mm.dd hh24:mi:ss') hhmm from dual;
HH HHMM------------------- -------------------2004.05.09 11:00:00 2004.05.09 11:17:00
42.CHARTOROWID将字符数据类型转换为ROWID类型SQL> select rowid,rowidtochar(rowid),ename from scott.emp;
ROWID ROWIDTOCHAR(ROWID) ENAME------------------ ------------------ ----------AAAAfKAACAAAAEqAAA AAAAfKAACAAAAEqAAA SMITHAAAAfKAACAAAAEqAAB AAAAfKAACAAAAEqAAB ALLENAAAAfKAACAAAAEqAAC AAAAfKAACAAAAEqAAC WARDAAAAfKAACAAAAEqAAD AAAAfKAACAAAAEqAAD JONES
43.CONVERT(c,dset,sset)将源字符串 sset从一个语言字符集转换到另一个目的dset字符集SQL> select convert('strutz','we8hp','f7dec') "conversion" from dual;
conver------strutz
44.HEXTORAW将一个十六进制构成的字符串转换为二进制
45.RAWTOHEXT将一个二进制构成的字符串转换为十六进制
46.ROWIDTOCHAR将ROWID数据类型转换为字符类型
47.TO_CHAR(date,'format')SQL> select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY-------------------2004/05/09 21:14:41
48.TO_DATE(string,'format')将字符串转化为ORACLE中的一个日期
49.TO_MULTI_BYTE将字符串中的单字节字符转化为多字节字符SQL> select to_multi_byte('高') from dual;
TO--高
50.TO_NUMBER将给出的字符转换为数字SQL> select to_number('1999') year from dual;
YEAR--------- 1999
四. 其他51.BFILENAME(dir,file)指定一个外部二进制文件SQL>insert into file_tb1 values(bfilename('lob_dir1','image1.gif'));
52.CONVERT('x','desc','source')将x字段或变量的源source转换为descSQL> select sid,serial#,username,decode(command, 2 0,'none', 3 2,'insert', 4 3, 5 'select', 6 6,'update', 7 7,'delete', 8 8,'drop', 9 'other') cmd from v$session where type!='background';
SID SERIAL# USERNAME CMD--------- --------- ------------------------------ ------ 1 1 none 2 1 none 3 1 none 4 1 none 5 1 none 6 1 none 7 1275 none 8 1275 none 9 20 GAO select 10 40 GAO none
53.DUMP(s,fmt,start,length)DUMP函数以fmt指定的内部数字格式返回一个VARCHAR2类型的值SQL> col global_name for a30SQL> col dump_string for a50SQL> set lin 200SQL> select global_name,dump(global_name,1017,8,5) dump_string from global_name;
GLOBAL_NAME DUMP_STRING------------------------------ --------------------------------------------------ORACLE.WORLD Typ=1 Len=12 CharacterSet=ZHS16GBK: W,O,R,L,D
54.EMPTY_BLOB()和EMPTY_CLOB()这两个函数都是用来对大数据类型字段进行初始化操作的函数
55.GREATEST返回一组表达式中的最大值,即比较字符的编码大小.SQL> select greatest('AA','AB','AC') from dual;
GR--ACSQL> select greatest('啊','安','天') from dual;
GR--天
56.LEAST返回一组表达式中的最小值 SQL> select least('啊','安','天') from dual;
LE--啊
57.UID返回标识当前用户的唯一整数SQL> show userUSER 为"GAO"SQL> select username,user_id from dba_users where user_id=uid;
USERNAME USER_ID------------------------------ ---------GAO 25
58.USER返回当前用户的名字SQL> select user from dual;
USER------------------------------GAO
59.USEREVN返回当前用户环境的信息,opt可以是:ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZEISDBA 查看当前用户是否是DBA如果是则返回trueSQL> select userenv('isdba') from dual;
USEREN------FALSESQL> select userenv('isdba') from dual;
USEREN------TRUESESSION返回会话标志SQL> select userenv('sessionid') from dual;
USERENV('SESSIONID')-------------------- 152ENTRYID返回会话人口标志SQL> select userenv('entryid') from dual;
USERENV('ENTRYID')------------------ 0INSTANCE返回当前INSTANCE的标志SQL> select userenv('instance') from dual;
USERENV('INSTANCE')------------------- 1LANGUAGE返回当前环境变量SQL> select userenv('language') from dual;
USERENV('LANGUAGE')----------------------------------------------------SIMPLIFIED CHINESE_CHINA.ZHS16GBKLANG返回当前环境的语言的缩写SQL> select userenv('lang') from dual;
USERENV('LANG')----------------------------------------------------ZHSTERMINAL返回用户的终端或机器的标志SQL> select userenv('terminal') from dual;
USERENV('TERMINA----------------GAOVSIZE(X)返回X的大小(字节)数SQL> select vsize(user),user from dual;
VSIZE(USER) USER----------- ------------------------------ 6 SYSTEM
60.AVG(DISTINCT|ALL)all表示对所有的值求平均值,distinct只对不同的值求平均值SQLWKS> create table table3(xm varchar(8),sal number(7,2));语句已处理。SQLWKS> insert into table3 values('gao',1111.11);SQLWKS> insert into table3 values('gao',1111.11);SQLWKS> insert into table3 values('zhu',5555.55);SQLWKS> commit;
SQL> select avg(distinct sal) from gao.table3;
AVG(DISTINCTSAL)---------------- 3333.33
SQL> select avg(all sal) from gao.table3;
AVG(ALLSAL)----------- 2592.59
61.MAX(DISTINCT|ALL)求最大值,ALL表示对所有的值求最大值,DISTINCT表示对不同的值求最大值,相同的只取一次SQL> select max(distinct sal) from scott.emp;
MAX(DISTINCTSAL)---------------- 5000
62.MIN(DISTINCT|ALL)求最小值,ALL表示对所有的值求最小值,DISTINCT表示对不同的值求最小值,相同的只取一次SQL> select min(all sal) from gao.table3;
MIN(ALLSAL)----------- 1111.11
63.STDDEV(distinct|all)求标准差,ALL表示对所有的值求标准差,DISTINCT表示只对不同的值求标准差SQL> select stddev(sal) from scott.emp;
STDDEV(SAL)----------- 1182.5032
SQL> select stddev(distinct sal) from scott.emp;
STDDEV(DISTINCTSAL)------------------- 1229.951
64.VARIANCE(DISTINCT|ALL)求协方差
SQL> select variance(sal) from scott.emp;
VARIANCE(SAL)------------- 1398313.9
65.GROUP BY主要用来对一组数进行统计SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno;
DEPTNO COUNT(*) SUM(SAL)--------- --------- --------- 10 3 8750 20 5 10875 30 6 9400
66.HAVING对分组统计再加限制条件SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno having count(*)>=5;
DEPTNO COUNT(*) SUM(SAL)--------- --------- --------- 20 5 10875 30 6 9400SQL> select deptno,count(*),sum(sal) from scott.emp having count(*)>=5 group by deptno ;
DEPTNO COUNT(*) SUM(SAL)--------- --------- --------- 20 5 10875 30 6 9400
67.ORDER BY用于对查询到的结果进行排序输出SQL> select deptno,ename,sal from scott.emp order by deptno,sal desc;
DEPTNO ENAME SAL--------- ---------- --------- 10 KING 5000 10 CLARK 2450 10 MILLER 1300 20 SCOTT 3000 20 FORD 3000 20 JONES 2975 20 ADAMS 1100 20 SMITH 800 30 BLAKE 2850 30 ALLEN 1600 30 TURNER 1500 30 WARD 1250 30 MARTIN 1250 30 JAMES 950
35. 带参数的SQL
OracleParameter parm = new OracleParameter(":unknown" , OracleType.VarChar); parm.Value = "123"; dbCmd.CommandText = "select colName from table where col==:unknown ";
参数数组:
OracleParameter[] parm = {
new OracleParameter(":cityID", OracleType.Int32),
new OracleParameter(":cityName",OracleType.Varchar)
};
parm[0].Value = "401";
parm[1].Value = "ACB";
36. Oracel存储过程中返回数据集(转)
(1).建立包
CREATE OR REPLACE PACKAGE TEST.PKG_TEST IS
TYPE MYCURSOR IS REF CURSOR; PROCEDURE GET_DEC_BILL_LIST(cur_OUT OUT MYCURSOR);END;
(2).游标生成数据集
CREATE OR REPLACE PACKAGE BODY TEST.PKG_TEST IS
PROCEDURE GET_DEC_BILL_LIST(cur_OUT OUT MYCURSOR) AS BEGIN OPEN cur_OUT FOR SELECT * FROM ALL_TABLES WHERE OWNER='SYS'; END;END;
转载于:https://www.cnblogs.com/LRJ20110831/archive/2012/10/08/2715150.html