一:DDL数据定义语言

1:create(创建)

      创建表

 CREATE TABLE <table_name>(
column1 DATATYPE [NOT NULL] [PRIMARY KEY],
column2 DATATYPE [NOT NULL],
...
[constraint <约束名> 约束类型 (要约束的字段)
... ] )
/*说明:
DATATYPE --是Oracle的数据类型,可以查看附录。
NUT NULL --可不可以允许资料有空的(尚未有资料填入)。
PRIMARY KEY --是本表的主键。
constraint --是对表里的字段添加约束.(约束类型有
Check,Unique,Primary key,not null,Foreign key)。
*/
---示例:
create table stu(
s_id number(8) PRIMARY KEY,
s_name varchar2(20) not null,
s_sex varchar2(8),
clsid number(8),
constraint u_1 unique(s_name),
constraint c_1 check (s_sex in ('MALE','FEMALE'))
);

复制表

 CREATE TABLE <table_name> as <SELECT 语句>

 ---(需注意的是复制表不能复制表的约束);

 --示例:
create table test as select * from emp; ---如果只复制表的结构不复制表的数据则:
create table test as select * from emp where 1=2;

创建索引

 --创建索引

 --------------------------------------------------------------------------------
CREATE [UNIQUE] INDEX <index_name> ON <table_name>(字段 [ASC|DESC]);
/*
UNIQUE --确保所有的索引列中的值都是可以区分的。
[ASC|DESC] --在列上按指定排序创建索引。 (创建索引的准则:
1.如果表里有几百行记录则可以对其创建索引(表里的记录行数越多索引的效果就越明显)。
2.不要试图对表创建两个或三个以上的索引。
3.为频繁使用的行创建索引。
)
*/ --示例
create index i_1 on emp(empno asc);

创建同义词

 --创建同义词

 --------------------------------------------------------------------------------

 CREATE SYNONYM <synonym_name> for <tablename/viewname>

 --同义词即是给表或视图取一个别名。

 --示例:
create synonym mm for emp;

2:alter(修改)

 --修改表

 --------------------------------------------------------------------------------

 --1.向表中添加新字段
ALTER TABLE <table_name> ADD (字段1 类型 [NOT NULL],字段2 类型 [NOT NULL].... ); --2.修改表中字段
ALTER TABLE <table_name> modify(字段1 类型,字段2 类型.... ); --3 .删除表中字段
ALTER TABLE <table_name> drop(字段1,字段2 .... ); --4 .修改表的名称
RENAME <table_name> to <new table_name>; --5 .对已经存在的表添加约束
ALTER TABLE <table_name> ADD CONSTRAINT <constraint_name> 约束类型 (针对的字段名);
---示例:
Alter table emp add constraint S_F Foreign key (deptno) references dept(deptno); --6 .对表里的约束禁用;
ALTER TABLE <table_name> DISABLE CONSTRAINT <constraint_name>; ---7 .对表里的约束重新启用;
ALTER TABLE <table_name> ENABLE CONSTRAINT <constraint_name>; ---8 .删除表中约束
ALTER TABLE <table_name> DROP CONSTRAINT <constraint_name>;
---示例:
ALTER TABLE emp drop CONSTRAINT <Primary key>;

2:drop(删除)

  删除表

 --删除表

 --------------------------------------------------------------------------------
DROP TABLE <table_name>; ---示例
drop table emp;

删除索引

 --删除索引

 --------------------------------------------------------------------------------
DROP INDEX <index_name>; --示例
drop index i_1;

删除同义词

 --删除同义词

 --------------------------------------------------------------------------------
DROP SYNONYM <synonym_name>; --示例
drop synonym mm;

二:DML数据操纵语言

插入记录  insert into

 --插入记录

 --------------------------------------------------------------------------------
INSERT INTO table_name (column1,column2,...)
values ( value1,value2, ...); --示例
insert into emp (empno,ename) values(9500,'AA'); --把 一个表中的数据插入另一个表中 INSERT INTO <table_name> <SELECT 语句>
--示例
create table a as select * from emp where 1=2;
insert into a select * from emp where sal>2000;

查询记录  select

 --查询记录

 --------------------------------------------------------------------------------

 --一般查询
SELECT [DISTINCT] <column1 [as new name] ,columns2,...>
FROM <table1>
[WHERE <条件>]
[GROUP BY <column_list>]
[HAVING <条件>]
[ORDER BY <column_list> [ASC|DESC]] /*
DISTINCT --表示隐藏重复的行
WHERE --按照一定的条件查找记录
GROUP BY --分组查找(需要汇总时使用)
HAVING --分组的条件
ORDER BY --对查询结果排序 要显示全部的列可以用*表示 */
--示例:
select * from emp; WHERE 语句的运算符
where <条件1>AND<条件2> --两个条件都满足
--示例:
select * from emp where deptno=10 and sal>1000; where <条件1>OR<条件2> --两个条件中有一个满足即可
--示例:
select * from emp where deptno=10 OR sal>2000; where NOT <条件> --不满足条件的
--示例:
select * from emp where not deptno=10; where IN(条件列表) --所有满足在条件列表中的记录
--示例:
select * from emp where empno in(7788,7369,7499); where BETWEEN .. AND ..  --按范围查找
--示例:
select * from emp where sal between 1000 and 3000; where 字段 LIKE --主要用与字符类型的字段
--示例1:
select * from emp where ename like '_C%'; --查询姓名中第二个字母是'C'的人
--'-' 表示任意字符;
--'%' 表示多字符的序列; where 字段 IS [NOT] NULL --查找该字段是[不是]空的记录 --汇总数据是用的函数
--SUM --求和
--示例:
select deptno,sum(sal) as sumsal from emp GROUP BY deptno; /*
AVG --求平均值
MAX --求最大值
MIN --求最小值
COUNT --求个数
*/ --子查询
SELECT <字段列表> from <table_name> where 字段 运算符(<SELECT 语句>); --示例:
select * from emp where sal=(select max(sal) from emp); --运算符
Any
--示例:
select * from emp where sal>ANY(select sal from emp where deptno=30) and deptno<>30;
--找出比deptno=30的员工最低工资高的其他部门的员工 --ALL
select * from emp where sal>ALL(select sal from emp where deptno=30) and deptno<>30;
--找出比deptno=30的员工最高工资高的其他部门的员工 --连接查询
SELECT <字段列表> from <table1,table2> WHERE table1.字段[(+)]=table2.字段[(+)] --示例
select empno,ename,dname from emp,dept where emp.deptno=dept.deptno; --查询指定行数的数据
SELECT <字段列表> from <table_name> WHERE ROWNUM<行数;
--示例:
select * from emp where rownum<=10;--查询前10行记录
--注意ROWNUM只能为1 因此不能写 select * from emp where rownum between 20 and 30; --要查第几行的数据可以使用以下方法:
select * from emp where rownum<=3 and empno not in (select empno from emp where rownum<=3);
--结果可以返回整个数据的3-6行;
--不过这种方法的性能不高;如果有别的好方法请告诉我。

 

更新数据  update

 --更新数据

 --------------------------------------------------------------------------------
UPDATE table_name set column1=new value,column2=new value,...
WHERE <条件> --示例
update emp set sal=1000,empno=8888 where ename='SCOTT'

删除数据  delete

 --更新数据

 --------------------------------------------------------------------------------
DELETE FROM <table_name>
WHERE <条件> --示例
delete from emp where empno=''

三:DCL数据控制语言

数据控制语言

 --数据控制语言

 --------------------------------------------------------------------------------
--1.授权
GRANT <权限列表> to <user_name>; --2.收回权限
REVOKE <权限列表> from <user_name> /*
Oracle 的权限列表
connect 连接
resource 资源
unlimited tablespace 无限表空间
dba 管理员
session 会话
*/

四:TCL事务控制语言

 --数据控制语言

 --------------------------------------------------------------------------------
--1.提交;
COMMIT; --2.回滚;
ROLLBACK [TO savepoint] --3.保存位置。
SAVEPOINT <savepoint>

五:Oracle 其他对象

视图:

 --创建视图
--------------------------------------------------------------------------------
CREATE [OR REPLACE] VIEW <view_name>
AS
<SELECT 语句>; OR REPLACE --表示替换以有的视图 --删除视图
-------------------------------------------------------------------------------- DROP VIEW <view_name>

序列:

 --创建序列
-------------------------------------------------------------------------------- CREATE SEQUENCE <sequencen_name>
INCREMENT BY n
START WITH n
[MAXVALUE n][MINVALUE n]
[CYCLE|NOCYCLE]
[CACHE n|NOCACHE]; /*
INCREMENT BY n --表示序列每次增长的幅度;默认值为1.
START WITH n --表示序列开始时的序列号。默认值为1.
MAXVALUE n --表示序列可以生成的最大值(升序).
MINVALUE n --表示序列可以生成的最小值(降序).
CYCLE --表示序列到达最大值后,在重新开始生成序列.默认值为 NOCYCLE。
CACHE --允许更快的生成序列.
*/ --示例:
create sequence se_1
increment by 1
start with 100
maxvalue 999999
cycle; --修改序列 -------------------------------------------------------------------------------- ALTER SEQUENCE <sequencen_name>
INCREMENT BY n
START WITH n
[MAXVALUE n][MINVALUE n]
[CYCLE|NOCYCLE]
[CACHE n|NOCACHE]; --删除序列 -------------------------------------------------------------------------------- DROP SEQUENCE <sequence_name> --使用序列 -------------------------------------------------------------------------------- 1.CURRVAL
返回序列的当前值.
注意在刚建立序列后,序列的CURRVAL值为NULL,所以不能直接使用。
可以先初始化序列:
方法:select <sequence_name>.nextval from dual;
示例:select se_1.nextval from dual;
之后就可以使用CURRVAL属性了 2.NEXTVAL
返回序列下一个值;
示例:
begin
for i in 1..5
loop
insert into emp(empno) values(se_1.nextval);
end loop;
end; --查看序列的当前值
select <sequence_name>.currval from dual; --示例:select se_1.currval from dual;

用户

 --创建用户
-------------------------------------------------------------------------------- CREATE USER <user_name> [profile "DEFAULT"]
identified by "<password>" [default tablespace "USERS"] --删除用户 -------------------------------------------------------------------------------- DROP USER <user_name> CASCADE

角色

 --创建角色
-------------------------------------------------------------------------------- CREATE ROLE <role_name>
identified by "<password>" --删除角色
-------------------------------------------------------------------------------- DROP ROLE <role_name>

六:PL/SQL

PL/SQL 结构

 ---PL/SQL 结构

 --------------------------------------------------------------------------------
