zoukankan      html  css  js  c++  java
  • SQL

    SQL:

    数据类型

    数值类:

    字符串:

    Int 2个字节

    Shall 四个字节

    数据定义语言( DDL),包括 CREATE(创建)命令、 ALTER(修改)命令、 DROP(删

    除)命令等。

    数据操纵语言( DML),包括 INSERT(插入)命令、 UPDATE(更新)命令、 DELETE

    (删除)命令、 SELECT … FOR UPDATE(查询)等。

    数据查询语言( DQL),包括基本查询语句、 Order By 子句、 Group By 子句等。

    事务控制语言( TCL),包括 COMMIT(提交)命令、 SAVEPOINT(保存点)命令、

    ROLLBACK(回滚)命令。

    数据控制语言( DCL), GRANT(授权)命令、 REVOKE(撤销)命令。

    Oracle 数据库的核心是表,表中的列使用到的常见数据类型如下:

    类型 含义

    CHAR(length) 存储固定长度的字符串。参数 length 指定了长度,如果存储的字符串长

    度小于 length,用空格填充。默认长度是 1,最长不超过 2000 字节。

    VARCHAR2(length) 存储可变长度的字符串。 length 指定了该字符串的最大长度。默认长度

    是 1,最长不超过 4000 字符。

    NUMBER(p, s) 既可以存储浮点数,也可以存储整数, p 表示数字的最大位数(如果是小数包括整数部分和小数部分和小数点, p 默认是 38 为), s 是指小数位数。

    DATE 存储日期和时间, 存储纪元、 4 位年、月、日、时、分、秒,存储时间从公元前 4712 年 1 月 1 日到公元后 4712 年 12 月 31 日。

    TIMESTAMP 不但存储日期的年月日,时分秒,以及秒后 6 位,同时包含时区。

    CLOB 存储大的文本,比如存储非结构化的 XML 文档

    BLOB 存储二进制对象,如图形、视频、声音等。

    对应 NUMBER 类型的示例:

    格式 输入的数字 实际的存储

    NUMBER           1234.567   1234.567

    NUMBER( 6, 2) 123.4567   123.46

    NUMBER( 4, 2) 12345.67   输入的数字超过了所指定的精度,数据库不能存储

    对于日期类型,可以使用 sysdate 内置函数可以获取当前的系统日期和时间,返回 DATE

    类型,用 systimestamp 函数可以返回当前日期、时间和时区。

    SELECT SYSDATE,SYSTIMESTAMP FROM DUAL

    dual 表在系统中只有一行一列,某些时候为了输出常量而使用dual,实际上dual并不提供数据,仅仅为了满足from的存在

    复制表格和数据

    CREATE TABLE maleStu AS

    SELECT * FROM student where ssex='男';

    仅仅复制表格,但不填入数据

    CREATE TABLE maleStu AS SELECT * FROM student where 1=2;

    一次插入多条数据

    INSERT INTO maleStu SELECT * FROM student;

    select sname into myname from student where sid=10002

    select sid,to_char(birthday,'ddmmyy') from stu

    指定日期和时间,并转换为DATE格式

    TO_DATE('1909 08 09 06:30:10',' YYYY MM DD HH24:MI:SS')

    alter   session   set   nls_date_format='yyyy-mm-dd';

    在 Oracle 中,日期是国际化的,不同的区域安装的数据库,默认的日期格式不同,

    因此为了程序便于移植,日期的输入要使用 TO_DATE 函数对日期格式化后输入,采

    用格式化字符串对日期进行格式化时,格式化字符串中字符不区分大小写,常见的

    格式化字符如下:

    1. yyyy 表示四位年份

    2. mm 表示两位月份,比如 3 月表示为 03

    3. dd 表示两位日期

    4. hh24 表示小时从 0-23, hh12 也表示小时从 0-11。

    5. mi 表示分钟

    6. ss 表示秒

    select sysdate from dual

    SELECT DATEPART(HH,GETDATE()) from dual

    SELECT DATEADD (hh,12,getdate()) from dual

    Oracle 中的算术运算符,没有 C#中的算术运算符丰富,只有+、 -、 *、 /四个,其中除号

    (/)的结果是浮点数。求余运算只能借助函数: MOD(x,y):返回 x 除以 y 的余数。

    select mod(10,3) from dual

    在 Oracle 中,字符串的连接用双竖线( ||)表示

    select (sname||'是'||ssex||'同学') as 信息描述 from student where ssex='男'

    sql%rowcount,sql%found、sql%notfound、sql%isopen

    sql%rowcount用于记录修改的条数,就如你在sqlplus下执行delete from之后提示已删除xx行一样,这个参数必须要在一个修改语句和commit之间放置,否则你就得不到正确的修改行数。

    在执行DML(insert,update,delete)语句时,可以用到以下三个隐式游标(游标是维护查询结果的内存中的一个区域,运行DML时打开,完成时关闭,用sql%isopen检查是否打开):

    if sql%rowcount = 0 then

        dbms_output.put_line('部门删除失败...');

    end if;

    或者

    if sql%notfound then

        dbms_output.put_line('部门删除失败...');

    end if;

    VNL函数

    NVL(eExpression1, eExpression2)

    如果 eExpression1 的计算结果为 null 值,则 NVL( ) 返回 eExpression2。如果 eExpression1 的计算结果不是 null 值,则返回 eExpression1。eExpression1 和 eExpression2 可以是任意一种数据类型。如果 eExpression1 与 eExpression2 的结果皆为 null 值,则 NVL( ) 返回 .NULL.。

    select case

               when snativeplace='南京' then '江苏'

               when snativeplace='无锡' then '江苏'

               when snativeplace='合肥' then '安徽'

               when snativeplace='滁州' then '安徽'

               else '其他地区'

             end 省份,count(*) 人数

    from student

    group by case

               when snativeplace='南京' then '江苏'

               when snativeplace='无锡' then '江苏'

               when snativeplace='合肥' then '安徽'

               when snativeplace='滁州' then '安徽'

               else '其他地区'

             end

    集合运算就是将两个或者多个结果集组合成为一个结果集。集合运算包括:

      INTERSECT(交集),返回两个查询共有的记录。

      UNION ALL(并集),返回各个查询的所有记录,包括重复记录。

      UNION(并集),返回各个查询的所有记录,不包括重复记录。

      MINUS(补集),返回第一个查询检索出的记录减去第二个查询检索出的记录之后剩

    余的记录。

    当使用集合操作的时候,要注意:查询所返回的列数以及列的类型必须匹配,列名可以

    不同。

    例如:查询哪个学生没有选课

    select sid from student

    minus

    select distinct sid from mark

    insert into newStu

    select * from student where sclass='1班'

    union

    select * from student where sclass='2班'

    内联,外联与并列查询的区别

    select sname,avg(cmark)

    from student s,mark sc

    where s.sid=sc.sid

    group by s.sid,sname

    select sname,avg(cmark)

    from student s inner join mark sc on s.sid=sc.sid

    group by s.sid,sname

    select *

    from student s inner join mark sc on s.sid=sc.sid

    select *

    from student s left outer join mark sc on s.sid=sc.sid

    select *

    from student s right outer join mark sc on s.sid=sc.sid

    select *

    from student s full outer join mark sc on s.sid=sc.sid

    伪列:rowid、rownum

    表中的每一行在数据文件中都有一个物理地址, ROWID 伪列返回的就是该行的物理地

    址。使用 ROWID 可以快速的定位表中的某一行。 ROWID 值可以唯一的标识表中的一行

    是表格的固有属性,不会随着记录先后顺序的调整而改变

    select rowid,s.* from student s order by sage desc

    ROWNUM 为结果集中每一行标识一个行号,rownum是在from子句执行时动态生成

    select * from student where rownum<5

    找出学生表中第6到第10条记录

    delete用于逐行删除,速度较慢,但是可以回滚,属于DML语句

    如:

    savepoint beforedel;--创建复原点

    delete from student where sname='张三';

    select * from student where sname='张三';

    rollback to beforedel;--回滚数据

    select * from student where sname='张三'

    而truncate用于块删除,可以迅速删除表格所有数据,

    但是无法恢复数据,回滚无效,属于DDL

    truncate table student

    字符函数

    字符函数接受字符参数,这些参数可以是表中的列,也可以是一个字符串表达式。 下表

    列出了常用的字符函数。

    函数 说明

    ASCII(x) 返回字符 x 的 ASCII 码。

    CONCAT(x,y) 连接字符串 x 和 y。

    INSTR(x, str [,start] [,n])

    在 x 中查找 str,可以指定从 start 开始,也可以指定从

    第 n 次开始。

    select instr('hello world','world') from dual

    LENGTH(x) 返回 x 的长度。

    LOWER(x) x 转换为小写。

    UPPER(x) x 转换为大写。

    LTRIM(x[,trim_str]) 把 x 的左边截去 trim_str 字符串,缺省截去空格。

    RTRIM(x[,trim_str]) 把 x 的右边截去 trim_str 字符串,缺省截去空格。

    TRIM([trim_str FROM] x) 把 x 的两边截去 trim_str 字符串,缺省截去空格。

    REPLACE(x,old,new) 在 x 中查找 old,并替换为 new。

    SUBSTR(x,start[,length]) 返回 x 的字串,从 start 处开始,截取 length 个字符,

    缺省 length,默认到结尾。

    示例 示例结果

    SELECT ASCII('a') FROM DUAL 97

    SELECT CONCAT('Hello', ' world') FROM DUAL Hello world

    SELECT INSTR('Hello world', 'or') FROM DUAL 8

    SELECT LENGTH('Hello') FROM DUAL 5

    SELECT LOWER('hElLO') FROM DUAL; hello

    SELECT UPPER('hello') FROM DUAL HELLO

    SELECT LTRIM('===HELLO===', '=') FROM DUAL HELLO===

    SELECT '=='||LTRIM(' HELLO===') FROM DUAL ==HELLO===

    SELECT RTRIM('===HELLO===', '=') FROM DUAL ===HELLO

    SELECT '='||TRIM(' HELLO ')||'=' FROM DUAL =HELLO=

    SELECT TRIM('=' FROM '===HELLO===');--   FROM DUAL HELLO

    SELECT REPLACE('ABCDE','CD','AAA')   FROM DUAL ABAAAE

    SELECT SUBSTR('ABCDE',2) FROM DUAL BCDE

    SELECT SUBSTR('ABCDE',2,3) FROM DUAL BCD

    数学函数

    数学函数接受数字参数,参数可以来自表中的一列,也可以是一个数字表达式。

    函数 说明 示例

    ABS(x) x 绝对值 ABS(-3)=3

    ACOS(x) x 的反余弦 ACOS(1)=0

    COS(x) 余弦 COS(1)=1.57079633

    CEIL(x) 大于或等于 x 的最小值 CEIL(5.4)=6

    FLOOR(x) 小于或等于 x 的最大值 FLOOR(5.8)=5

    LOG(x,y) x 为底 y 的对数 LOG(2,4)=2

    MOD(x,y) x 除以 y 的余数 MOD(8,3)=2

    POWER(x,y) x 的 y 次幂 POWER(2,3)=8

    ROUND(x[,y]) x 在第 y 位四舍五入 ROUND(3.456,2)=3.46

    SQRT(x) x 的平方根 SQRT(4)=2

    TRUNC(x[,y]) x 在第 y 位截断 TRUNC(3.456,2)=3.45

    select dbms_random.value from dual

    说明:

    1. ROUND(X[,Y]),四舍五入。

    在缺省 y 时,默认 y=0;比如: ROUND(3.56)=4。

    y 是正整数,就是四舍五入到小数点后 y 位。 ROUND(5.654,2)=5.65。

    y 是负整数,四舍五入到小数点左边|y|位。 ROUND(351.654,-2)=400。

    2. TRUNC(x[,y]),直接截取,不四舍五入。

    在缺省 y 时,默认 y=0;比如: TRUNC (3.56)=3。

    y 是正整数,就是四舍五入到小数点后 y 位。 TRUNC (5.654,2)=5.65。

    y 是负整数,四舍五入到小数点左边|y|位。 TRUNC (351.654,-2)=300。

    日期函数

    日期函数对日期进行运算。常用的日期函数有:

    1. LAST_DAY(d),返回指定日期当月的最后一天。

    select SYSDATE,LAST_DAY(SYSDATE) from dual

    2.EXTRACT(fmt FROM d),提取日期中的特定部分。

    fmt 为: YEAR、 MONTH、 DAY、 HOUR、 MINUTE、 SECOND。其中 YEAR、 MONTH、 DAY

    可以为 DATE 类型匹配,也可以与 TIMESTAMP 类型匹配;但是 HOUR、 MINUTE、 SECOND 必

    须与 TIMESTAMP 类型匹配

    select SYSDATE 时间,

           EXTRACT(YEAR from SYSDATE) 年,

           EXTRACT(MONTH from SYSDATE) 月,

           EXTRACT(DAY from SYSDATE) 日,

           EXTRACT(HOUR from SYSTIMESTAMP) 时,

           EXTRACT(MINUTE from SYSTIMESTAMP) 分,

           EXTRACT(SECOND from SYSTIMESTAMP) 秒

    from dual

    select months_between(sysdate,to_date('1983-02-20','yyyy-mm-dd'))/12 from dual

    TO_CHAR(d|n[,fmt])

    把日期和数字转换为指定格式的字符串。 fmt 是格式化字符串

    针对数字的格式化,格式化字符有:

    参数 示例 说明

    9       999     指定位置处显示数字。

    .       9.9     指定位置返回小数点

    ,       99,99   指定位置返回一个逗号

    $       $999    数字开头返回一个美元符号

    EEEE    9.99EEEE 科学计数法表示

    L L999 数字前加一个本地货币符号

    PR 999PR 如果数字式负数则用尖括号进行表示

        select sysdate,add_months(sysdate,12) from dual;        --加1年

    select sysdate,add_months(sysdate,1) from dual;        --加1月

    select sysdate,to_char(sysdate+7,'yyyy-mm-dd HH24:MI:SS') from dual;   --加1星期

    select sysdate,to_char(sysdate+1,'yyyy-mm-dd HH24:MI:SS') from dual;   --加1天

    select sysdate,to_char(sysdate+1/24,'yyyy-mm-dd HH24:MI:SS') from dual;  --加1小时

    select sysdate,to_char(sysdate+1/24/60,'yyyy-mm-dd HH24:MI:SS') from dual;  --加1分钟

    select sysdate,to_char(sysdate+1/24/60/60,'yyyy-mm-dd HH24:MI:SS') from dual;  --加1秒

      减法

    select sysdate,add_months(sysdate,-12) from dual;        --减1年

    select sysdate,add_months(sysdate,-1) from dual;        --减1月

    select sysdate,to_char(sysdate-7,'yyyy-mm-dd HH24:MI:SS') from dual;   --减1星期

    select sysdate,to_char(sysdate-1,'yyyy-mm-dd HH24:MI:SS') from dual;   --减1天

    select sysdate,to_char(sysdate-1/24,'yyyy-mm-dd HH24:MI:SS') from dual;  --减1小时

    select sysdate,to_char(sysdate-1/24/60,'yyyy-mm-dd HH24:MI:SS') from dual;  --减1分钟

    select sysdate,to_char(sysdate-1/24/60/60,'yyyy-mm-dd HH24:MI:SS') from dual;  --减1秒

    Oracle关于时间/日期的操作

    1.日期时间间隔操作

      当前时间减去7分钟的时间

    select sysdate,sysdate - interval '7' MINUTE from dual

      当前时间减去7小时的时间

    select sysdate - interval '7' hour from dual

      当前时间减去7天的时间

    select sysdate - interval '7' day from dual

      当前时间减去7月的时间

    select sysdate,sysdate - interval '7' month from dual

      当前时间减去7年的时间

    select sysdate,sysdate - interval '7' year from dual

      时间间隔乘以一个数字

    select sysdate,sysdate - 8 *interval '2' hour from dual

    2.日期到字符操作

    select sysdate,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual

    select sysdate,to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual

    select sysdate,to_char(sysdate,'yyyy-ddd hh:mi:ss') from dual

    select sysdate,to_char(sysdate,'yyyy-mm iw-d hh:mi:ss') from dual

    TO_DATE(x [,fmt])

    把一个字符串以 fmt 格式转换为一个日期类型

    TO_NUMBER(x[,fmt])

    把一个字符串以 fmt 格式转换为一个数字。

    SELECT TO_NUMBER('-$12,345.67','$99,999.99') 金额 from dual

    序列

    序列(Sequence)是用来生成连续的整数数据的对象。序列常常用来作为主键中增长列,

    序列中的可以升序生成,也可以降序生成。创建序列的语法是:

    语法结构:创建序列

    CREATE SEQUENCE sequence_name

    [START WITH num]

    [INCREMENT BY increment]

    [MAXVALUE num|NOMAXVALUE]

    [MINVALUE num|NOMINVALUE]

    [CYCLE|NOCYCLE]

    [CACHE num|NOCACHE]

    语法解析:

    ① START WITH:从某一个整数开始,升序默认值是 1,降序默认值是-1。

    ② INCREMENT BY:增长数。如果是正数则升序生成,如果是负数则降序生成。升序默

    认值是 1,降序默认值是-1。

    ③ MAXVALUE:指最大值。

    ④ NOMAXVALUE:这是最大值的默认选项,升序的最大值是: 1027,降序默认值是-1。

    ⑤ MINVALUE:指最小值。

    ⑥ NOMINVALUE:这是默认值选项,升序默认值是 1,降序默认值是-1026。

    ⑦ CYCLE:表示如果升序达到最大值后,从最小值重新开始;如果是降序序列,达到最

    小值后,从最大值重新开始。

    ⑧ NOCYCLE:表示不重新开始,序列升序达到最大值、降序达到最小值后就报错。默

    认 NOCYCLE。

    ⑨ CACHE:使用 CACHE 选项时,该序列会根据序列规则预生成一组序列号。保留在内

    存中,当使用下一个序列号时,可以更快的响应。当内存中的序列号用完时,系统

    再生成一组新的序列号,并保存在缓存中,这样可以提高生成序列号的效率。 Oracle

    默认会生产 20 个序列号。

    ⑩ NOCACHE:不预先在内存中生成序列号

    创建一个从 1 开始,默认最大值,每次增长 1 的序列,要求 NOCYCLE,缓存中

    有 30 个预先分配好的序列号

    CREATE SEQUENCE MYSEQ

    MINVALUE 1

    START WITH 1

    NOMAXVALUE

    INCREMENT BY 1

    NOCYCLE

    CACHE 30

    create table stu(

      sid number primary key,

      sname varchar2(20)

    )

    insert into stu values(MYSEQ.NEXTVAL,'小明');

    insert into stu values(MYSEQ.NEXTVAL,'小张');

    序列创建之后,可以通过序列对象的 CURRVAL 和 NEXTVAL 两个“伪列”分别访问该序

    列的当前值和下一个值

    SELECT MYSEQ.NEXTVAL FROM DUAL;

    SELECT MYSEQ.CURRVAL FROM DUAL;

    使用 ALTER SEQUENCE 可以修改序列

    使用 DROP SEQUENCE 命令可以删除一个序列对象。

    视图

    视图( View)实际上是一张或者多张表上的预定义查询,这些表称为基表。从视图中

    查询信息与从表中查询信息的方法完全相同。 只需要简单的 SELECT…FROM 即可。

    视图具有以下优点:

    1. 可以限制用户只能通过视图检索数据。这样就可以对最终用户屏蔽建表时底层的基

    表。

    2. 可以将复杂的查询保存为视图。可以对最终用户屏蔽一定的复杂性。

    3. 限制某个视图只能访问基表中的部分列或者部分行的特定数据。这样可以实现一定

    的安全性。

    4. 从多张基表中按一定的业务逻辑抽出用户关心的部分,形成一张虚拟表。

    语法结构:创建视图

    CREATE [OR REPLACE] [{FORCE|NOFORCE}] VIEW view_name

    AS

    SELECT查询

    [WITH READ ONLY CONSTRAINT]

    语法解析:

    1. OR REPLACE:如果视图已经存在,则替换旧视图。

    2. FORCE:即使基表不存在,也可以创建该视图,但是该视图不能正常使用,当基表

    创建成功后,视图才能正常使用。

    3. NOFORCE:如果基表不存在,无法创建视图,该项是默认选项。

    4. WITH READ ONLY:默认可以通过视图对基表执行增删改操作,但是有很多在基表上

    的限制(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视

    图执行 insert 操作), WITH READ ONLY 说明视图是只读视图,不能通过该视图进行

    增删改操作。现实开发中,基本上不通过视图对表中的数据进行增删改操作。

    PL/SQL 块

    PL/SQL 是一种块结构的语言,一个 PL/SQL 程序包含了一个或者多个逻辑块,逻辑块中

    可以声明变量,变量在使用之前必须先声明。除了正常的执行程序外, PL/SQL 还提供了专

    门的异常处理部分进行异常处理。每个逻辑块分为三个部分,语法是:

    语法结构:PL/SQL 块的语法

    [DECLARE

    --declaration statements] ①

    BEGIN

    --executable statements ②

    [EXCEPTION

    --exception statements] ③

    END;

    语法解析:

    ① 声明部分:声明部分包含了变量和常量的定义。这个部分由关键字 DECLARE 开始,

    如果不声明变量或者常量,可以省略这部分。

    ② 执行部分:执行部分是 PL/SQL 块的指令部分,由关键字 BEGIN 开始,关键字 END

    结尾。所有的可执行 PL/SQL 语句都放在这一部分,该部分执行命令并操作变量。

    其他的 PL/SQL 块可以作为子块嵌套在该部分。 PL/SQL 块的执行部分是必选的。注

    意 END 关键字后面用分号结尾。

    ③ 异常处理部分:该部分是可选的,该部分用 EXCEPTION 关键字把可执行部分分成两

    个小部分,之前的程序是正常运行的程序,一旦出现异常就跳转到异常部分执行。

    PL/SQL 是一种编程语言,与 Java 和 C#一样,除了有自身独有的数据类型、变量声明和赋

    值以及流程控制语句外, PL/SQL 还有自身的语言特性:

    PL/SQL 对大小写不敏感,为了良好的程序风格,开发团队都会选择一个合适的编码标准。

    比如有的团队规定:关键字全部大些,其余的部分小写。

    PL/SQL 块中的每一条语句都必须以分号结束, SQL 语句可以是多行的,但分号表示该语

    句结束。一行中可以有多条 SQL 语句,他们之间以分号分隔,但是不推荐一行中写多条语

    句。

    PL/SQL 中的特殊符号说明:

    类型 符号 说明

    赋值运算符 :=         Java 和 C#中都是等号, PL/SQL 的赋值是: =

    特殊字符

               ||         字符串连接操作符。

               --         PL/SQL 中的单行注释。

             /*,*/        PL/SQL 中的多行注释,多行注释不能嵌套。

             <<,>>        标签分隔符。只为了标识程序特殊位置。

               ..         范围操作符,比如: 1..5 标识从1到5

    算术运算符

            +, -, *, / 基本算术运算符。

              **          求幂操作,比如: 3**2=9

    关系运算符

           >, <,>=,<=,=  基本关系运算符, =表示相等关系,不是赋值。

               <>,!=      不等关系。

    逻辑运算符 AND,OR,NOT 逻辑运算符。

    变量声明

    PL/SQL 支持 SQL 中的数据类型, PL/SQL 中正常支持 NUMBER,VARCHAR2,DATE 等 Oracle

    SQL 数据类型。声明变量必须指明变量的数据类型,也可以声明变量时对变量初始化,变量

    声明必须在声明部分。声明变量的语法是:

    语法格式:声明变量

    变量名 数据类型[ :=初始值]

    语法解析:

    数据类型如果需要长度,可以用括号指明长度,比如: varchar2(20)。

    代码演示:声明变量

    DECLARE

      sname VARCHAR2(20) :='jerry'; ①

    BEGIN

      sname:=sname||' and tom'; ②

      dbms_output.put_line(sname); ③        (set serveroutput on)

    END;

    声明常量

    常量在声明时赋予初值,并且在运行时不允许重新赋值。使用 CONSTANT 关键字声明常

    量。

    代码演示:声明常量

    DECLARE

      pi CONSTANT number :=3.14; --圆周率长值 ①

      r number DEFAULT 3; --圆的半径默认值3 ②

      area number; --面积。

    BEGIN

      area:=pi*r*r; --计算面积

      dbms_output.put_line(area); --输出圆的面积

    END;

    标量数据类型

    标量数据类型的变量只有一个值,且内部没有分量。标量数据类型包括数字型,字符型,

    日期型和布尔型。这些类型有的是 Oracle SQL 中定义的数据类型,有的是 PL/SQL 自身附加

    的数据类型。字符型和数字型又有子类型,子类型只与限定的范围有关,比如 NUMBER 类

    型可以表示整数,也可以表示小数,而其子类型 POSITIVE 只表示正整数。

    类型 说明

    VARCHAR2(长度)

    可变长度字符串, Oracle SQL 定义的数据类型,在 PL/SQL 中使用时最

    常 32767 字节。在 PL/SQL 中使用没有默认长度,因此必须指定。

    NUMBER(精度,小数) Oracle SQL 定义的数据类型。

    DATE Oracle SQL 定义的日期类型。

    TIMESTAMP Oracle SQL 定义的日期类型。

    CHAR(长度) Oracle SQL 定义的日期类型,固定长度字符,最长 32767 字节,默认

    长度是 1,如果内容不够用空格代替。

    LONG

    Oracle SQL 定义的数据类型,变长字符串基本类型,最长 32760 字节。

    在 Oracle SQL 中最长 2147483647 字节。

    BOOLEAN PL/SQL 附加的数据类型,逻辑值为 TRUE、 FALSE、 NULL

    BINARY_INTEGER PL/SQL 附加的数据类型,介于-231 和 231 之间的整数。

    PLS_INTEGER

    PL/SQL 附加的数据类型,介于 -231 和 231 之间的整数。类似于

    BINARY_INTEGER,只是 PLS_INTEGER 值上的运行速度更快。

    NATURAL

    PL/SQL 附加的数据类型, BINARY_INTEGER 子类型,表示从 0 开始的

    自然数。

    NATURALN 与 NATURAL 一样,只是要求 NATURALN 类型变量值不能为 NULL。

    POSITIVE PL/SQL 附加的数据类型, BINARY_INTEGER 子类型,正整数。

    POSITIVEN 与 POSITIVE 一样,只是要求 POSITIVE 的变量值不能为 NULL。

    REAL Oracle SQL 定义的数据类型, 18 位精度的浮点数

    INT,INTEGER,SMALLINT Oracle SQL 定义的数据类型, NUMBERDE 的子类型, 38 位精度整数。

    SIGNTYPE PL/SQL 附加的数据类型, BINARY_INTEGER 子类型。值有: 1、 -1、 0。

    STRING 与 VARCHAR2 相同

    属性数据类型

    当声明一个变量的值是数据库中的一行或者是数据库中某列时,可以直接使用属性类型

    来声明。 Oracle 中存在两种属性类型: %TYPE 和%ROWTYPE。

      % ROWTYPE

    引用数据库表中的一行作为数据类型,即 RECORD 类型(记录类型),是 PL/SQL 附加的

    数据类型。表示一条记录,就相当于 C#中的一个对象。可以使用“ .”来访问记录中的属性。

    代码演示:

    DECLARE

      myemp EMP%ROWTYPE; ①

    BEGIN

      SELECT * INTO myemp FROM emp WHERE empno=7934; ②

      dbms_output.put_line(myemp.ename); ③

    END;

    代码解析:

    ① 声明一个 myemp 对象,该对象表示 EMP 表中的一行。

    ② 从 EMP 表中查询一条记录放入 myemp 对象中。

    ③ 访问该对象的属性可以使用“ .”。

    %TYPE

    引用某个变量或者数据库的列的类型作为某变量的数据类型。

    代码演示:%TYPE 应用

    DECLARE

      sal emp.sal%TYPE; ①

      mysal number(4):=3000;

      totalsal mysal%TYPE; ②

    BEGIN

      SELECT SAL INTO sal FROM emp WHERE empno=7934;

      totalsal:=sal+mysal;

      dbms_output.put_line(totalsal);

    END;

    declare

      stuid  student.sid%TYPE;

      stusex student.ssex%TYPE;

    begin

      select sid,ssex into stuid,stusex

      from student where sname='&姓名';

      dbms_output.put_line(stuid||':'||stusex);

    end;

    代码解析:

    ① 定义变量 sal 为 emp 表中 sal 列的类型。

    ② 定义 totalsal 是变量 mysal 的类型。

    %TYPE 可以引用表中的某列作的类型为变量的数据类型,也可以引用某变量的类型作为

    新变量的数据类型。

    IF 条件 THEN

    --条件结构体

    END IF;

    IF 条件 THEN

    --条件成立结构体

    ELSE

    --条件不成立结构体

    END IF;

    IF 条件 1 THEN

    --条件 1 成立结构体

    ELSIF 条件 2 THEN

    --条件 2 成立结构体

    ELSE

    --以上条件都不成立结构体

    END IF;

    范例:

    DECLARE

      newSal emp.sal % TYPE;

    BEGIN

      SELECT sal INTO newSal FROM emp

      WHERE ename='JAMES';

      IF newSal>900 THEN ①

        UPDATE emp

        SET comm=800

        WHERE ename='JAMES';

      END IF;

      COMMIT ; ②

    END;

    DECLARE

      v_grade CHAR(1):=UPPER('&grade');

      p_grade VARCHAR(20) ;

    BEGIN

      if v_grade='A' then

        dbms_output.put_line('优秀');

      elsif v_grade='B' then

        dbms_output.put_line('良好');

      elsif v_grade='C' then

        dbms_output.put_line('中等');

      else

        dbms_output.put_line('差');

      end if;

    END;

    WHILE 条件 LOOP

    --循环体

    END LOOP;

    DECLARE

      counter number(3):=0;

      sumResult number:=0;

    BEGIN

      WHILE counter<100 LOOP

        counter := counter+1;

        sumResult := sumResult+counter;

      END LOOP;

      dbms_output.put_line('result is :'||sumResult);

    END;

    FOR 循环变量 IN [REVERSE] 循环下限..循环上限 LOOP LOOP

    --循环体

    END LOOP;

    DECLARE

      counter number(3):=0;

      sumResult number:=0;

    BEGIN

      FOR counter IN 1..100 LOOP

        sumResult := sumResult+counter;

      END LOOP;

      dbms_output.put_line('result is :'||sumResult);

    END;

    PL/SQL 的异常处理

    在程序运行时出现的错误,称为异常。发生异常后,语句将停止执行, PL/SQL 引擎立

    即将控制权转到 PL/SQL 块的异常处理部分。异常处理机制简化了代码中的错误检测。 PL/SQL

    中任何异常出现时,每一个异常都对应一个异常码和异常信息。

    预定义异常

    为了 Oracle 开发和维护的方便,在 Oracle 异常中,为常见的异常码定义了对应的异常

    名称,称为预定义异常,常见的预定义异常有:

    异常名称 异常码 描述

    DUP_VAL_ON_INDEX ORA-00001      试图向唯一索引列插入重复值

    INVALID_CURSOR   ORA-01001      试图进行非法游标操作。

    INVALID_NUMBER   ORA-01722      试图将字符串转换为数字

    NO_DATA_FOUND    ORA-01403      SELECT INTO 语句中没有返回任何记录。没有信息

    TOO_MANY_ROWS    ORA-01422      SELECT INTO 语句中返回多于 1 条记录。重复

    ZERO_DIVIDE      ORA-01476      试图用 0 作为除数。

    CURSOR_ALREADY_  OPEN ORA-06511 试图打开一个已经打开的游标

    PL/SQL 中用 EXCEPTION 关键字开始异常处理。具体语法是:

    语法格式:异常处理

    BEGIN

    --可执行部分

    EXCEPTION -- 异常处理开始

    WHEN 异常名 1 THEN

    --对应异常处理

    WHEN 异常名 2 THEN

    --对应异常处理

    ……

    WHEN OTHERS THEN

    --其他异常处理

    END;

    语法解析:

    异常发生时,进入异常处理部分,具体的异常与若干个 WHEN 子句中指明的异常名匹

    配,匹配成功就进入对应的异常处理部分,如果对应不成功,则进入 OTHERS 进行处理。

    案例 :异常处理

    代码演示:异常处理

    DECLARE

      newSal emp.sal % TYPE;

    BEGIN

      SELECT sal INTO newSal FROM emp;

    EXCEPTION

      WHEN TOO_MANY_ROWS THEN

        dbms_output.put_line('返回的记录太多了');

      WHEN OTHERS THEN

        dbms_output.put_line('未知异常');

    END;

    返回的记录太多了

    SGA:System Global Area是Oracle Instance的基本组成部分,在实例启动时分配;系统全局域SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。

    PGA:Process Global Area是为每个连接到Oracle database的用户进程保留的内存。是每个连接私有的。并不属于数据库实例

    创建表空间

    create tablespace ts_lisi

    datafile 'c:lisidata.dbf'

    size 50m

    autoextend on;

    权限:

    create session

    create table

    unlimited tablespace

    connect

    resource

    dba

      例:

    #sqlplus /nolog

    SQL> conn / as sysdba;

    SQL>create user username identified by password

    SQL> grant dba to username;

    SQL> conn username/password

    SQL> select * from user_sys_privs;

      我们将从创建Oracle用户权限表开始谈起,然后讲解登陆等一般性动作,使大家对Oracle用户权限表有个深入的了解。

      一、创建

    sys;//系统管理员,拥有最高权限

    system;//本地管理员,次高权限

    scott;//普通用户,密码默认为tiger,默认未解锁

      二、登陆

    sqlplus / as sysdba;//登陆sys帐户

    sqlplus sys as sysdba;//同上

    sqlplus scott/tiger;//登陆普通用户scott

      三、管理用户

    create user zhangsan;//在管理员帐户下,创建用户zhangsan

    alert user zhangsan identified by tiger;//修改密码

      四,授予权限

    1、默认的普通用户scott默认未解锁,不能进行那个使用,新建的用户也没有任何权限,必须授予权限

    grant create session to zhangsan;//授予zhangsan用户创建session的权限,即登陆权限

    grant unlimited tablespace to zhangsan;//授予zhangsan用户使用表空间的权限

    grant create table to zhangsan;//授予创建表的权限

    grant drop table to zhangsan;//授予删除表的权限

    grant insert table to zhangsan;//插入表的权限

    grant update table to zhangsan;//修改表的权限

    grant all to public;//这条比较重要,授予所有权限(all)给所有用户(public)

    2、oralce对权限管理比较严谨,普通用户之间也是默认不能互相访问的,需要互相授权

    grant select on tablename to zhangsan;//授予zhangsan用户查看指定表的权限

    grant drop on tablename to zhangsan;//授予删除表的权限

        revoke  delete on student from zhangsan;

        revoke  create table from zhangsan;

    grant insert on tablename to zhangsan;//授予插入的权限

    grant update on tablename to zhangsan;//授予修改表的权限

    grant insert(id) on tablename to zhangsan;

    grant update(id) on tablename to zhangsan;//授予对指定表特定字段的插入和修改权限,注意,只能是insert和update

    grant alter all table to zhangsan;//授予zhangsan用户alert任意表的权限

      五、撤销权限

      基本语法同grant,关键字为revoke

      六、查看权限

    select * from user_sys_privs;//查看当前用户所有权限

    select * from user_tab_privs;//查看所用用户对表的权限

      七、操作表的用户的表

    select * from zhangsan.tablename

      八、权限传递

      即用户A将权限授予B,B可以将操作的权限再授予C,命令如下:

    grant alert table on tablename to zhangsan with admin option;//关键字 with admin option

    grant alert table on tablename to zhangsan with grant option;//关键字 with grant option效果和admin类似

      九、角色

      角色即权限的集合,可以把一个角色授予给用户

    create role myrole;//创建角色

    grant create session to myrole;//将创建session的权限授予myrole

    grant myrole to zhangsan;//授予zhangsan用户myrole的角色

    drop role myrole;删除角色

  • 相关阅读:
    2017国家集训队作业[agc006f]Blackout
    2017国家集训队作业[agc004f]Namori
    2017国家集训队作业[agc016b]Color Hats
    2017国家集训队作业[arc082d]Sandglass
    2017国家集训队作业[arc076d/f][Exhausted?]
    2017国家集训队作业[agc006e]Rotate 3x3
    2017国家集训队作业[agc014d]Black and White Tree
    2017国家集训队作业[agc008f]Black Radius
    数学竞赛
    [BZOJ4555 TJOI2016 HEOI2016 求和]
  • 原文地址:https://www.cnblogs.com/czg-0705/p/11391920.html
Copyright © 2011-2022 走看看