zoukankan      html  css  js  c++  java
  • oracle_基本SQL语言

     

    一:DDL数据定义语言

    1:create(创建)

          创建表

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

      复制表

      1 CREATE TABLE <table_name> as <SELECT 语句>
      2 
      3 ---(需注意的是复制表不能复制表的约束);
      4 
      5 --示例:
      6 create table test as select * from emp;
      7 
      8 ---如果只复制表的结构不复制表的数据则:
      9 create table test as select * from emp where 1=2;

    创建索引

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

    创建同义词

      1 --创建同义词
      2 
      3 --------------------------------------------------------------------------------
      4 
      5 CREATE SYNONYM <synonym_name> for <tablename/viewname>
      6 
      7 --同义词即是给表或视图取一个别名。
      8 
      9 --示例:
     10 create synonym mm for emp;
     11 

    2:alter(修改)

      1 --修改表
      2 
      3 --------------------------------------------------------------------------------
      4 
      5 --1.向表中添加新字段
      6 ALTER TABLE <table_name> ADD (字段1 类型 [NOT NULL],字段2 类型 [NOT NULL].... );
      8 
      9 --2.修改表中字段
     10 ALTER TABLE <table_name> modify(字段1 类型,字段2 类型.... );
     11 
     12 --3 .删除表中字段
     13 ALTER TABLE <table_name> drop(字段1,字段2 .... );
     14 
     15 --4 .修改表的名称
     16 RENAME <table_name> to <new table_name>;
     17 
     18 --5 .对已经存在的表添加约束
     19 ALTER TABLE <table_name> ADD CONSTRAINT <constraint_name> 约束类型 (针对的字段名);
     20 ---示例:
     21 Alter table emp add constraint S_F Foreign key (deptno) references dept(deptno);
     22 
     23 --6 .对表里的约束禁用;
     24 ALTER TABLE <table_name> DISABLE CONSTRAINT <constraint_name>;
     25 
     26 ---7 .对表里的约束重新启用;
     27 ALTER TABLE <table_name> ENABLE CONSTRAINT <constraint_name>;
     28 
     29 ---8 .删除表中约束
     30 ALTER TABLE <table_name> DROP CONSTRAINT <constraint_name>;
     31 ---示例:
     32 ALTER TABLE emp drop CONSTRAINT <Primary key>;
     33 
     34 
     35 

    2:drop(删除)

      删除表

      1 --删除表
      2 
      3 --------------------------------------------------------------------------------
      4 DROP TABLE <table_name>;
      5 
      6 ---示例
      7 drop table emp;
      8 

    删除索引

      1 --删除索引
      2 
      3 --------------------------------------------------------------------------------
      4 DROP INDEX <index_name>;
      5 
      6 --示例
      7 drop index i_1;
      8 

    删除同义词

      1 --删除同义词
      2 
      3 --------------------------------------------------------------------------------
      4 DROP SYNONYM <synonym_name>;
      5 
      6 --示例
      7 drop synonym mm;
      8 

    二:DML数据操纵语言 

    插入记录  insert into

      1 --插入记录
      2 
      3 --------------------------------------------------------------------------------
      4 INSERT INTO table_name (column1,column2,...)
      5 values ( value1,value2, ...);
      6 
      7 --示例
      8 insert into emp (empno,ename) values(9500,'AA');
      9 
     10 
     11 --把 一个表中的数据插入另一个表中
     12 
     13 INSERT INTO <table_name> <SELECT 语句>
     14 --示例
     15 create table a as select * from emp where 1=2;
     16 insert into a select * from emp where sal>2000;
     17 
     18 
     19 

    查询记录  select

      1 --查询记录
      2 
      3 --------------------------------------------------------------------------------
      4 
      5 --一般查询
      6 SELECT [DISTINCT] <column1 [as new name] ,columns2,...>
      7 FROM <table1>
      8 [WHERE <条件>]
      9 [GROUP BY <column_list>]
     10 [HAVING <条件>]
     11 [ORDER BY <column_list> [ASC|DESC]]
     12 
     13 /*
     14 DISTINCT --表示隐藏重复的行
     15 WHERE --按照一定的条件查找记录
     16 GROUP BY --分组查找(需要汇总时使用)
     17 HAVING --分组的条件
     18 ORDER BY --对查询结果排序
     19 
     20 
     21 要显示全部的列可以用*表示 */
     22 --示例:
     23 select * from emp;
     24 
     25 WHERE 语句的运算符
     26 where <条件1>AND<条件2> --两个条件都满足
     27 --示例:
     28 select * from emp where deptno=10 and sal>1000;
     29 
     30 where <条件1>OR<条件2> --两个条件中有一个满足即可
     31 --示例:
     32 select * from emp where deptno=10 OR sal>2000;
     33 
     34 where NOT <条件> --不满足条件的
     35 --示例:
     36 select * from emp where not deptno=10;
     37 
     38 where IN(条件列表) --所有满足在条件列表中的记录
     39 --示例:
     40 select * from emp where empno in(7788,7369,7499);
     41 
     42 where BETWEEN .. AND ..  --按范围查找
     43 --示例:
     44 select * from emp where sal between 1000 and 3000;
     45 
     46 where 字段 LIKE --主要用与字符类型的字段 
     47 --示例1:
     48 select * from emp where ename like '_C%'; --查询姓名中第二个字母是'C'的人
     49 --'-' 表示任意字符;
     50 --'%' 表示多字符的序列;
     51 
     52 where 字段 IS [NOT] NULL --查找该字段是[不是]空的记录
     53 
     54 --汇总数据是用的函数
     55 --SUM --求和
     56 --示例:
     57 select deptno,sum(sal) as sumsal from emp GROUP BY deptno;
     58 
     59 /*
     60 AVG --求平均值
     61 MAX --求最大值
     62 MIN --求最小值
     63 COUNT --求个数
     64 */
     65 
     66 --子查询 
     67 SELECT <字段列表> from <table_name> where 字段 运算符(<SELECT 语句>);
     68 
     69 --示例:
     70 select * from emp where sal=(select max(sal) from emp);
     71 
     72 --运算符
     73 Any
     74 --示例:
     75 select * from emp where sal>ANY(select sal from emp where deptno=30) and deptno<>30;
     76 --找出比deptno=30的员工最低工资高的其他部门的员工
     77 
     78 --ALL 
     79 select * from emp where sal>ALL(select sal from emp where deptno=30) and deptno<>30;
     80 --找出比deptno=30的员工最高工资高的其他部门的员工
     81 
     82 
     83 --连接查询 
     84 SELECT <字段列表> from <table1,table2> WHERE table1.字段[(+)]=table2.字段[(+)]
     85 
     86 --示例
     87 select empno,ename,dname from emp,dept where emp.deptno=dept.deptno;
     88 
     89 
     90 --查询指定行数的数据
     91 SELECT <字段列表> from <table_name> WHERE ROWNUM<行数;
     92 --示例:
     93 select * from emp where rownum<=10;--查询前10行记录
     94 --注意ROWNUM只能为1 因此不能写 select * from emp where rownum between 20 and 30;
     95 
     96 --要查第几行的数据可以使用以下方法:
     97 select * from emp where rownum<=3 and empno not in (select empno from emp where rownum<=3);
     98 --结果可以返回整个数据的3-6行;
     99 --不过这种方法的性能不高;如果有别的好方法请告诉我。
    100 
    101 
    102 
    103 
    104 
    105 

     

    更新数据  update

      1 --更新数据
      2 
      3 --------------------------------------------------------------------------------
      4 UPDATE table_name set column1=new value,column2=new value,...
      5 WHERE <条件>
      6 
      7 --示例
      8 update emp set sal=1000,empno=8888 where ename='SCOTT'
      9 

    删除数据  delete

      1 --更新数据
      2 
      3 --------------------------------------------------------------------------------
      4 DELETE FROM <table_name>
      5 WHERE <条件>
      6 
      7 --示例
      8 delete from emp where empno='7788'
      9 

    三:DCL数据控制语言 

    数据控制语言

      1 --数据控制语言
      2 
      3 --------------------------------------------------------------------------------
      4 --1.授权
      5 GRANT <权限列表> to <user_name>;
      6 
      7 --2.收回权限
      8 REVOKE <权限列表> from <user_name>
      9 
     10 /*
     11 Oracle 的权限列表
     12 connect 连接
     13 resource 资源
     14 unlimited tablespace 无限表空间
     15 dba 管理员
     16 session 会话
     17 */

    四:TCL事务控制语言 

      1 --数据控制语言
      2 
      3 --------------------------------------------------------------------------------
      4 --1.提交;
      5 COMMIT;
      6 
      7 --2.回滚;
      8 ROLLBACK [TO savepoint]
      9 
     10 --3.保存位置。
     11 SAVEPOINT <savepoint>
     12 
     13 

    五:Oracle 其他对象

    视图:

      1 --创建视图 
      2 --------------------------------------------------------------------------------
      3 CREATE [OR REPLACE] VIEW <view_name>
      4 AS
      5 <SELECT 语句>;
      6 
      7 OR REPLACE --表示替换以有的视图
      8 
      9 --删除视图 
     10 --------------------------------------------------------------------------------
     11 
     12 DROP VIEW <view_name>
     13 
     14 

    序列:

      1 --创建序列 
      2 --------------------------------------------------------------------------------
      3 
      4 CREATE SEQUENCE <sequencen_name>
      5 INCREMENT BY n
      6 START WITH n
      7 [MAXVALUE n][MINVALUE n]
      8 [CYCLE|NOCYCLE]
      9 [CACHE n|NOCACHE];
     10 
     11 /*
     12 INCREMENT BY n --表示序列每次增长的幅度;默认值为1.
     13 START WITH n --表示序列开始时的序列号。默认值为1.
     14 MAXVALUE n --表示序列可以生成的最大值(升序).
     15 MINVALUE n --表示序列可以生成的最小值(降序).
     16 CYCLE --表示序列到达最大值后,在重新开始生成序列.默认值为 NOCYCLE。
     17 CACHE --允许更快的生成序列.
     18 */
     19 
     20 --示例:
     21 create sequence se_1
     22 increment by 1
     23 start with 100
     24 maxvalue 999999
     25 cycle;
     26 
     27 
     28 --修改序列 
     29 
     30 
     31 --------------------------------------------------------------------------------
     32 
     33 ALTER SEQUENCE <sequencen_name>
     34 INCREMENT BY n
     35 START WITH n
     36 [MAXVALUE n][MINVALUE n]
     37 [CYCLE|NOCYCLE]
     38 [CACHE n|NOCACHE];
     39 
     40 
     41 
     42 --删除序列
     43 
     44 
     45 --------------------------------------------------------------------------------
     46 
     47 DROP SEQUENCE <sequence_name>
     48 
     49 
     50 
     51 
     52 --使用序列
     53 
     54 
     55 --------------------------------------------------------------------------------
     56 
     57 1.CURRVAL
     58 返回序列的当前值.
     59 注意在刚建立序列后,序列的CURRVAL值为NULL,所以不能直接使用。
     60 可以先初始化序列:
     61 方法:select <sequence_name>.nextval from dual;
     62 示例:select se_1.nextval from dual;
     63 之后就可以使用CURRVAL属性了
     64 
     65 2.NEXTVAL
     66 返回序列下一个值;
     67 示例:
     68 begin
     69 for i in 1..5
     70 loop
     71 insert into emp(empno) values(se_1.nextval);
     72 end loop;
     73 end;
     74 
     75 
     76 --查看序列的当前值
     77 select <sequence_name>.currval from dual;
     78 
     79 --示例:select se_1.currval from dual;
     80 
     81 
     82 

    用户 

      1 --创建用户 
      2 --------------------------------------------------------------------------------
      3 
      4 CREATE USER <user_name> [profile "DEFAULT"]
      5 identified by "<password>" [default tablespace "USERS"]
      6 
      7 
      8 --删除用户
      9 
     10 
     11 --------------------------------------------------------------------------------
     12 
     13 DROP USER <user_name> CASCADE
     14 
     15 

    角色

      1 --创建角色 
      2 --------------------------------------------------------------------------------
      3 
      4 CREATE ROLE <role_name>
      5 identified by "<password>"
      6 
      7 
      8 --删除角色
      9 --------------------------------------------------------------------------------
     10 
     11 DROP ROLE <role_name>
     12 
     13 

    六:PL/SQL

    PL/SQL 结构

      1 ---PL/SQL 结构
      2 
      3 --------------------------------------------------------------------------------
      4 DECLARE        --声明部分
      5         声明语句
      6 BEGIN         --执行部分
      7         执行语句
      8 
      9 EXCEPTION         --异常处理部分
     10         执行语句
     11 
     12 END;
     13 
     14 变量声明
     15 <变量名> 类型[:=初始值];
     16 特殊类型 字段%type
     17 示例: name emp.ename%type --表示name的类型和emp.ename的类型相同
     18 表 %rowtype
     19 示例: test emp%rowtype --表示test的类型为emp表的行类型;也有 .empno; .ename; .sal ;等属性 
     20 
     21 常量声明
     22 <变量名> CONSTANT 类型:=初始值;
     23 示例: pi constant number(5,3):=3.14;
     24 
     25 全局变量声明
     26 VARIABLE <变量名> 类型;
     27 示例: VARIABLE num number;
     28 
     29 使用全局变量
     30 :<变量名>
     31 示例:
     32 :num:=100;
     33 i=:num;
     34 
     35 查看全局变量的值
     36 print <变量名>
     37 示例: print num;
     38 
     39 赋值运算符: :=
     40 示例: num := 100;
     41 
     42 使用SELECT <列名> INTO <变量名> FROM <表名> WHERE <条件>
     43 注意select into 语句的返回结果只能为一行;
     44 示例:test emp%rowtype;
     45 select * into test from emp where empno=7788;
     46 
     47 用户交互输入
     48 <变量>:='&变量'
     49 示例:
     50 num:=&num;
     51 
     52 注意oracle的用户交互输入是先接受用户输入的所有值后在执行语句;
     53 所以不能使用循环进行用户交互输入;
     54 
     55 
     56 条件控制语句
     57 IF <条件1> THEN
     58     语句
     59 [ELSIF <条件2> THEN
     60    语句
     61           .
     62           .
     63           .
     64 ELSIF <条件n> THEN
     65    语句]
     66 [ELSE
     67     语句]
     68 END IF;
     69 
     70 
     71 
     72 循环控制语句
     73 1.LOOP
     74 LOOP
     75    语句;
     76    EXIT WHEN <条件>
     77 END LOOP;
     78 
     79 2.WHILE LOOP
     80 WHILE <条件>
     81 LOOP
     82    语句;
     83 END LOOP;
     84 
     85 3.FOR
     86 FOR <循环变量> IN 下限..上限
     87 LOOP
     88    语句;
     89 END LOOP;
     90 
     91 
     92 NULL 语句
     93 null;
     94 表示没有操作;
     95 
     96 
     97 注释使用
     98 单行注释: --
     99 多行注释:/* .......
    100       ...............*/
    101 
    102 
    103 异常处理
    104 
    105 EXCEPTION
    106    WHEN <异常类型> THEN
    107             语句;
    108    WHEN OTHERS THEN
    109             语句;
    110 END;
    111 关于异常类型请查看附录.
    112 
    113 
    114 
    115 
    116 

     

    游标

      1 显示游标
      2 --------------------------------------------------------------------------------
      3 
      4 定义:CURSOR <游标名> IS <SELECT 语句> [FOR UPDATE | FOR UPDATE OF 字段];
      5 
      6 [FOR UPDATE | FOR UPDATE OF 字段] --给游标加锁,既是在程序中有"UPDATE","INSERT","DELETE"语句对数据库操作时。
      7 游标自动给指定的表或者字段加锁,防止同时有别的程序对指定的表或字段进行"UPDATE","INSERT","DELETE"操作.
      8 在使用"DELETE","UPDATE"后还可以在程序中使用CURRENT OF <游标名> 子句引用当前行.
      9 
     10 操作:OPEN <游标名> --打开游标
     11     FETCH <游标名> INTO 变量1,变量2,变量3,....变量n,;
     12                 或者
     13     FETCH <游标名> INTO 行对象;         --取出游标当前位置的值 
     14     CLOSE <游标名> --关闭游标
     15 属性: %NOTFOUND --如果FETCH语句失败,则该属性为"TRUE",否则为"FALSE";
     16     %FOUND --如果FETCH语句成果,则该属性为"TRUE",否则为"FALSE";
     17     %ROWCOUNT --返回游标当前行的行数;
     18     %ISOPEN --如果游标是开的则返回"TRUE",否则为"FALSE";
     19 
     20 使用:
     21 LOOP循环
     22    示例:
     23 DECLARE
     24      cursor c_1 is select * from emp;     --定义游标
     25      r c_1%rowtype;      --定义一个行对象,用于获得游标的值
     26 BEGIN
     27      if c_1%isopen then
     28           CLOSE c_1;
     29      end if;
     30      OPEN c_1;          --判断游标是否打开.如果开了将其关闭,然后在打开
     31      dbms_output.put_line('行号 姓名 薪水');
     32      LOOP
     33      FETCH c_1 INTO r;     --取值
     34      EXIT WHEN c_1%NOTFOUND;     --如果游标没有取到值,退出循环.
     35      dbms_output.put_line(c_1%rowcount||''||r.ename||''||r.sal);    --输出结果,需要 set serverout on 才能显示.
     36      END LOOP;
     37 END;
     38 
     39 
     40 FOR循环
     41    示例:
     42 DECLARE
     43      cursor c_1 is select ename,sal from emp;     --定义游标     
     44 BEGIN
     45      dbms_output.put_line('行号 姓名 薪水');
     46      FOR i IN c_1         --for循环中的循环变量i为c_1%rowtype类型;
     47      LOOP
     48      dbms_output.put_line(c_1%rowcount||''||i.ename||''||i.sal);    --输出结果,需要 set serverout on 才能显示.
     49      END LOOP;
     50 END;
     51 
     52 for循环使用游标是在循环开始前自动打开游标,并且自动取值到循环结束后,自动关闭游标.
     53 
     54 游标加锁示例:
     55 DECLARE
     56      cursor c_1 is select ename,sal from emp for update of sal;     --定义游标对emp表的sal字段加锁.     
     57 BEGIN
     58      dbms_output.put_line('行号 姓名 薪水');
     59      FOR i IN c_1         --for循环中的循环变量i为c_1%rowtype类型;
     60      LOOP
     61      UPDATE EMP set sal=sal+100 WHERE CURRENT OF c_1; --表示对当前行的sal进行跟新.
     62      END LOOP;
     63      FOR i IN c_1
     64      LOOP
     65      dbms_output.put_line(c_1%rowcount||''||i.ename||''||i.sal);    --输出结果,需要 set serverout on 才能显示.
     66      END LOOP;
     67 END;
     68 
     69 
     70 
     71 代参数的游标
     72 定义:CURSOR <游标名>(参数列表) IS <SELECT 语句> [FOR UPDATE | FOR UPDATE OF 字段];
     73 示例:
     74 DECLARE
     75      cursor c_1(name emp.ename%type) is select ename,sal from emp where ename=name;     --定义游标     
     76 BEGIN
     77      dbms_output.put_line('行号 姓名 薪水');
     78      FOR i IN c_1('&name')         --for循环中的循环变量i为c_1%rowtype类型;
     79      LOOP
     80      dbms_output.put_line(c_1%rowcount||''||i.ename||''||i.sal);    --输出结果,需要 set serverout on 才能显示.
     81      END LOOP;
     82 END;
     83 
     84 
     85 隐试游标
     86 --------------------------------------------------------------------------------
     87 隐试游标游标是系统自动生成的。每执行一个DML语句就会产生一个隐试游标,起名字为SQL;
     88 
     89 隐试游标不能进行"OPEN" ,"CLOSE","FETCH"这些操作;
     90 
     91 属性:
     92     %NOTFOUND --如果DML语句没有影响到任何一行时,则该属性为"TRUE",否则为"FALSE";
     93     %FOUND --如果DML语句影响到一行或一行以上时,则该属性为"TRUE",否则为"FALSE";
     94     %ROWCOUNT --返回游标当最后一行的行数;
     95 
     96 个人认为隐试游标的作用是判断一个DML语句;
     97 示例:
     98 BEGIN
     99     DELETE FROM EMP WHERE empno=&a;
    100     IF SQL%NOTFOUND THEN
    101         dbms_output.put_line('empno不存在');
    102     END IF;
    103    IF SQL%ROWCOUNT>0 THEN
    104         dbms_output.put_line('删除成功');
    105     END IF;
    106 END;

    PL/SQL表

      1 PL/SQL表
      2 --------------------------------------------------------------------------------
      3 pl/sql表只有两列,其中第一列为序号列为INTEGER类型,第二列为用户自定义列.
      4 
      5 定义:TYPE <类型名> IS TABLE OF <列的类型> [NOT NULL] INDEX BY BINARY_INTEGER;
      6 <列的类型>可以为Oracle的数据类行以及用户自定义类型;
      7 
      8 属性方法:
      9 .count --返回pl/sql表的总行数
     10 .delect --删除pl/sql表的所有内容
     11 .delect(行数) --删除pl/sql表的指定的行
     12 .delct(开始行,结束行) --删除pl/sql表的多行
     13 .first --返回表的第一个INDEX;
     14 .next(行数) --这个行数的下一条的INDEX;
     15 .last --返回表的最后一个INDEX;
     16 
     17 使用
     18 示例:
     19 DECLARE
     20      TYPE mytable IS TABLE OF VARCHAR2(20) index by binary_integer; --定义一个名为mytable的PL/sql表类型;
     21      cursor c_1 is select ename from emp;
     22      n number:=1;
     23      tab_1 mytable; --为mytable类型实例化一个tab_1对象;
     24 BEGIN
     25      for i in c_1
     26      loop
     27           tab_1(n):=i.ename; --将得到的值输入pl/sql表
     28           n:=n+1;
     29     end loop;
     30      n:=1;
     31      tab_1.delete(&要删除的行数); --删除pl/sql表的指定行
     32      for i in tab_1.first..tab_1.count
     33      loop
     34           dbms_output.put_line(n||''||tab_1(n)); --打印pl/sql表的内容
     35           n:=tab_1.next(n);
     36      end loop;
     37 EXCEPTION
     38      WHEN NO_DATA_FOUND THEN                    --由于删除了一行,会发生异常,下面语句可以接着删除的行后显示
     39           for i in n..tab_1.count+1
     40      loop
     41           dbms_output.put_line(n||''||tab_1(n));
     42           n:=tab_1.next(n);
     43      end loop;
     44 END;

    PL/SQL记录

      1 PL/SQL记录
      2 --------------------------------------------------------------------------------
      3 pl/sql表只有一行,但是有多列。
      4 
      5 定义:TYPE <类型名> IS RECORD <列名1 类型1,列名2 类型2,...列名n 类型n,> [NOT NULL]
      6 <列的类型>可以为Oracle的数据类行以及用户自定义类型;可以是记录类型的嵌套
      7 
      8 使用
      9 示例:
     10 DECLARE
     11      TYPE myrecord IS RECORD(id emp.empno%type,
     12      name emp.ename%type,sal emp.sal%type);     --定义一个名为myrecoed的PL/sql记录类型;
     13      rec_1 myrecord; --为myrecord类型实例化一个rec_1对象;
     14 BEGIN
     15           select empno,ename,sal into rec_1.id,rec_1.name,rec_1.sal
     16           from emp where empno=7788;        --将得到的值输入pl/sql记录
     17           dbms_output.put_line(rec_1.id||''||rec_1.name||''||rec_1.sal); --打印pl/sql记录的内容
     18 END;
     19 
     20 
     21 
     22 结合使用PL/SQL表和PL/SQL记录
     23 示例:
     24 DECLARE
     25      CURSOR c_1 is select empno,ename,job,sal from emp;
     26      TYPE myrecord IS RECORD(empno emp.empno%type,ename emp.ename%type,
     27 job emp.job%type,sal emp.sal%type);     --定义一个名为myrecoed的PL/sql记录类型;
     28      TYPE mytable IS TABLE OF myrecord index by binary_integer;
     29                                                                    --定义一个名为mytable的PL/sql表类型;字段类型为PL/sql记录类型;
     30 
     31      n number:=1;
     32      tab_1 mytable; --为mytable类型实例化一个tab_1对象;
     33 BEGIN
     34           --赋值
     35           for i in c_1
     36           loop
     37                tab_1(n).empno:=i.empno;
     38                tab_1(n).ename:=i.ename;
     39                tab_1(n).job:=i.job;
     40                tab_1(n).sal:=i.sal;
     41                n:=n+1;
     42           end loop;
     43           n:=1;
     44           --输出
     45           for i in n..tab_1.count
     46           loop
     47                 dbms_output.put_line(i||''||tab_1(i).empno
     48                 ||''||tab_1(i).ename||''||tab_1(i).job||''||tab_1(i).sal);
     49           end loop;
     50 END;
     51 

    REF游标

      1 强型REF游标
      2 --------------------------------------------------------------------------------
      3 
      4 定义:TYPE <游标名> IS REF CURSOR RETURN<返回类型>;
      5 
      6 
      7 操作:OPEN <游标名> For <select 语句> --打开游标
      8     FETCH <游标名> INTO 变量1,变量2,变量3,....变量n,;
      9                 或者
     10     FETCH <游标名> INTO 行对象;         --取出游标当前位置的值 
     11     CLOSE <游标名> --关闭游标
     12 属性: %NOTFOUND --如果FETCH语句失败,则该属性为"TRUE",否则为"FALSE";
     13     %FOUND --如果FETCH语句成果,则该属性为"TRUE",否则为"FALSE";
     14     %ROWCOUNT --返回游标当前行的行数;
     15     %ISOPEN --如果游标是开的则返回"TRUE",否则为"FALSE";
     16 
     17 使用:
     18    示例:
     19 DECLARE
     20      type c_type is ref cursor return emp%rowtype;     --定义游标
     21      c_1 c_type;      --实例化这个游标类型
     22      r emp%rowtype;
     23 BEGIN
     24      dbms_output.put_line('行号 姓名 薪水');
     25      open c_1 for select * from emp;
     26      loop
     27      fetch c_1 into r;
     28      exit when c_1%notfound;
     29      dbms_output.put_line(c_1%rowcount||''||r.ename||''||r.sal);    --输出结果,需要 set serverout on 才能显示.
     30      END LOOP;
     31 close c_1;
     32 END;
     33 
     34 
     35 弱型REF游标
     36 --------------------------------------------------------------------------------
     37 定义:TYPE <游标名> IS REF CURSOR;
     38 
     39 
     40 操作:OPEN <游标名> For <select 语句> --打开游标
     41     FETCH <游标名> INTO 变量1,变量2,变量3,....变量n,;
     42                 或者
     43     FETCH <游标名> INTO 行对象;         --取出游标当前位置的值 
     44     CLOSE <游标名> --关闭游标
     45 属性: %NOTFOUND --如果FETCH语句失败,则该属性为"TRUE",否则为"FALSE";
     46     %FOUND --如果FETCH语句成果,则该属性为"TRUE",否则为"FALSE";
     47     %ROWCOUNT --返回游标当前行的行数;
     48     %ISOPEN --如果游标是开的则返回"TRUE",否则为"FALSE";
     49 示例:
     50 set autoprint on;
     51 var c_1 refcursor;
     52 DECLARE
     53    n number;
     54 BEGIN
     55    n:=&请输入;
     56    if n=1 then
     57          open :c_1 for select * from emp;
     58    else
     59          open :c_1 for select * from dept;
     60    end if;
     61 END;
      1 过程
      2 --------------------------------------------------------------------------------
      3 
      4 定义:CREATE [OR REPLACE] PROCEDURE <过程名>[(参数列表)] IS
      5          [局部变量声明]
      6          BEGIN
      7             可执行语句
      8           EXCEPTION
      9             异常处理语句
     10           END [<过程名>];
     11 
     12 变量的类型:in 为默认类型,表示输入; out 表示只输出;in out 表示即输入又输出;
     13 
     14 
     15 操作以有的过程:在PL/SQL块中直接使用过程名;在程序外使用execute <过程名>[(参数列表)]
     16 
     17 使用:
     18    示例:
     19 创建过程:
     20 create or replace procedure p_1(n in out number) is
     21     r emp%rowtype;
     22 BEGIN
     23      dbms_output.put_line('姓名 薪水');
     24      select * into r from emp where empno=n;
     25      dbms_output.put_line(r.ename||''||r.sal);    --输出结果,需要 set serverout on 才能显示.
     26     n:=r.sal;
     27 END;
     28 使用过程:
     29 declare
     30     n number;
     31 begin
     32     n:=&请输入员工号;
     33     p_1(n);
     34     dbms_output.put_line('n的值为 '||n);
     35 end;
     36 
     37 
     38 删除过程:
     39     DROP PROCEDURE <过程名>;

    函数

     

      1 函数
      2 --------------------------------------------------------------------------------
      3 
      4 定义:CREATE [OR REPLACE] FUNCTION <过程名>[(参数列表)] RETURN 数据类型 IS
      5          [局部变量声明]
      6          BEGIN
      7             可执行语句
      8           EXCEPTION
      9             异常处理语句
     10           END [<过程名>];
     11 
     12 变量的类型:in 为默认类型,表示输入; out 表示只输出;in out 表示即输入又输出;
     13 
     14 
     15 使用:
     16    示例:
     17 创建函数:
     18 create or replace function f_1(n number) return number is
     19     r emp%rowtype;
     20 BEGIN
     21      dbms_output.put_line('姓名 薪水');
     22      select * into r from emp where empno=n;
     23      dbms_output.put_line(r.ename||''||r.sal);    --输出结果,需要 set serverout on 才能显示.
     24      return r.sal;
     25 END;
     26 使用函数:
     27 declare
     28     n number;
     29      m number;
     30 begin
     31     n:=&请输入员工号;
     32     m:=f_1(n);
     33     dbms_output.put_line('m的值为 '||m);
     34 end;
     35 
     36 
     37 删除函数:
     38     DROP FUNCTION <函数名>;

     

    数据包

      1 数据包
      2 --------------------------------------------------------------------------------
      3 
      4 定义:
      5    定义包的规范
      6       CREATE [OR REPLACE] PACKAGE <数据包名> AS
      7                --公共类型和对象声明
      8                --子程序说明
      9       END;
     10     定义包的主体
     11       CREATE [OR REPLACE] PACKAGE BODY <数据包名> AS
     12                --公共类型和对象声明
     13                --子程序主体
     14       BEGIN
     15             -初始化语句
     16       END;
     17 
     18 
     19 使用:
     20    示例:
     21 创建数据包规范:
     22 create or replace package pack_1 as
     23       n number;
     24       procedure p_1;
     25       FUNCTION f_1 RETURN number;
     26 end;
     27 
     28 创建数据包主体:
     29 create or replace package body pack_1 as
     30   procedure p_1 is
     31        r emp%rowtype;
     32   begin
     33        select * into r from emp where empno=7788;
     34        dbms_output.put_line(r.empno||''||r.ename||''||r.sal);
     35    end;
     36 
     37    FUNCTION f_1 RETURN number is
     38        r emp%rowtype;
     39    begin
     40         select * into r from emp where empno=7788;
     41        return r.sal;
     42    end;
     43 end;
     44 
     45 使用包:
     46 declare
     47       n number;
     48 begin
     49       n:=&请输入员工号;
     50       pack_1.n:=n;
     51       pack_1.p_1;
     52       n:=pack_1.f_1;
     53       dbms_output.put_line('薪水为 '||n);
     54 end;
     55 
     56 在包中使用REF游标
     57 示例:
     58 创建数据包规范:
     59 create or replace package pack_2 as
     60      TYPE c_type is REF CURSOR; --建立一个ref游标类型
     61      PROCEDURE p_1(c1 in out c_type); --过程的参数为ref游标类型;
     62 end;
     63 
     64 创建数据包主体:
     65 create or replace package body pack_2 as
     66   PROCEDURE p_1(c1 in out c_type) is
     67   begin
     68        open c1 for select * from emp;
     69    end;
     70 end;
     71 
     72 使用包:
     73 var c_1 refcursor;
     74 set autoprint on;
     75 execute pack_2.p_1(:c_1);
     76 
     77 
     78 
     79 删除包:
     80     DROP PACKAGE <包名>;

     

    触发器

      1 触发器
      2 
      3 --------------------------------------------------------------------------------
      4 创建触发器:
      5     CREATE [OR REPLACE] TRIGGER <触发器名>
      6     BEFORE|AFTER
      7     INSERT|DELETE|UPDATE [OF <列名>] ON <表名>
      8     [FOR EACH ROW]
      9      WHEN (<条件>)
     10      <pl/sql块>
     11 
     12      关键字"BEFORE"在操作完成前触发;"AFTER"则是在操作完成后触发;
     13      关键字"FOR EACH ROW"指定触发器每行触发一次.
     14       关键字"OF <列名>" 不写表示对整个表的所有列.
     15      WHEN (<条件>)表达式的值必须为"TRUE".
     16 
     17 特殊变量:
     18      :new --为一个引用最新的列值;
     19      :old --为一个引用以前的列值; 
     20 这些变量只有在使用了关键字 "FOR EACH ROW"时才存在.且update语句两个都有,而insert只有:new ,delect 只有:old;
     21 
     22 使用RAISE_APPLICATION_ERROR
     23      语法:RAISE_APPLICATION_ERROR(错误号(-20000到-20999),消息[,{true|false}]);
     24      抛出用户自定义错误.
     25      如果参数为'TRUE',则错误放在先前的堆栈上.
     26 
     27 INSTEAD OF 触发器
     28      INSTEAD OF 触发器主要针对视图(VIEW)将触发的dml语句替换成为触发器中的执行语句,而不执行dml语句.
     29 
     30 
     31 禁用某个触发器
     32      ALTER TRIGGER <触发器名> DISABLE
     33 重新启用触发器
     34      ALTER TRIGGER <触发器名> ENABLE
     35 禁用所有触发器
     36      ALTER TRIGGER <触发器名> DISABLE ALL TRIGGERS
     37 启用所有触发器
     38      ALTER TRIGGER <触发器名> ENABLE ALL TRIGGERS
     39 删除触发器
     40      DROP TRIGGER <触发器名>
     41 
     42 

    自定义对象

      1 自定义对象
      2 
      3 --------------------------------------------------------------------------------
      4 创建对象:
      5     CREATE [OR REPLACE] TYPE <对象名> AS OBJECT(
      6     属性1 类型
      7     属性2 类型
      8           .
      9            .
     10     方法1的规范(MEMBER PROCEDURE <过程名>
     11     方法2的规范 (MEMBER FUNCTION <函数名> RETURN 类型)
     12           .
     13            .
     14     PRAGMA RESTRIC_REFERENCES(<方法名>,WNDS/RNDS/WNPS/RNPS);
     15       关键字"PRAGMA RESTRIC_REFERENCES"通知ORACLE函数按以下模式之一操作;
     16       WNDS-不能写入数据库状态;
     17       RNDS-不能读出数据库状态;
     18       WNPS-不能写入包状态;
     19       RNDS-不能读出包状态;
     20 
     21 
     22     创建对象主体:
     23       CREATE [OR REPLACE] TYPE body <对象名> AS
     24      方法1的规范(MEMBER PROCEDURE <过程名> is   <PL/SQL块>
     25     方法2的规范 (MEMBER FUNCTION <函数名> RETURN 类型 is <PL/SQL块>
     26      END;
     27 
     28 使用MAP方法和ORDER方法
     29      用于对自定义类型排序。每个类型只有一个MAP或ORDER方法。
     30      格式:MAP MEMBER FUNCTION <函数名> RETURN 类型
     31             ORDER MEMBER FUNCTION <函数名> RETURN NUMBER
     32 
     33 创建对象表
     34       CREATE TABLE <表名> OF <对象类型>
     35 
     36 示例:
     37      1. 创建name 类型
     38      create or replace type name_type as object(
     39           f_name varchar2(20),
     40           l_name varchar2(20),
     41           map member function name_map return varchar2);
     42 
     43      create or replace type body name_type as
     44           map member function name_map return varchar2 is --对f_name和l_name排序
     45           begin
     46                return f_name||l_name;
     47           end;
     48           end;
     49       2 创建address 类型
     50      create or replace type address_type as object
     51        ( city varchar2(20),
     52            street varchar2(20),
     53            zip number,
     54       order member function address_order(other address_type) return number);
     55 
     56       create or replace type body address_type as
     57       order member function address_order(other address_type) return number is --对zip排序
     58       begin
     59            return self.zip-other.zip;
     60       end;
     61       end;
     62 
     63 3 创建stu对象
     64        create or replace type stu_type as object (
     65        stu_id number(5),
     66        stu_name name_type,
     67        stu_addr address_type,
     68        age number(3),
     69        birth date,
     70        map member function stu_map return number,
     71       member procedure update_age);
     72 
     73       create or replace type body stu_type as
     74        map member function stu_map return number is --对stu_id排序
     75        begin
     76              return stu_id;
     77        end;
     78       member procedure update_age is --求年龄用现在时间-birth
     79        begin
     80              update student set age=to_char(sysdate,'yyyy')-to_char(birth,'yyyy') where stu_id=self.stu_id;
     81        end;
     82        end;
     83 4. 创建对象表
     84       create table student of stu_type(primary key(stu_id));
     85 5.向对象表插值
     86       insert into student values(1,name_type('',''),address_type('武汉','成都路',43000), null,sysdate-365*20);
     87 6.使用对象的方法
     88      delcare
     89           aa stu_type;
     90      begin
     91           select value(s) into aa from student s where stu_id=1; --value()将对象表的每一行转成行对象括号中必须为表的别名
     92           aa.update_age();
     93      end;
     94 7.select stu_id,s.stu_name.f_name,s.stu_name.l_name from student s; --查看类型的值
     95 8.select ref(s) from student s ; --ref()求出行对象的OID,括号中必须为表的别名;deref()将oid变成行队像; 
     96 

    其他

      1 其他
      2 
      3 --------------------------------------------------------------------------------
      4 1.在PL/SQL中使用DDL
      5      将sql语句赋给一个varchar2变量,在用execute immediate 这个varchar2变量即可;
      6      示例:
      7      declare
      8           str varchar2(200);
      9      begin
     10           str:='create table test(id number,name varchar2(20))'; --创建表
     11           execute immediate str;
     12           str:='insert into test values(3,''c'')'; --向表里插数据
     13           execute immediate str;
     14      end;
     15      但是要队这个表插入数据也必须使用execute immediate 字符变量
     16 
     17 2.判断表是否存在;
     18      示例:
     19      declare
     20           n tab.tname%type;
     21      begin
     22           select tname into n from tab where tname='&请输入表名';
     23           dbms_output.put_line('此表以存在');
     24      exception
     25           when no_data_found then
     26           dbms_output.put_line('还没有此表');
     27      end;
     28 
     29 
     30 2.查看以有的过程;
     31      示例:
     32      select object_name,object_type,status from user_objects where object_type='PROCEDURE';
     33 

    七: 附录

    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
    除数为零
     
       

     

       
  • 相关阅读:
    【干货分享】嵌入式学习路线公开!(书籍推荐+视频推荐+练手项目)
    test
    pytest学习小结
    pytest运行报错 TypeError: attrib() got an unexpected keyword argument 'convert'
    pytest插件下载网址
    python修改文件内容的3种方法详解
    PermissionError: [Errno 13] Permission denied 如何解决
    Pycharm退出pytest模式(run pytest in模式)
    直流电机驱动电路设计-----学习笔记
    2019年全国大学生电子设计竞赛赛题分享与浅析
  • 原文地址:https://www.cnblogs.com/ios9/p/Oracle_BaseInfo.html
Copyright © 2011-2022 走看看