DECLARE --声明部分
声明语句
BEGIN --执行部分
执行语句 EXCEPTION --异常处理部分
执行语句 END; 变量声明
<变量名> 类型[:=初始值];
特殊类型 字段%type
示例: name emp.ename%type --表示name的类型和emp.ename的类型相同
表 %rowtype
示例: test emp%rowtype --表示test的类型为emp表的行类型;也有 .empno; .ename; .sal ;等属性 常量声明
<变量名> CONSTANT 类型:=初始值;
示例: pi constant number(5,3):=3.14; 全局变量声明
VARIABLE <变量名> 类型;
示例: VARIABLE num number; 使用全局变量
:<变量名>
示例:
:num:=100;
i=:num; 查看全局变量的值
print <变量名>
示例: print num; 赋值运算符: :=
示例: num := 100; 使用SELECT <列名> INTO <变量名> FROM <表名> WHERE <条件>
注意select into 语句的返回结果只能为一行;
示例:test emp%rowtype;
select * into test from emp where empno=7788; 用户交互输入
<变量>:='&变量'
示例:
num:=&num; 注意oracle的用户交互输入是先接受用户输入的所有值后在执行语句;
所以不能使用循环进行用户交互输入; 条件控制语句
IF <条件1> THEN
语句
[ELSIF <条件2> THEN
语句
.
.
.
ELSIF <条件n> THEN
语句]
[ELSE
语句]
END IF; 循环控制语句
1.LOOP
LOOP
语句;
EXIT WHEN <条件>
END LOOP; 2.WHILE LOOP
WHILE <条件>
LOOP
语句;
END LOOP; 3.FOR
FOR <循环变量> IN 下限..上限
LOOP
语句;
END LOOP; NULL 语句
null;
表示没有操作; 注释使用
单行注释: --
多行注释:/* .......
...............*/ 异常处理 EXCEPTION
WHEN <异常类型> THEN
语句;
WHEN OTHERS THEN
语句;
END;
关于异常类型请查看附录.

 

游标

 显示游标
-------------------------------------------------------------------------------- 定义:CURSOR <游标名> IS <SELECT 语句> [FOR UPDATE | FOR UPDATE OF 字段]; [FOR UPDATE | FOR UPDATE OF 字段] --给游标加锁,既是在程序中有"UPDATE","INSERT","DELETE"语句对数据库操作时。
游标自动给指定的表或者字段加锁,防止同时有别的程序对指定的表或字段进行"UPDATE","INSERT","DELETE"操作.
在使用"DELETE","UPDATE"后还可以在程序中使用CURRENT OF <游标名> 子句引用当前行. 操作:OPEN <游标名> --打开游标
FETCH <游标名> INTO 变量1,变量2,变量3,....变量n,;
或者
FETCH <游标名> INTO 行对象; --取出游标当前位置的值
CLOSE <游标名> --关闭游标
属性: %NOTFOUND --如果FETCH语句失败,则该属性为"TRUE",否则为"FALSE";
%FOUND --如果FETCH语句成果,则该属性为"TRUE",否则为"FALSE";
%ROWCOUNT --返回游标当前行的行数;
%ISOPEN --如果游标是开的则返回"TRUE",否则为"FALSE"; 使用:
LOOP循环
示例:
DECLARE
cursor c_1 is select * from emp; --定义游标
r c_1%rowtype; --定义一个行对象,用于获得游标的值
BEGIN
if c_1%isopen then
CLOSE c_1;
end if;
OPEN c_1; --判断游标是否打开.如果开了将其关闭,然后在打开
dbms_output.put_line('行号 姓名 薪水');
LOOP
FETCH c_1 INTO r; --取值
EXIT WHEN c_1%NOTFOUND; --如果游标没有取到值,退出循环.
dbms_output.put_line(c_1%rowcount||''||r.ename||''||r.sal); --输出结果,需要 set serverout on 才能显示.
END LOOP;
END; FOR循环
示例:
DECLARE
cursor c_1 is select ename,sal from emp; --定义游标
BEGIN
dbms_output.put_line('行号 姓名 薪水');
FOR i IN c_1 --for循环中的循环变量i为c_1%rowtype类型;
LOOP
dbms_output.put_line(c_1%rowcount||''||i.ename||''||i.sal); --输出结果,需要 set serverout on 才能显示.
END LOOP;
END; for循环使用游标是在循环开始前自动打开游标,并且自动取值到循环结束后,自动关闭游标. 游标加锁示例:
DECLARE
cursor c_1 is select ename,sal from emp for update of sal; --定义游标对emp表的sal字段加锁.
BEGIN
dbms_output.put_line('行号 姓名 薪水');
FOR i IN c_1 --for循环中的循环变量i为c_1%rowtype类型;
LOOP
UPDATE EMP set sal=sal+100 WHERE CURRENT OF c_1; --表示对当前行的sal进行跟新.
END LOOP;
FOR i IN c_1
LOOP
dbms_output.put_line(c_1%rowcount||''||i.ename||''||i.sal); --输出结果,需要 set serverout on 才能显示.
END LOOP;
END; 代参数的游标
定义:CURSOR <游标名>(参数列表) IS <SELECT 语句> [FOR UPDATE | FOR UPDATE OF 字段];
示例:
DECLARE
cursor c_1(name emp.ename%type) is select ename,sal from emp where ename=name; --定义游标
BEGIN
dbms_output.put_line('行号 姓名 薪水');
FOR i IN c_1('&name') --for循环中的循环变量i为c_1%rowtype类型;
LOOP
dbms_output.put_line(c_1%rowcount||''||i.ename||''||i.sal); --输出结果,需要 set serverout on 才能显示.
END LOOP;
END; 隐试游标
--------------------------------------------------------------------------------
隐试游标游标是系统自动生成的。每执行一个DML语句就会产生一个隐试游标,起名字为SQL; 隐试游标不能进行"OPEN" ,"CLOSE","FETCH"这些操作; 属性:
%NOTFOUND --如果DML语句没有影响到任何一行时,则该属性为"TRUE",否则为"FALSE";
%FOUND --如果DML语句影响到一行或一行以上时,则该属性为"TRUE",否则为"FALSE";
%ROWCOUNT --返回游标当最后一行的行数; 个人认为隐试游标的作用是判断一个DML语句;
示例:
BEGIN
DELETE FROM EMP WHERE empno=&a;
IF SQL%NOTFOUND THEN
dbms_output.put_line('empno不存在');
END IF;
IF SQL%ROWCOUNT>0 THEN
dbms_output.put_line('删除成功');
END IF;
END;

PL/SQL表

 PL/SQL表
--------------------------------------------------------------------------------
pl/sql表只有两列,其中第一列为序号列为INTEGER类型,第二列为用户自定义列. 定义:TYPE <类型名> IS TABLE OF <列的类型> [NOT NULL] INDEX BY BINARY_INTEGER;
<列的类型>可以为Oracle的数据类行以及用户自定义类型; 属性方法:
.count --返回pl/sql表的总行数
.delect --删除pl/sql表的所有内容
.delect(行数) --删除pl/sql表的指定的行
.delct(开始行,结束行) --删除pl/sql表的多行
.first --返回表的第一个INDEX;
.next(行数) --这个行数的下一条的INDEX;
.last --返回表的最后一个INDEX; 使用
示例:
DECLARE
TYPE mytable IS TABLE OF VARCHAR2(20) index by binary_integer; --定义一个名为mytable的PL/sql表类型;
cursor c_1 is select ename from emp;
n number:=1;
tab_1 mytable; --为mytable类型实例化一个tab_1对象;
BEGIN
for i in c_1
loop
tab_1(n):=i.ename; --将得到的值输入pl/sql表
n:=n+1;
end loop;
n:=1;
tab_1.delete(&要删除的行数); --删除pl/sql表的指定行
for i in tab_1.first..tab_1.count
loop
dbms_output.put_line(n||''||tab_1(n)); --打印pl/sql表的内容
n:=tab_1.next(n);
end loop;
EXCEPTION
WHEN NO_DATA_FOUND THEN --由于删除了一行,会发生异常,下面语句可以接着删除的行后显示
for i in n..tab_1.count+1
loop
dbms_output.put_line(n||''||tab_1(n));
n:=tab_1.next(n);
end loop;
END;

PL/SQL记录

 PL/SQL记录
--------------------------------------------------------------------------------
pl/sql表只有一行,但是有多列。 定义:TYPE <类型名> IS RECORD <列名1 类型1,列名2 类型2,...列名n 类型n,> [NOT NULL]
<列的类型>可以为Oracle的数据类行以及用户自定义类型;可以是记录类型的嵌套 使用
示例:
DECLARE
TYPE myrecord IS RECORD(id emp.empno%type,
name emp.ename%type,sal emp.sal%type); --定义一个名为myrecoed的PL/sql记录类型;
rec_1 myrecord; --为myrecord类型实例化一个rec_1对象;
BEGIN
select empno,ename,sal into rec_1.id,rec_1.name,rec_1.sal
from emp where empno=7788; --将得到的值输入pl/sql记录
dbms_output.put_line(rec_1.id||''||rec_1.name||''||rec_1.sal); --打印pl/sql记录的内容
END; 结合使用PL/SQL表和PL/SQL记录
示例:
DECLARE
CURSOR c_1 is select empno,ename,job,sal from emp;
TYPE myrecord IS RECORD(empno emp.empno%type,ename emp.ename%type,
job emp.job%type,sal emp.sal%type); --定义一个名为myrecoed的PL/sql记录类型;
TYPE mytable IS TABLE OF myrecord index by binary_integer;
--定义一个名为mytable的PL/sql表类型;字段类型为PL/sql记录类型; n number:=1;
tab_1 mytable; --为mytable类型实例化一个tab_1对象;
BEGIN
--赋值
for i in c_1
loop
tab_1(n).empno:=i.empno;
tab_1(n).ename:=i.ename;
tab_1(n).job:=i.job;
tab_1(n).sal:=i.sal;
n:=n+1;
end loop;
n:=1;
--输出
for i in n..tab_1.count
loop
dbms_output.put_line(i||''||tab_1(i).empno
||''||tab_1(i).ename||''||tab_1(i).job||''||tab_1(i).sal);
end loop;
END;

REF游标

 强型REF游标
-------------------------------------------------------------------------------- 定义:TYPE <游标名> IS REF CURSOR RETURN<返回类型>; 操作:OPEN <游标名> For <select 语句> --打开游标
FETCH <游标名> INTO 变量1,变量2,变量3,....变量n,;
或者
FETCH <游标名> INTO 行对象; --取出游标当前位置的值
CLOSE <游标名> --关闭游标
属性: %NOTFOUND --如果FETCH语句失败,则该属性为"TRUE",否则为"FALSE";
%FOUND --如果FETCH语句成果,则该属性为"TRUE",否则为"FALSE";
%ROWCOUNT --返回游标当前行的行数;
%ISOPEN --如果游标是开的则返回"TRUE",否则为"FALSE"; 使用:
示例:
DECLARE
type c_type is ref cursor return emp%rowtype; --定义游标
c_1 c_type; --实例化这个游标类型
r emp%rowtype;
BEGIN
dbms_output.put_line('行号 姓名 薪水');
open c_1 for select * from emp;
loop
fetch c_1 into r;
exit when c_1%notfound;
dbms_output.put_line(c_1%rowcount||''||r.ename||''||r.sal); --输出结果,需要 set serverout on 才能显示.
END LOOP;
close c_1;
END; 弱型REF游标
--------------------------------------------------------------------------------
定义:TYPE <游标名> IS REF CURSOR; 操作:OPEN <游标名> For <select 语句> --打开游标
FETCH <游标名> INTO 变量1,变量2,变量3,....变量n,;
或者
FETCH <游标名> INTO 行对象; --取出游标当前位置的值
CLOSE <游标名> --关闭游标
属性: %NOTFOUND --如果FETCH语句失败,则该属性为"TRUE",否则为"FALSE";
%FOUND --如果FETCH语句成果,则该属性为"TRUE",否则为"FALSE";
%ROWCOUNT --返回游标当前行的行数;
%ISOPEN --如果游标是开的则返回"TRUE",否则为"FALSE";
示例:
set autoprint on;
var c_1 refcursor;
DECLARE
n number;
BEGIN
n:=&请输入;
if n=1 then
open :c_1 for select * from emp;
else
open :c_1 for select * from dept;
end if;
END;
 过程
-------------------------------------------------------------------------------- 定义:CREATE [OR REPLACE] PROCEDURE <过程名>[(参数列表)] IS
[局部变量声明]
BEGIN
可执行语句
EXCEPTION
异常处理语句
END [<过程名>]; 变量的类型:in 为默认类型,表示输入; out 表示只输出;in out 表示即输入又输出; 操作以有的过程:在PL/SQL块中直接使用过程名;在程序外使用execute <过程名>[(参数列表)] 使用:
示例:
创建过程:
create or replace procedure p_1(n in out number) is
r emp%rowtype;
BEGIN
dbms_output.put_line('姓名 薪水');
select * into r from emp where empno=n;
dbms_output.put_line(r.ename||''||r.sal); --输出结果,需要 set serverout on 才能显示.
n:=r.sal;
END;
使用过程:
declare
n number;
begin
n:=&请输入员工号;
p_1(n);
dbms_output.put_line('n的值为 '||n);
end; 删除过程:
DROP PROCEDURE <过程名>;

函数

 

 函数
-------------------------------------------------------------------------------- 定义:CREATE [OR REPLACE] FUNCTION <过程名>[(参数列表)] RETURN 数据类型 IS
[局部变量声明]
BEGIN
可执行语句
EXCEPTION
异常处理语句
END [<过程名>]; 变量的类型:in 为默认类型,表示输入; out 表示只输出;in out 表示即输入又输出; 使用:
示例:
创建函数:
create or replace function f_1(n number) return number is
r emp%rowtype;
BEGIN
dbms_output.put_line('姓名 薪水');
select * into r from emp where empno=n;
dbms_output.put_line(r.ename||''||r.sal); --输出结果,需要 set serverout on 才能显示.
return r.sal;
END;
使用函数:
declare
n number;
m number;
begin
n:=&请输入员工号;
m:=f_1(n);
dbms_output.put_line('m的值为 '||m);
end; 删除函数:
DROP FUNCTION <函数名>;

 

数据包

 数据包
-------------------------------------------------------------------------------- 定义:
定义包的规范
CREATE [OR REPLACE] PACKAGE <数据包名> AS
--公共类型和对象声明
--子程序说明
END;
定义包的主体
CREATE [OR REPLACE] PACKAGE BODY <数据包名> AS
--公共类型和对象声明
--子程序主体
BEGIN
-初始化语句
END; 使用:
示例:
创建数据包规范:
create or replace package pack_1 as
n number;
procedure p_1;
FUNCTION f_1 RETURN number;
end; 创建数据包主体:
create or replace package body pack_1 as
procedure p_1 is
r emp%rowtype;
begin
select * into r from emp where empno=7788;
dbms_output.put_line(r.empno||''||r.ename||''||r.sal);
end; FUNCTION f_1 RETURN number is
r emp%rowtype;
begin
select * into r from emp where empno=7788;
return r.sal;
end;
end; 使用包:
declare
n number;
begin
n:=&请输入员工号;
pack_1.n:=n;
pack_1.p_1;
n:=pack_1.f_1;
dbms_output.put_line('薪水为 '||n);
end; 在包中使用REF游标
示例:
创建数据包规范:
create or replace package pack_2 as
TYPE c_type is REF CURSOR; --建立一个ref游标类型
PROCEDURE p_1(c1 in out c_type); --过程的参数为ref游标类型;
end; 创建数据包主体:
create or replace package body pack_2 as
PROCEDURE p_1(c1 in out c_type) is
begin
open c1 for select * from emp;
end;
end; 使用包:
var c_1 refcursor;
set autoprint on;
execute pack_2.p_1(:c_1); 删除包:
DROP PACKAGE <包名>;

 

触发器

 触发器

 --------------------------------------------------------------------------------
创建触发器:
CREATE [OR REPLACE] TRIGGER <触发器名>
BEFORE|AFTER
INSERT|DELETE|UPDATE [OF <列名>] ON <表名>
[FOR EACH ROW]
WHEN (<条件>)
<pl/sql块> 关键字"BEFORE"在操作完成前触发;"AFTER"则是在操作完成后触发;
关键字"FOR EACH ROW"指定触发器每行触发一次.
关键字"OF <列名>" 不写表示对整个表的所有列.
WHEN (<条件>)表达式的值必须为"TRUE". 特殊变量:
:new --为一个引用最新的列值;
:old --为一个引用以前的列值;
这些变量只有在使用了关键字 "FOR EACH ROW"时才存在.且update语句两个都有,而insert只有:new ,delect 只有:old; 使用RAISE_APPLICATION_ERROR
语法:RAISE_APPLICATION_ERROR(错误号(-20000到-20999),消息[,{true|false}]);
抛出用户自定义错误.
如果参数为'TRUE',则错误放在先前的堆栈上. INSTEAD OF 触发器
INSTEAD OF 触发器主要针对视图(VIEW)将触发的dml语句替换成为触发器中的执行语句,而不执行dml语句. 禁用某个触发器
ALTER TRIGGER <触发器名> DISABLE
重新启用触发器
ALTER TRIGGER <触发器名> ENABLE
禁用所有触发器
ALTER TRIGGER <触发器名> DISABLE ALL TRIGGERS
启用所有触发器
ALTER TRIGGER <触发器名> ENABLE ALL TRIGGERS
删除触发器
DROP TRIGGER <触发器名>

自定义对象

 自定义对象

 --------------------------------------------------------------------------------
创建对象:
CREATE [OR REPLACE] TYPE <对象名> AS OBJECT(
属性1 类型
属性2 类型
.
.
方法1的规范(MEMBER PROCEDURE <过程名>
方法2的规范 (MEMBER FUNCTION <函数名> RETURN 类型)
.
.
PRAGMA RESTRIC_REFERENCES(<方法名>,WNDS/RNDS/WNPS/RNPS);
关键字"PRAGMA RESTRIC_REFERENCES"通知ORACLE函数按以下模式之一操作;
WNDS-不能写入数据库状态;
RNDS-不能读出数据库状态;
WNPS-不能写入包状态;
RNDS-不能读出包状态; 创建对象主体:
CREATE [OR REPLACE] TYPE body <对象名> AS
方法1的规范(MEMBER PROCEDURE <过程名> is <PL/SQL块>
方法2的规范 (MEMBER FUNCTION <函数名> RETURN 类型 is <PL/SQL块>
END; 使用MAP方法和ORDER方法
用于对自定义类型排序。每个类型只有一个MAP或ORDER方法。
格式:MAP MEMBER FUNCTION <函数名> RETURN 类型
ORDER MEMBER FUNCTION <函数名> RETURN NUMBER 创建对象表
CREATE TABLE <表名> OF <对象类型> 示例:
1. 创建name 类型
create or replace type name_type as object(
f_name varchar2(20),
l_name varchar2(20),
map member function name_map return varchar2); create or replace type body name_type as
map member function name_map return varchar2 is --对f_name和l_name排序
begin
return f_name||l_name;
end;
end;
2 创建address 类型
create or replace type address_type as object
( city varchar2(20),
street varchar2(20),
zip number,
order member function address_order(other address_type) return number); create or replace type body address_type as
order member function address_order(other address_type) return number is --对zip排序
begin
return self.zip-other.zip;
end;
end; 3 创建stu对象
create or replace type stu_type as object (
stu_id number(5),
stu_name name_type,
stu_addr address_type,
age number(3),
birth date,
map member function stu_map return number,
member procedure update_age); create or replace type body stu_type as
map member function stu_map return number is --对stu_id排序
begin
return stu_id;
end;
member procedure update_age is --求年龄用现在时间-birth
begin
update student set age=to_char(sysdate,'yyyy')-to_char(birth,'yyyy') where stu_id=self.stu_id;
end;
end;
4. 创建对象表
create table student of stu_type(primary key(stu_id));
5.向对象表插值
insert into student values(1,name_type('关','羽'),address_type('武汉','成都路',43000), null,sysdate-365*20);
6.使用对象的方法
delcare
aa stu_type;
begin
select value(s) into aa from student s where stu_id=1; --value()将对象表的每一行转成行对象括号中必须为表的别名
aa.update_age();
end;
7.select stu_id,s.stu_name.f_name,s.stu_name.l_name from student s; --查看类型的值
8.select ref(s) from student s ; --ref()求出行对象的OID,括号中必须为表的别名;deref()将oid变成行队像;

其他

 其他

 --------------------------------------------------------------------------------
1.在PL/SQL中使用DDL
将sql语句赋给一个varchar2变量,在用execute immediate 这个varchar2变量即可;
示例:
declare
str varchar2(200);
begin
str:='create table test(id number,name varchar2(20))'; --创建表
execute immediate str;
str:='insert into test values(3,''c'')'; --向表里插数据
execute immediate str;
end;
但是要队这个表插入数据也必须使用execute immediate 字符变量 2.判断表是否存在;
示例:
declare
n tab.tname%type;
begin
select tname into n from tab where tname='&请输入表名';
dbms_output.put_line('此表以存在');
exception
when no_data_found then
dbms_output.put_line('还没有此表');
end; 2.查看以有的过程;
示例:
select object_name,object_type,status from user_objects where object_type='PROCEDURE';

七: 附录

Oracle 数据库类型

数据类型
    描述
VARCHAR2(size)
可变长度的字符串,其最大长度为size个字节;size的最大值是4000,而最小值是1;你必须指定一个VARCHAR2的size;
NVARCHAR2(size)
可变长度的字符串,依据所选的国家字符集,其最大长度为size个字符或字节;size的最大值取决于储存每个字符所需的字节数,其上限为4000;你必须指定一个NVARCHAR2的size;
NUMBER(p,s)
精度为p并且数值范围为s的数值;精度p的范围从1到38;数值范围s的范围是从-84到127;
例如:NUMBER(5,2)
表示整数部分最大3位,小数部分为2位;
NUMBER(5,-2) 表示数的整数部分最大为7其中对整数的倒数2位为0,前面的取整。
NUMBER
表示使用默认值,即等同于NUMBER(5);
LONG
可变长度的字符数据,其长度可达2G个字节;
DATE
有效日期范围从公元前4712年1月1日到公元后4712年12月31日
RAW(size)
长度为size字节的原始二进制数据,size的最大值为2000字节;你必须为RAW指定一个size;
LONG RAW
可变长度的原始二进制数据,其最长可达2G字节;
CHAR(size)
固定长度的字符数据,其长度为size个字节;size的最大值是2000字节,而最小值和默认值是1;
NCHAR(size)
也是固定长度。根据Unicode标准定义
CLOB
一个字符大型对象,可容纳单字节的字符;不支持宽度不等的字符集;最大为4G字节
NCLOB
一个字符大型对象,可容纳单字节的字符;不支持宽度不等的字符集;最大为4G字节;储存国家字符集
BLOB
一个二进制大型对象;最大4G字节
BFILE
包含一个大型二进制文件的定位器,其储存在数据库的外面;使得可以以字符流I/O访问存在数据库服务器上的外部LOB;最大大小为4G字节.
 
 

函数

   
   
 字符函数

名称
    描述
CONCAT(字符串1,字符串2)

将字符串1和字符串2连接成一个新的字符串
示例: select
CONCAT(job,ename) from emp

CONCAT(c1,c2)
【功能】连接两个字符串
【参数】c1,c2 字符型表达式 【返回】字符型 同:c1||c2 【示例】
select concat('010-','88888888')||'转23' 高乾竞电话 from dual; 高乾竞电话
----------------
010-88888888转23
LPAD(字段,总的大小,添充字符)

左填充即向右对齐
示例: select empno,lpad(sal,10,'*')
from emp

LPAD(c1,n[,c2])
【功能】在字符串c1的左边用字符串c2填充,直到长度为n时为止
【参数】C1 字符串
n 追加后字符总长度
c2 追加字符串,默认为空格
【返回】字符型
【说明】如果c1长度大于n,则返回c1左边n个字符
如果如果c1长度小于n,c2和c1连接后大于n,则返回连接后的右边n个字符 【示例】
SQL> select lpad('gao',10,'*') from dual; lpad('gao',10,'*')
-----------------
*******gao 不够字符则用*来填满 【相似】RPAD()在列的右边粘贴字符
【相反】LTRIM() 删除左边出现的字符串
RPAD(字段,总的大小,添充字符)

右填充即向左对齐
示例: select empno,rpad(sal,10) from
emp

RPAD(c1,n[,c2])
【功能】在字符串c1的右边用字符串c2填充,直到长度为n时为止
【参数】C1 字符串
n 追加后字符总长度
c2 追加字符串,默认为空格
【返回】字符型
【说明】如果c1长度大于n,则返回c1左边n个字符
如果如果c1长度小于n,c1和c2连接后大于n,则返回连接后的左边n个字符
如果如果c1长度小于n,c1和c2连接后小于n,则返回c1与多个重复c2连接(总长度>=n)后的左边n个字符 【示例】
SQL> select rpad('gao',10,'*a') from dual; rpad('gao',10,'*a')
-----------------
gao*a*a*a* 【相似】LPAD()在列的左边粘贴字符
【相反】RTRIM() 删除右边出现的字符串

LTRIM(c1,[,c2])
LTRIM(c1,[,c2])
【功能】删除左边出现的字符串
【参数】C1 字符串
c2 追加字符串,默认为空格
【返回】字符型 【示例】
SQL> select LTRIM(' gao qian jing',' ') text from dual;
或:select LTRIM(' gao qian jing') text from dual; text
-----------------
gao qian jing 【相似】RTRIM()删除右边出现的字符串
【相反】LPAD() 在列的左边粘贴字符
RTRIM(c1,[,c2])

RTRIM(c1,[,c2])
【功能】删除右边出现的字符串
【参数】C1 字符串
c2 追加字符串,默认为空格
【返回】字符型 【示例】
SQL> select RTRIM('gao qian jingXXXX','X') text from dual; text
-----------------
gao qian jing 【相似】LTRIM()删除左边出现的字符串
【相反】RPAD() 在列的右边粘贴字符
LOWER(字符串)

将字符串全部变成小写;

LOWER(c1)
【功能】:将字符串全部转为小写
【参数】:c1,字符表达式
【返回】:字符型
【示例】
SQL> select lower('AaBbCcDd')AaBbCcDd from dual; AABBCCDD
--------
aabbccdd 【同类】UPPER()将字符串全部转为大写。
UPPER(字符串)

将字符串全部变成大写;

UPPER(c1)
【功能】将字符串全部转为大写
【参数】c1,字符表达式
【返回】字符型
【示例】
SQL> select upper('AaBbCcDd') upper from dual; UPPER
--------
AABBCCDD 【同类】LOWER()将字符串全部转为小写
INITCAP(字符串)

将字符串变成第一个字母大写,其余都变成小写;

INITCAP(c1)
【功能】返回字符串并将字符串的第一个字母变为大写,其它字母小写;
【参数】c1字符型表达式 【返回】字符型 【示例】
SQL> select initcap('smith abc aBC') upp from dual; UPP
-----
Smith Abc Abc
LENGTH(字符串)

求出字符串的长度;

LENGTH(c1)
【功能】返回字符串的长度;
【说明】多字节符(汉字、全角符等),按1个字符计算
【参数】C1 字符串
【返回】数值型
【示例】
SQL> select length('高乾竞'),length('北京市海锭区'),length('北京TO_CHAR') from dual; length('高乾竞') length('北京市海锭区') length('北京TO_CHAR')
----------------- ---------------- ----------------------------
3 6 9
LENGTH(c1)
【功能】返回字符串的长度;
【说明】多字节符(汉字、全角符等),按2个字符计算
【参数】C1 字符串
【返回】数值型
【示例】
SQL> select length('高乾竞'),lengthB('高乾竞') from dual; length('高乾竞') lengthB('高乾竞')
----------------- ----------------
3 6
LENGTHC(c1).LENGTH2(c1).LENGTH4(c1)
【功能】返回字符串的长度;
【说明】多字节符(汉字、全角符等),按1个字符计算
【参数】C1 字符串
【返回】数值型
【示例】
SQL> select length('高乾竞'),length('北京市海锭区'),length('北京TO_CHAR') from dual; Oracle中的字符函数中,有一类函数是求字符长度的函数,length、lengthB、lengthC、length2、length4几个函数中比较常用的是length、lengthB。 他们的含义分别是:
Length函数返回字符的个数,使用定义是给定的字符集来计算字符的个数
LENGTHB给出该字符串的byte
LENGTHC使用纯Unicode
LENGTH2使用UCS2
LENGTH4使用UCS4 下面使一些例子:
Select length('你好') from dual; 2 Select lengthB('你好'),lengthC('你好'),length2('你好'), length4('你好') from dual;
SUBSTR(字符串,开始位置,长度)

从字符串中取子串;
示例: select substr(ename,2,3) from
emp;--从ename的第2位开始取3位

SUBSTR(c1,n1[,n2])
【功能】取子字符串
【说明】多字节符(汉字、全角符等),按1个字符计算
【参数】在字符表达式c1里,从n1开始取n2个字符;若不指定n2,则从第y个字符直到结束的字串.
【返回】字符型 【示例】
SQL> select substr('13088888888',3,8) test from dual; test
--------
08888888
INSTR(字符串,字符)

查看字符是否在字符串中存在;不存在返回0;存在则返回字符所在的的位置;如果有两个以上的字符则返回第一个的位置.
示例:select
instr(ename,'S') from emp;

----------------------------------------------------------------------------------------------------------------------------------------------

INSTR(C1,C2[,I[,J]])
【功能】在一个字符串中搜索指定的字符,返回发现指定的字符的位置;
【说明】多字节符(汉字、全角符等),按1个字符计算
【参数】
C1 被搜索的字符串
C2 希望搜索的字符串
I 搜索的开始位置,默认为1
J 第J次出现的位置,默认为1
【返回】数值 【示例】select instr('oracle traning','ra',1,2) instring from dual;
返回:9 【示例】select instr('重庆某软件公司','某',1,1),instrb('重庆某软件公司','某',1,1) instring from dual;
返回:3,5
INSTRB(C1,C2[,I[,J]])
【功能】在一个字符串中搜索指定的字符,返回发现指定的字符的位置;
【说明】多字节符(汉字、全角符等),按2个字符计算
【参数】
C1 被搜索的字符串
C2 希望搜索的字符串
I 搜索的开始位置,默认为1
J 第J次出现的位置,默认为1
【返回】数值 【示例】select instr('重庆某软件公司','某',1,1),instrb('重庆某软件公司','某',1,1) instring from dual;
返回:3,5
TRIM(字符 FROM 字符串)

去掉字符串首尾的字符;
示例: select trim('S' from ename)
from emp;

TRIM(c1 from c2)
【功能】删除左边和右边出现的字符串
【参数】C2 删除前字符串
c1 删除字符串,默认为空格
【返回】字符型 【示例】
select TRIM('X' from 'XXXgao qian jingXXXX'),TRIM('X' from 'XXXgaoXXjingXXXX') text from dual;
返回:gao qian jing gaoXXjing 【相似】LTRIM()删除左边出现的字符串 RTRIM()删除右边出现的字符串
TO_CHAR()
将不是其他类型转成字符类型;
对于日期型可以控制其格式:TO_CHAR(日期,'格式');
其中格式有: 'YYYY'
--以4为显示年;
'YEAR' --以标准格式显示年; 'MM' ; 'MON' ; 'DD' ; 'DAY'; 'HH' ; 'MI'
;'SS'
REPLACE(字符串,字符串1,字符串2)

将字符串中的字符1替换成字符2;
示例: select
replace(ename,'SC','SS') from emp;

REPLACE(c1,c2[,c3])
【功能】将字符表达式值中,部分相同字符串,替换成新的字符串
【参数】
c1 希望被替换的字符或变量
c2 被替换的字符串
c3 要替换的字符串,默认为空(即删除之意,不是空格)
【返回】字符型 【示例】
SQL> select replace('he love you','he','i') test from dual; test
------------------------------
i love you
TRANSLATE(字符串,字符串1,字符串2)

替换多的字符;
示例: select
translate(ename,'SH','AB') from emp;

--表示将ename中的'S'换成'A','H'换成'B';

TRANSLATE(c1,c2,c3)
【功能】将字符表达式值中,指定字符替换为新字符
【说明】多字节符(汉字、全角符等),按1个字符计算
【参数】
c1 希望被替换的字符或变量
c2 查询原始的字符集
c3 替换新的字符集,将c2对应顺序字符,替换为c3对应顺序字符
如果c3长度大于c2,则c3长出后面的字符无效
如果c3长度小于c2,则c2长出后面的字符均替换为空(删除)
如果c3长度为0,则返回空字符串。
如果c2里字符重复,按首次位置为替换依据 【返回】字符型 【示例】
select TRANSLATE('he love you','he','i'),
TRANSLATE('重庆的人','重庆的','上海男'),
TRANSLATE('重庆的人','重庆的重庆','北京男士们'),
TRANSLATE('重庆的人','重庆的重庆','1北京男士们'),
TRANSLATE('重庆的人','1重庆的重庆','北京男士们') from dual;
返回:i love you,上海男人,北京男人,1北京人,京男士人
ASCII(char)
ASCII(x1)
【功能】:返回字符表达式最左端字符的ASCII 码值。
【参数】:x1,字符表达式
【返回】:数值型
【示例】
SQL> select ascii('A') A,ascii('a') a,ascii(' ') space,ascii('示') hz from dual; A A SPACE hz
--------- --------- --------- ---------
65 97 32 51902 【说明】在ASCII()函数中,纯数字的字符串可不用‘’括起来,但含其它字符的字符串必须用‘’括起来使用,否则会出错。
  如果最左端是汉字,只取汉字最左半边字符的ASCII 码 【互反函数】:chr()
CHR(n1)
【功能】:将ASCII 码转换为字符。
【参数】:n1,为0 ~ 255,整数
【返回】:字符型
【示例】
SQL> select chr(54740) zhao,chr(65) chr65 from dual; ZH C
-- -
赵 A 【互反函数】:ASCII
NLSSORT(字符串)
对字符串排序.

NLS_INITCAP(x[,y])
NLS_INITCAP(x[,y])
【功能】返回字符串并将字符串的第一个字母变为大写,其它字母小写;
【参数】x字符型表达式
【参数】Nls_param可选,
查询数据级的NLS设置:select * from nls_database_parameters; 例如:
指定排序的方式(nls_sort=) 。
nls_sort=SCHINESE_RADICAL_M(部首、笔画)
nls_sort=SCHINESE_STROKE_M(笔画、部首SCHINESE_PINYIN_M(拼音)) 【返回】字符型 【示例】
select nls_initcap('ab cde') "test",
nls_initcap('a c b d e','nls_sort= SCHINESE_PINYIN_M') "test1" from dual;
返回:Ab Cde, A C B D E select nls_initcap('ab cde') "test",
nls_initcap('a c b d e','NLS_LANGUAGE=AMERICAN') "test1" from dual;
NLS_LOWER(x[,y])
NLS_LOWER(x[,y])
【功能】返回字符串并将字符串的变为小写;
【参数】x字符型表达式
【参数】Nls_param可选,指定排序的方式(nls_sort=) 。
SCHINESE_RADICAL_M(部首、笔画)
SCHINESE_STROKE_M(笔画、部首SCHINESE_PINYIN_M(拼音)) 【返回】字符型 【示例】
select nls_LOWER('ab cde') "test",nls_LOWER('a c b d e','nls_sort= SCHINESE_PINYIN_M') "test1" from dual;
NLS_UPPER(x[,y])

NLS_UPPER(x[,y])
【功能】返回字符串并将字符串的转换为大写;
【参数】x字符型表达式
【参数】Nls_param可选,指定排序的方式(nls_sort=) 。
SCHINESE_RADICAL_M(部首、笔画)
SCHINESE_STROKE_M(笔画、部首SCHINESE_PINYIN_M(拼音)) 【返回】字符型 【示例】
select NLS_UPPER('ab cde') "test",NLS_UPPER('a c b d e','nls_sort= SCHINESE_PINYIN_M') "test1" from dual;
返回:AB CDE,A C B D E
SOUNDEX(c1)
SOUNDEX(c1)
【功能】返回字符串参数的语音表示形式
【参数】c1,字符型
【返回】字符串 【说明】相对于比较一些读音相同,但是拼写不同的单词是非常有用的。 计算语音的算法:
  1.保留字符串首字母,但删除a、e、h、i、o、w、y
  2.将下表中的数字赋给相对应的字母
  (1) 1:b、f、p、v
  (2) 2:c、g、k、q、s、x、z
  (3) 3:d、t
  (4) 4:l
  (5) 5:m、n
  (6) 6:r
  3. 如果字符串中存在拥有相同数字的2个以上(包含2个)的字母在一起(例如b和f),或者只有h或w,则删除其他的,只保留1个
  4.只返回前4个字节,不够用0填充
  示例:
  soundex('two'),soundex('too'),soundex('to'),他们的结果都是T000
  soundex('cap'),soundex('cup'),他们的结果都是C100
  soundex('house'),soundex('horse'),他们的结果都分别是H200,H620


数学函数

名称
    描述
ABS(数字)
一个数的绝对值
CEIL(数字)
向上取整;不论小数后的书为多少都要向前进位;
CEIL(123.01)=124;
CEIL(-123.99)=-123;
FLOOR(数字)
向下取整;不论小数后的书为多少都删除;|
floor(123.99)=123;
floor(-123.01)=-124;
MOD(被除数,除数)
取余数;
MOD(20,3)=2
ROUND(数字,从第几为开始取)
四舍五入;
ROUND(123.5,0)=124;
ROUND(-123.5,0)=-124;

ROUND(123.5,-2)=100;
ROUND(-123.5,-2)=-100;
SIGN(数字)
判断是正数还是负数;正数返回1,负数返回-1,0返回0;
SQRT(数字)
对数字开方;
POWER(m,n)
求m的n次方;
TRUNC(数字,从第几位开始)
切数字;
TRUNC(123.99,1)=123.9
TRUNC(-123.99,1)=-123.9

TRUNC(123.99,-1)=120
TRUNC(-123.99,-1)=-120
TRUNC(123.99)=123
GREATEST(数字列表)
找出数字列表中最大的数;
示例:
select
greatest(100,200,-100) from dual; --结果为200
LEAST(数字列表)
找出数字列表中最小的数;
SIN(n)
求n的正旋
COS(n)
求n的余旋
TAN(n)
求n的正切
ACos(n)
求n的反正切
ATAN(n)
求n的反正切
exp(n)
求n的指数
LN(n) 
求n的自然对数,n必须大于0
LOG(m,n)
求n以m为底的对数,m和n为正数,且m不能为0

日期函数

名称
    描述
sysdate

sysdate
【功能】:返回当前日期。
【参数】:没有参数,没有括号
【返回】:日期 【示例】select sysdate hz from dual;
返回:2008-11-5
ADD_MONTHS(日期,数字)

在以有的日期上加一定的月份;
示例:
select
add_months(hiredate,20),hiredate from emp;

add_months(d1,n1)
【功能】:返回在日期d1基础上再加n1个月后新的日期。
【参数】:d1,日期型,n1数字型
【返回】:日期 【示例】select sysdate,add_months(sysdate,3) hz from dual;
返回:2008-11-5,2009-2-5
LAST_DAY(日期)
last_day(d1)
【功能】:返回日期d1所在月份最后一天的日期。
【参数】:d1,日期型
【返回】:日期 【示例】select sysdate,last_day(sysdate) hz from dual;
返回:2008-11-5,2008-11-30
MONTHS_BETWEEN(日期1,日期2)
months_between(d1,d2)
【功能】:返回日期d1到日期d2之间的月数。
【参数】:d1,d2 日期型 【返回】:数字
如果d1>d2,则返回正数
如果d1<d2,则返回负数 【示例】
select sysdate,
months_between(sysdate,to_date('2006-01-01','YYYY-MM-DD')),
months_between(sysdate,to_date('2016-01-01','YYYY-MM-DD')) from dual; 返回:2008-11-5,34.16,-85.84

示例:
select
months_between(sysdate,hiredate) from emp;

NEW_TIME(时间,时区,'gmt')
NEW_TIME(dt1,c1,c2)
【功能】:给出时间dt1在c1时区对应c2时区的日期和时间
【参数】:dt1,d2 日期型 【返回】:日期时间 【参数】:c1,c2对应的 时区及其简写
大西洋标准时间:AST或ADT
阿拉斯加_夏威夷时间:HST或HDT
英国夏令时:BST或BDT
美国山区时间:MST或MDT
美国中央时区:CST或CDT
新大陆标准时间:NST
美国东部时间:EST或EDT
太平洋标准时间:PST或PDT
格林威治标准时间:GMT
Yukou标准时间:YST或YDT 【示例】
select to_char(sysdate,'yyyy.mm.dd hh24:mi:ss') bj_time,
to_char(new_time(sysdate,'PDT','GMT'),'yyyy.mm.dd hh24:mi:ss') los_angles from dual; 返回:
BJ_TIME LOS_ANGLES
------------------- -------------------
2008.11.05 20:11:58 2008.11.06 03:11:58 【示例】
select sysdate bj_time,
new_time(sysdate,'PDT','GMT') los_angles from dual;
返回:
BJ_TIME LOS_ANGLES
------------------- -------------------
2008-11-05 20:11:58 2008-11-06 03:11:58
round(d1[,c1])

round(d1[,c1])
【功能】:给出日期d1按期间(参数c1)四舍五入后的期间的第一天日期(与数值四舍五入意思相近)
【参数】:d1日期型,c1为字符型(参数),c1默认为j(即最近0点日期)
【参数表】:c1对应的参数表:
最近0点日期: 取消参数c1或j
最近的星期日:day或dy或d
最近月初日期:month或mon或mm或rm
最近季日期:q
最近年初日期:syear或year或yyyy或yyy或yy或y(多个y表示精度)
最近世纪初日期:cc或scc 【返回】:日期 【示例】
select sysdate 当时日期,
round(sysdate) 最近0点日期,
round(sysdate,'day') 最近星期日,
round(sysdate,'month') 最近月初,
round(sysdate,'q') 最近季初日期,
round(sysdate,'year') 最近年初日期 from dual;
trunc(d1[,c1])

trunc(d1[,c1])
【功能】:返回日期d1所在期间(参数c1)的第一天日期
【参数】:d1日期型,c1为字符型(参数),c1默认为j(即当前日期)
【参数表】:c1对应的参数表:
最近0点日期: 取消参数c1或j
最近的星期日:day或dy或d (每周顺序:日,一,二,三,四,五,六)
最近月初日期:month或mon或mm或rm
最近季日期:q
最近年初日期:syear或year或yyyy或yyy或yy或y(多个y表示精度)
最近世纪初日期:cc或scc 【返回】:日期 【示例】
select sysdate 当时日期,
trunc(sysdate) 今天日期,
trunc(sysdate,'day') 本周星期日,
trunc(sysdate,'month') 本月初,
trunc(sysdate,'q') 本季初日期,
trunc(sysdate,'year') 本年初日期 from dual;
NEXT_DAY(d,char)
next_day(d1[,c1])
【功能】:返回日期d1在下周,星期几(参数c1)的日期
【参数】:d1日期型,c1为字符型(参数),c1默认为j(即当前日期)
【参数表】:c1对应:星期一,星期二,星期三……星期日
【返回】:日期 【示例】
select sysdate 当时日期,
next_day(sysdate,'星期一') 下周星期一,
next_day(sysdate,'星期二') 下周星期二,
next_day(sysdate,'星期三') 下周星期三,
next_day(sysdate,'星期四') 下周星期四,
next_day(sysdate,'星期五') 下周星期五,
next_day(sysdate,'星期六') 下周星期六,
next_day(sysdate,'星期日') 下周星期日 from dual;
extract(c1 from d1)

extract(c1 from d1)
【功能】:日期/时间d1中,参数(c1)的值
【参数】:d1日期型(date)/日期时间型(timestamp),c1为字符型(参数)
【参数表】:c1对应的参数表详见示例 【返回】:字符 【示例】
select
extract(hour from timestamp '2001-2-16 2:38:40 ' ) 小时,
extract(minute from timestamp '2001-2-16 2:38:40 ' ) 分钟,
extract(second from timestamp '2001-2-16 2:38:40 ' ) 秒,
extract(DAY from timestamp '2001-2-16 2:38:40 ' ) 日,
extract(MONTH from timestamp '2001-2-16 2:38:40 ' ) 月,
extract(YEAR from timestamp '2001-2-16 2:38:40 ' ) 年
from dual; select extract (YEAR from date '2001-2-16' ) from dual; select sysdate 当前日期,
extract(hour from timestamp timestamp sysdate) 小时,
extract(DAY from sysdate ) 日,
extract(MONTH from sysdate ) 月,
extract(YEAR from sysdate ) 年
from dual;
localtimestamp

localtimestamp
【功能】:返回会话中的日期和时间
【参数】:没有参数,没有括号
【返回】:日期 【示例】select localtimestamp from dual;
返回:14-11月-08 12.35.37.453000 上午
current_timestamp

current_timestamp
【功能】:以timestamp with time zone数据类型返回当前会话时区中的当前日期
【参数】:没有参数,没有括号
【返回】:日期 【示例】select current_timestamp from dual;
返回:14-11月-08 12.37.34.609000 上午 +08:00
current_date

current_date
【功能】:返回当前会话时区中的当前日期
【参数】:没有参数,没有括号
【返回】:日期 【示例】select current_date from dual;
返回:2008-11-14
dbtimezone

dbtimezone
【功能】:返回时区
【参数】:没有参数,没有括号
【返回】:字符型 【示例】select dbtimezone from dual;
SESSIONTIMEZONE

SESSIONTIMEZONE
【功能】:返回会话时区
【参数】:没有参数,没有括号
【返回】:字符型 【示例】select dbtimezone,SESSIONTIMEZONE from dual;
返回:+00:00 +08:00
INTERVAL c1 set1

INTERVAL c1 set1
【功能】:变动日期时间数值
【参数】:c1为数字字符串或日期时间字符串,set1为日期参数
【参数表】:set1具体参照示例 【返回】:日期时间格式的数值,前面多个+号
以天或天更小单位时可用数值表达式借用,如1表示1天,1/24表示1小时,1/24/60表示1分钟 【示例】
select
trunc(sysdate)+(interval '1' second), --加1秒(1/24/60/60)
trunc(sysdate)+(interval '1' minute), --加1分钟(1/24/60)
trunc(sysdate)+(interval '1' hour), --加1小时(1/24)
trunc(sysdate)+(INTERVAL '1' DAY), --加1天(1)
trunc(sysdate)+(INTERVAL '1' MONTH), --加1月
trunc(sysdate)+(INTERVAL '1' YEAR), --加1年
trunc(sysdate)+(interval '01:02:03' hour to second), --加指定小时到秒
trunc(sysdate)+(interval '01:02' minute to second), --加指定分钟到秒
trunc(sysdate)+(interval '01:02' hour to minute), --加指定小时到分钟
trunc(sysdate)+(interval '2 01:02' day to minute) --加指定天数到分钟
from dual;
   

转换函数

名称
    描述

chartorowid(c1) 。。
chartorowid(c1) 。。
【功能】转换varchar2类型为rowid值
【参数】c1,字符串,长度为18的字符串,字符串必须符合rowid格式
【返回】返回rowid值
【示例】
SELECT chartorowid('AAAADeAABAAAAZSAAA') FROM DUAL; 【说明】
在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。
在重复的记录中,可能所有列的内容都相同,但rowid不会相同.

ROWIDTOCHAR(rowid) 。。
ROWIDTOCHAR(rowid) 。。
【功能】转换rowid值为varchar2类型
【参数】rowid,固定参数
【返回】返回长度为18的字符串 【示例】
SELECT ROWIDTOCHAR(rowid) FROM DUAL; 【说明】
在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。
在重复的记录中,可能所有列的内容都相同,但rowid不会相同.

CONVERT(c1,set1,set2)

CONVERT(c1,set1,set2)
【功能】将源字符串c1 从一个语言字符集set2转换到另一个目的set1字符集
【参数】c1,字符串,set1,set2为字符型参数 【返回】字符串 【示例】
select convert('strutz','we8hp','f7dec') "conversion" from dual; conver
------
strutz select convert(name,'us7ascii','zhs16cgb231280') "conversion" from dual;
 

HEXTORAW(c1)

HEXTORAW(c1)
【功能】将一个十六进制构成的字符串转换为二进制 【参数】c1,十六进制的字符串 【返回】字符串 【示例】
select HEXTORAW('A123') from dual;
 

RAWTOHEX(c1)

RAWTOHEX(c1)
【功能】将一个二进制构成的字符串转换为十六进制 【参数】c1,二进制的字符串 【返回】字符串 【示例】
select RAWTOHEX('A123') from dual;

TO_CHAR(x[[,c2],C3])

TO_CHAR(x[[,c2],C3])
【功能】将日期或数据转换为char数据类型
【参数】
x是一个date或number数据类型。
c2为格式参数
c3为NLS设置参数
如果x为日期nlsparm=NLS_DATE_LANGUAGE
控制返回的月份和日份所使用的语言。
如果x为数字nlsparm=NLS_NUMERIC_CHARACTERS
用来指定小数位和千分位的分隔符,以及货币符号。
NLS_NUMERIC_CHARACTERS ="dg",
NLS_CURRENCY="string"

【返回】varchar2字符型

【说明1】x为数据型时

c1格式表参考:

序号 格式 简例 说明
1 ,(逗号) '9999,999' 逗号,一般以千分位出现,作为分组符号使用.如果需要您也可以当作是十分位,百分位出现,可以出现N次,视乎数字的大小而定.
变态的例子是 to_char(1234,'9,9,9,9').
注意事项:只能出现在整数部分.
2 .(点号) '99.99' 点号,不要念为"句号",句号是个圆圈,点好只能出现在小数点对应的地方.只能出现一次.
to_char(1234.34,'9,9,9,9.99')
注意事项:只能出现在一个地方,就是原来数据小数点位置
3 $(美元符号) '$999.99' 美元.其实你可以放在任意地方(在10G下)
to_char(1234.34,'9,9,9,9.$99')
注意事项:只能出现一次.
4 0(零) '0999.99' 零.在对应位置返回对应的字符,如果没有则以'0'填充.
to_char(0.34,'9,9,9,0.$99')='$0.34';to_char(1234,'9999.00')='1234.00';
注意事项:这是一个强制的符号,对应位没有,则以'o'填充,这是9很大不同地方
5 9 '999.99' 9.在小数位,则表示转换为对应字符,如果没有则以0表示;在整数位,没有对应则不填充字符.
to_char(123,'999.99')=123.00;
TO_CHAR(123,'99999.9')=123.0;
注意事项:对于0和9而言,如果格式的位数不如数字的位数多,会返回'#'.
譬如to_char(12345,'9999')='#####'
6 B(空格符) 'B999' 没有其它特别作用,在整数部分最前面加一个空格,可以出现在任意位置.
'S'||TO_CHAR(1234,'99B99')='S 1234';
注意事项:只能出现在整数部位.
7 C(国际货币符号) 'C9999' 在特定的位置返回一个ISO货币符号(就是NLS_ISO_CURRENCY参数所代表的值)
TO_CHAR(1233,'C9999')='CNY1234'
,这是新的国际标准RMB,关于这个可查询"国际货币符号"
注意事项:只能出现在整数部位第一位.
可以通过alter session set
NLS_ISO_CURRENCY='JAPAN';来修改当前会话的设置.
8 D(ISO 小数位符号) '999D99' 这是"点号"的国际版本(ISO),作用等同于点号,也是只能出现一次.所不同的是,数据库会根据NLS_NUMERIC_CHARACTER的参数值来设置内容.默认的这个值是点号.
注意事项:没有特别需要一般不要用这个格式符号.也不要轻易修改参数值.
也可用alter sesssion set 来修改.
alter session set nls_numeric_characters='!,';  
to_char(1234.34,'9999d99')=1234!34
9 EEEE(科学计算符) 9.9EEEE 科学计算符号
TO_CHAR(2008032001,'9.9EEEE')='2.01E+09',由于是科学计算方法,所以小数位前面加一个9或者0即可,多个是没有意义的.
10 G(分组符号) 999G999 是逗号(,)的的ISO标准,作为分组符号使用,可以放在多个地方使用.
TO_CHAR(123456,'999G9G99')=123,4,56
注意事项:同第八项 -D, 此外如果要转换出小数点,则要和D配合使用,不能和点号配合.
11 L(本地货币符号) 'L999' 是C的本地版本.可以放在整个格式的最前面和最后面.
TO_CHAR(123456,'999G9G99D00L')=123,4,56.00¥
注意事项:同第七项 C
12 MI(负号) '9999MI' 如果是负数,在尾部加上负号(-),如果是正数,则尾巴加上空格
to_char(1234,'9999mi')||'S'||TO_CHAR(-5678,'9999MI') =1234
S5678-
注意事项:只能放在格式尾巴
13 PR(符号) 9999PR 是表达负数的另外一种方式.如果是正数,则头部加上空格;如果是负数,则用小简括号<>把数字包起来.
TO_CHAR(-1234.89,'9G999D00PR')=<1,234.89>
注意事项:同12
14 RN(rn) RN(rn) 把整数(1-3999)转换为罗马字符.RN表示转为大写,rn表示小写的.
declare
i int;
begin
   for i in 1..20 loop
     dbms_output.put_line(to_char(i,'RN'));
   end loop;
end;
注意事项:只能自己使用,不能和其它符号组合使用.
15 S '9999S' 是12,13的综合改进版本.为整数加一个正号+,为负数加一个符号-.S在前则加在前,在后则在后.
TO_CHAR(-1234,'S9999')=-1234;TO_CHAR(1234,'S9999')=+1234
16 TM TM9/TMe 使用这个参数等于没有用参数to_char(number)一样,应为'tm9'是默认的格式参数.
to_char(1234,'tme')=1234
注意事项:格式要么是TM9,要么是TME.
当数字长度超过64位时候,TM9的输出等同于TME的输出.
17 U U999 双币符号,例如欧元.作用同11的L
TO_CHAR(999,'U999')=¥999
注意事项:通过NLS_DUAL_CURRENCY 控制
18 V 999V9 这是个比较古怪,又不是很常使用的符号。它的作用在于做一个计算。
例如TO_CHAR(N,'999V9'),以p表示V的位置,则该表达式=to_char(N×(10的P-1次方)).但是9个数又必须保证大于等于乘积之后表示的位数.
TO_CHAR(5,'9V')=5*1=5;
TO_CHAR(5,'9V9')=5*10=50
TO_CHAR(5,'9V99')=500
TO_CHAR(50,'9V99')='######' 9的个数不够
注意事项:格式中不能和小数表达写在一起,但是可以混合货币等。
19 X xxxx 转换为16进制。
TO_CHAR(100,'XX')= 64
注意事项:数值必须是大于等于0的整数。前面只能和0或者FM组合使用.
20     通过以上的例子,我们了解了各种数字的格式。可以说格式太多样,难于记在脑子,最好是作为一个参考存在着.
归类:
数值类: 0,9,
分组类: (.),(,),D,G ,其中点好和逗号因为表示不明显,所以用小括号凸显。
货币类: $,C,L,U
计算转换类:EEEE,RN,V,X
正负符号:MI,PR,S
其它类:B
正统类:TM

【示例】
to_char(1210.73, '9999.9') 返回 '1210.7'
to_char(1210.73,
'9,999.99') 返回 '1,210.73'
to_char(1210.73, '$9,999.00') 返回 '$1,210.73'

to_char(21, '000099') 返回 '000021'
to_char(852,'xxxx') 返回'
354'

【说明2】x为日期型,c2可用参数
 

序号 格式 简例 说明
1 -
/ , . ; :
时间分隔符号,除了标准的几个,还允许用文字作为分割符号。
"text" 例如
to_char(sysdate,'YYYY"年"mm"月"dd"日"')=2008年04月24日
2 AD   即拉丁文Anno
Domini的简写,表示公元.会根据nls的不同转换为公元或者ad等
A.D. 无特殊注意事项
3 AM   上午的简写 ,同pm, p.m. (下午) , 中文环境输出为上午(如果是上午)
A.M.
4 BC   虽然标准的写法是B.c. (c小写) 或者BC,好在Oracle不讲究这个。表示公元前
B.C.
5 CC   返回世纪,以阿拉伯数字表示
SCC 如果年的后两位介于01-99那么,返回前两位+1,否则返回前两位
6 D   一周之中的某天,返回的是序号1-7
7 DAY   一周之中的某天,不过返回的是星期几而已,这和语言设置有关系,在中国环境
NLS_DATE_LANGUAGE=SIMPLIFIED CHINESE ,用星期一到星期天表示
8 DD   月份中的某天(1-31)
9 DDD   年份中的某天(1-366)
10 DL 'DL' 返回长的日期格式。受到NLS_TERRITORY,NLS_LANGUAGE参数控制。例
2008年4月28日 星期一
限制:除了DL,其它什么的都不能设置。
11 DS   返回短的日期格式。受到NLS_TERRITORY,NLS_LANGUAGE参数控制。
例如 2008-04-28
限制:除了DL,其它什么的都不能设置。
12 DY   日期的简称,就是星期几(当然这指的是中国环境下)
13 E   纪元简称,但是只适合以下集中日历:日本皇室,中华民国,太过佛历
14 EE   纪元全程,适合情况同E
15 FF [1..9]   就是毫秒,如果不更上数字就是用默认的精度。
只能用于timestamp类型的。
16 FM   值得注意的一个函数:不返回任何内容。
有点不明白oracle为什么设置这个东西.
17 FX   同上
18 HH   表示小时,为12小时制,同hh12(1-12)
19 HH12   表示小时,为12小时制(1-12)
20 HH24   表示小时,为24小时制(0-23)
21 IW   ISO标准的星期序号(1-52,或者1-53)
22 IYYY   IYY,IY,I,
ISO年(4位)的4,3,2,1位数字(倒数)
IYY to_char(to_date(21120401,'yyyymmdd'),'iyyy,
iyy,iy,i')=2112, 112,12,2
IY  
I  
23 J   儒略日(多用于天文的一种日历),从公元前4712年一月一日算起,得出的结果是个整数,算法大体为
(公元日期+4712)*儒略日历年平均天数
24 MI   秒(0-59)
25 MM   2位月(1-12)
26 MON   月的简称,和国家有关系NLS_DATE_LANGUAGE,例如04在中文环境下用4月表示.
27 MONTH   月的名称,国家有关系NLS_DATE_LANGUAGE,目前在中文下04表示为4月。
28 PM   同am,a.m.表示下午
P.M.
29 Q   季度(1-4)
30 RM   用罗马数字表示的月份,I  
,II ,III ,IV ,V   ,VI ,VII ,VIII,IX ,X   ,XI ,XII
31 RR   有点四舍五入表示年的意思,具体的用法有那么一点点复杂。
以s表示输入的年份最后两位,c表示当前的年份最后两位,其输出结果(新的年份前两位)可以用函数r=f(s,c)来表示,s2,c2分别表示s,c的前两位。
1)s=[0,49],c=[0,49],则r=c2
2) s=[0,49],c=[50,99],则 r=c2+1
3) s=[50,99],c=[0,49],则r=c2-1
4) s=[50,99],c=[50,99],则 r=c2
简而言之就是靠近当前年份原则,如果和当前年份同区域那么就一样,如果比当前区域大,那么就是当作是当前世纪前一世纪,否则就是下一个世纪。
举例来说,以to_date为例子
SQL> select to_date('89-01-01','rr-mm-dd')
,to_date('12-01-01','rr-mm-dd') FROM DUAL;
 
TO_DATE('89-01-01','RR-MM-DD')
TO_DATE('12-01-01','RR-MM-DD')
------------------------------
------------------------------
1989-01-01                     2012-01-01
我想oracle会搞这个东东出来,估计有两个考虑一个是为了方便,一个是为了对付百年或者千年问题。
32 RRRR   如果输入参数只有两位,则同rr,否则就同yyyy作用.
33 SS   秒(0-59),一分钟内
34 SSSSS   一天从午夜开始的累积秒数.(0-86399)
35 TS   返回短日期格式内容,包括时分秒等,只能和dl,ds组合使用,格式是:
dl ts或者dl ts ,中间以空格间隔开。TO_CHAR(SYSDATE,'TS')=下午 4:50:04
表现形式受NLS_TERRITORY 和NLS_LANGUAGE影响。
36 TZD   夏令时制信息,时区简写加上夏令时信息,必须和格式tzr设置的时区对应。
包括下面三个TZ开头的,都是和时区相关,并不是直接用在to_char
37 TZH   时区中的小时,例如hh:mi:ss.fftzh:tzm'
38 TZM   时区中的分钟.
39 TZR   时区中的区域信息,必须是数据库支持的时区,例如US/Pacific
40 WW   和iw类似,也是表示星期的序号,从年的第一天算起到年的最后一个第七天。二者取值基本相同。(1-53)
,例如2008-01-01 到2008-01-07 算1,2008-01-09~2008-01-13 算2
41 W   一个月中的星期序号,其算法同ww,不过是局限在一月之内而已,和iso的不同。
42 X   代表本地根符号,没有特别用处,只能和timestamp类型一起使用.
43 Y,YYY   四位年,用都好分隔
例如2,008
44 YEAR   发音表达的年,例如
2008=two thousand eight
SYEAR S前缀表示公元前BC
45 YYYY   四位年,S前缀表示公元前BC
SYYYY
46 YYY   一次表示后面3,2,1位的年,例如2008 可以分别取值为008,08,8
YY
Y
  总结   从以上看,主要就是表示时间几个部分的格式:世纪、年,月,日,时,分,秒,毫秒,以及其它一些混合格式。每个时间部分都可以有多种的表达方式,通过这样归类就比较容易记忆。
很多格式可以组合使用,这样最终可以形成足够丰富的表达其形势;
其次很多格式和nls是密切相关的;最后某些输出(返回)和格式大小写是有关系的,这在中文环境下体现不出来(目前来没有看到),但是english环境下就名下,以to_char(sysdate,'day')为例子,如果是西文环境是返回sun(假设sysdate位于周末),如果to_char(sysdate,'DAY')则返回SUN

【示例】
to_char(sysdate,'d') 每周第几天
to_char(sysdate,'dd') 每月第几天

to_char(sysdate,'ddd') 每年第几天
to_char(sysdate,'ww') 每年第几周

to_char(sysdate,'mm') 每年第几月
to_char(sysdate,'q') 每年第几季

to_char(sysdate,'yyyy') 年

SQL> select to_char(sysdate,' PM yyyy-mm-dd hh24:mi:sssss AD year mon
day ddd iw') FROM
DUAL;
TO_CHAR(SYSDATE,'PMYYYY-MM-DDH
--------------------------------------------------------------------------------
上午
2008-03-27 09:58:35917 公元 two thousand eight 3月 星期四 087 13
SQL> SELECT
TO_CHAR(SYSTIMESTAMP,'HH24:MI:SS.FF5') FROM
DUAL;
TO_CHAR(SYSTIMESTAMP,'HH24:MI:
------------------------------
10:02:28.90000
SQL>SELECT
TO_CHAR(SYSDATE,'DS DL') FROM
DUAL
TO_CHAR(SYSDATE,'DSDL')
-----------------------------------
2008-03-27
2008年3月27日 星期四

【示例】带C3示例

select
to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American')
from dual;
返回:monday

 

TO_DATE(X[,c2[,c3]])
TO_DATE(X[,c2[,c3]])
【功能】将字符串X转化为日期型
【参数】c2,c3,字符型,参照to_char()
【返回】字符串 如果x格式为日期型(date)格式时,则相同表达:date x
如果x格式为日期时间型(timestamp)格式时,则相同表达:timestamp x 【相反】 to_char(date[,c2[,c3]]) 【示例】
select to_date('199912','yyyymm'),
to_date('2000.05.20','yyyy.mm.dd'),
(date '2008-12-31') XXdate,
to_date('2008-12-31 12:31:30','yyyy-mm-dd hh24:mi:ss'),
(timestamp '2008-12-31 12:31:30') XXtimestamp
from dual;

TO_NUMBER(X[[,c2],c3])
TO_NUMBER(X[[,c2],c3])
【功能】将字符串X转化为数字型
【参数】c2,c3,字符型,参照to_char()
【返回】数字串 【相反】 to_char(date[[,c2],c3]) 【示例】
select TO_NUMBER('199912'),TO_NUMBER('450.05') from dual; 转换为16进制。
TO_CHAR(100,'XX')= 64

TO_MULTI_BYTE(c1)
TO_MULTI_BYTE(c1)
【功能】将字符串中的半角转化为全角
【参数】c1,字符型
【返回】字符串 【示例】
SQL> select to_multi_byte('高A') text from dual; test
--
高A

to_single_byte(c1)
to_single_byte(c1)
【功能】将字符串中的全角转化为半角
【参数】c1,字符型
【返回】字符串 【示例】
SQL> select to_multi_byte('高A') text from dual; test
----
高A

nls_charset_id(c1)
nls_charset_id(c1)
【功能】返回字符集名称参应id值
【参数】c1,字符型
【返回】数值型 sql> select nls_charset_id('zhs16gbk') from dual; nls_charset_id('zhs16gbk')
--------------------------
852

nls_charset_name(n1)
nls_charset_name(n1)
【功能】返回字符集名称参应id值
【参数】n1,数值型
【返回】字符型 sql> select nls_charset_name(852) from dual; nls_char
--------
zhs16gbk

聚合函数

AVG([distinct|all]x)

AVG([distinct|all]x)
【功能】统计数据表选中行x列的平均值。 【参数】all表示对所有的值求平均值,distinct只对不同的值求平均值,默认为all
如果有参数distinct或all,需有空格与x(列)隔开。 【参数】x,只能为数值型字段 【返回】数字值 【示例】
环境:
create table table3(xm varchar(8),sal number(7,2));
insert into table3 values('gao',1111.11);
insert into table3 values('gao',1111.11);
insert into table3 values('zhu',5555.55);
commit; 执行统计:
select avg(distinct sal),avg(all sal),avg(sal) from table3;
结果: 3333.33 2592.59 2592.59

SUM([distinct|all]x)

SUM([distinct|all]x)
【功能】统计数据表选中行x列的合计值。 【参数】all表示对所有的值求合计值,distinct只对不同的值求合计值,默认为all
如果有参数distinct或all,需有空格与x(列)隔开。 【参数】x,只能为数值型字段 【返回】数字值 【示例】
环境:
create table table3(xm varchar(8),sal number(7,2));
insert into table3 values('gao',1111.11);
insert into table3 values('gao',1111.11);
insert into table3 values('zhu',5555.55);
commit; 执行统计:
select SUM(distinct sal),SUM(all sal),SUM(sal) from table3;
结果: 6666.66 7777.77 7777.77

STDDEV([distinct|all]x)

STDDEV([distinct|all]x)
【功能】统计数据表选中行x列的标准误差。 【参数】all表示对所有的值求标准误差,distinct只对不同的值求标准误差,默认为all
如果有参数distinct或all,需有空格与x(列)隔开。 【参数】x,只能为数值型字段 【返回】数字值 【示例】
环境:
create table table3(xm varchar(8),sal number(7,2));
insert into table3 values('gao',1111.11);
insert into table3 values('gao',1111.11);
insert into table3 values('zhu',5555.55);
commit; 执行统计:
select STDDEV(distinct sal),STDDEV(all sal),STDDEV(sal) from table3;
结果: 3142.69366257674 2565.99863039714 2565.99863039714

VARIANCE([distinct|all]x)

VARIANCE([distinct|all]x)
【功能】统计数据表选中行x列的方差。 【参数】all表示对所有的值求方差,distinct只对不同的值求方差,默认为all
如果有参数distinct或all,需有空格与x(列)隔开。 【参数】x,只能为数值型字段 【返回】数字值 【示例】
环境:
create table table3(xm varchar(8),sal number(7,2));
insert into table3 values('gao',1111.11);
insert into table3 values('gao',1111.11);
insert into table3 values('zhu',5555.55);
commit; 执行统计:
select VARIANCE(distinct sal),VARIANCE(all sal),VARIANCE(sal) from table3;
结果: 9876523.4568 6584348.9712 6584348.9712

count(*|[distinct|all]x)

count(*|[distinct|all]x)
【功能】统计数据表选中行x列的合计值。 【参数】
*表示对满足条件的所有行统计,不管其是否重复或有空值(NULL) all表示对所有的值统计,默认为all
distinct只对不同的值统计,
如果有参数distinct或all,需有空格与x(列)隔开,均忽略空值(NULL)。 【参数】x,可为数字、字符、日期型及其它类型的字段 【返回】数字值 count(*)=sum(1) 【示例】
环境:
create table table3(xm varchar(8),sal number(7,2));
insert into table3 values('gao',1111.11);
insert into table3 values('gao',1111.11);
insert into table3 values('zhu',5555.55);
insert into table3 values('',1111.11);
insert into table3 values('zhu',0);
commit; 执行统计:
select count(*),count(xm),count(all xm),count(distinct sal),count(all sal),count(sal),sum(1) from table3;
结果: 5 4 4 3 5 5 5

MAX([distinct|all]x)

MAX([distinct|all]x)
【功能】统计数据表选中行x列的最大值。 【参数】all表示对所有的值求最大值,distinct只对不同的值求最大值,默认为all
如果有参数distinct或all,需有空格与x(列)隔开。 【参数】x,可为数字、字符或日期型字段 【返回】对应x字段类型 【示例】
环境:
create table table3(xm varchar(8),sal number(7,2));
insert into table3 values('gao',1111.11);
insert into table3 values('gao',1111.11);
insert into table3 values('zhu',5555.55);
insert into table3 values('',1111.11);
insert into table3 values('zhu',0);
commit; 执行统计:
select MAX(distinct sal),MAX(xm) from table3;
结果:5555.55 zhu

MIN([distinct|all]x)

MIN([distinct|all]x)
【功能】统计数据表选中行x列的最大值。 【参数】all表示对所有的值求最大值,distinct只对不同的值求最大值,默认为all
如果有参数distinct或all,需有空格与x(列)隔开。 【参数】x,可为数字、字符或日期型字段 【返回】对应x字段类型
注:字符型字段,将忽略空值(NULL) 【示例】
环境:
create table table3(xm varchar(8),sal number(7,2));
insert into table3 values('gao',1111.11);
insert into table3 values('gao',1111.11);
insert into table3 values('zhu',5555.55);
insert into table3 values('',1111.11);
insert into table3 values('zhu',0);
commit; 执行统计:
select MIN(distinct sal),MIN(xm),MIN(distinct xm),MIN(all xm) from table3;
结果:0 gao gao gao
   

Oracle 分析函数

   
   
   
 
   

其他函数

 
名称
    描述
VSIZE(类型)
求出数据类型的大小;
NVL(字符串,替换字符)
如果字符串为空则替换,否则不替换
 
   
   
   
命令
    描述
DESC 表名
查看表的信息.
SET SERVEROUT [ON|OFF]
设置系统输出的状态.
SET PAGESIZE <大小>
设置浏览中没页的大小
SET LINESIZE <大小>
设置浏览中每行的长度
SET AUTOPRINT [ON|OFF]
设置是否自动打印全局变量的值
SELECT SYSDATE FROM DUAL
查看当前系统时间
ALTER SESSION SET nls_date_format='格式'
设置当前会话的日期格式
示例:ALTER SESSION SET
nls_date_format='dd-mon-yy hh24:mi:ss'
SELECT * FROM TAB
查看当前用户下的所有表
SHOW USER
显示当前用户
HELP TOPIC
显示有那些命令
SAVE <file_name>
将buf中的内容保存成一个文件
RUN <file_name>
执行已经保存的文件;也可以写成@<file_name>
GET <file_name>
显示文件中的内容
LIST
显示buf中的内容
ED
用记事本打开buf,可以进行修改
DEL 行数
删除buf中的单行
DEL 开始行 结束行
删除buf中的多行
INPUT 字符串
向buf中插入一行
APPEND 字符串
将字符串追加到当前行
C/以前的字符串/替换的字符串
修改buf中当前行的内容
CONNECT
连接
DISCONNECT
断开连接
QUIT
退出sql*plus
EXP
导出数据库(可以在DOS键入exp help=y 可以看到详细说明)
示例: exp
scott/tiger full=y file=e:\a.dmp; --导出scott下的所有东西
        exp scott/tiger
tables=(emp,dept) file=e:\emp.dmp --导出scott下的                               
                                                            
emp,dept表
IMP
导入数据库(可以在DOS键入imp help=y 可以看到详细说明)
imp
scott/tiger tables=(emp,dept) file=e:\emp.dmp

可以通过help <命令>获得命令的帮助 

 
   

常用命令

 
异常
    描述
CURSOR_ALREADY_OPEN
试图"OPEN"一个已经打开的游标
DUP_VAL_ON_INDEX
试图向有"UNIQUE"中插入重复的值
INVALID_CURSOR
试图对以关闭的游标进行操作
INVALID_NUMBER
在SQL语句中将字符转换成数字失败
LOGIN_DENIED
使用无效用户登陆
NO_DATA_FOUND
没有找到数据时
NOT_LOGIN_ON
没有登陆Oracle就发出命令时
PROGRAM_ERROR
PL/SQL存在诸如某个函数没有"RETURN"语句等内部问题
STORAGE_ERROR
PL/SQL耗尽内存或内存严重不足
TIMEOUT_ON_RESOURCE
Oracle等待资源期间发生超时
TOO_MANY_ROWS
"SELECT INTO"返回多行时
VALUE_ERROR
当出现赋值错误
ZERO_DIVIDE
除数为零
 
   

 

   

最新文章

  1. 设计模式 — 简单工厂模式(Simple Factory)
  2. 配置SQL server远程连接(局域网)
  3. js组件在线编辑器插件、图表库插件、文件树插件
  4. javaweb学习之Servlet开发(二)
  5. HDU 4925 Apple Tree(模拟题)
  6. 走出 null 就是空值的误区,以及变量赋值原理
  7. Qt 学习之路 :文本文件读写
  8. 临时解决linux下time wait问题
  9. Microsoft Visual C++ 不支持long long
  10. ASP.NET LINQ SQL执行超时的问题
  11. HBase数据存储格式
  12. 转载:ECMAScript 6简介
  13. [C#6] 8-异常增强
  14. CentOS 7 建立svn仓库 远程连接
  15. netstat统计的tcp连接数与⁄proc⁄pid⁄fd下socket类型fd数量不一致的分析
  16. Windows WaveIn 录音
  17. POJ 2337 Catenyms
  18. 【Kafka源码】Kafka启动过程
  19. 第三篇:python函数
  20. LaTeX数学公式基础

热门文章

  1. python随机数random模块
  2. kettle中的合并记录使用记录
  3. 贝叶斯网络与LDA
  4. 非关系型数据库mongodb的语法模式
  5. python面向对象--私有和继承
  6. react-踩坑记录——页面底部多出一倍高度的空白
  7. 7-10 多项式A除以B (25 分)
  8. 前端必备——js中前端与后台的数据交互全解
  9. android PopupWindow 显示问题
  10. C++ std::pair的用法