精华内容
下载资源
问答
  • 1.基本介绍 ...Oracle 9i realse2支持存储最大为4g的数据,oracle 10g realse1支持最大8到128万亿字节的数据存储,依赖于你的db的block size。 在plsql中可以申明的lob类型的变量如下:  BFILE
    

    1.基本介绍

    Oracle和plsql都支持lob(large object) 类型,用来存储大数量数据,如图像文件,声音文件等。Oracle 9i realse2支持存储最大为4g的数据,oracle 10g realse1支持最大8到128万亿字节的数据存储,依赖于你的db的block size。

    在plsql中可以申明的lob类型的变量如下: 

    • BFILE        二进制文件,存储在数据库外的操作系统文件,只读的。把此文件当二进制处理。 
    • BLOB        二进制大对象。存储在数据库里的大对象,一般是图像声音等文件。 
    • CLOB        字符型大对象。一般存储大数量文本信息。存储单字节,固定宽度的数据。 
    • NCLOB        字节字符大对象。存储单字节大块,多字节固定宽度,多字节变宽度数据。

    Oracle将lob分类为两种:

    1. 存储在数据库里的,参与数据库的事务。BLOB,CLOB,NCCLOB。

    2. 存储在数据库外的BFILE,不参与数据库的事务,也就是不能rollback或commit等,它依赖于文件系统的数据完整性。
    LONG和LONG
    RAW这两种数据类型也是存储字符的,但是有系列的问题,不建议使用,这里也就不讨论了。 

    2.LOB的使用 

    本部分不讨论lob的所有细节,只讨论lob的基本原理和在plsql中的基本使用,为plsql开发使用lob提供一个基础性指导。 

    本部分使用的表是: 
    1. /**   
    2. table script   
    3. **/   
    4. CREATE TABLE waterfalls (   
    5.        falls_name VARCHAR2(80),--name   
    6.        falls_photo BLOB,--照片   
    7.        falls_directions CLOB,--文字   
    8.        falls_description NCLOB,--文字   
    9.        falls_web_page BFILE);--指向外部的html页面   
    10. /  
    /** 
    table script 
    **/ 
    CREATE TABLE waterfalls ( 
           falls_name VARCHAR2(80),--name 
           falls_photo BLOB,--照片 
           falls_directions CLOB,--文字 
           falls_description NCLOB,--文字 
           falls_web_page BFILE);--指向外部的html页面 
    /
    这个表我们并不需要clob和nclob两个,只取一就可以,这里全部定义只是为了演示使用。

    1. 理解LOB的Locator

    表中的Lob类型的列中存储的只是存储指向数据库中实际存储lob数据的一个指针。 

    在plsql中申明了一个lob类型的变量,然后从数据库中查询一个lob类型的值分配给变量,也只是将指针复制给了它,那么这个变量也会指向数据库中实际存放lob数据的地方。如:
    1. --understanding lob locators   
    2.   DECLARE   
    3.        photo BLOB;   
    4.     BEGIN   
    5.        SELECT falls_photo   
    6.          INTO photo   
    7.          FROM waterfalls   
    8.         WHERE falls_name='Dryer Hose';   
    --understanding lob locators 
      DECLARE 
           photo BLOB; 
        BEGIN 
           SELECT falls_photo 
             INTO photo 
             FROM waterfalls 
            WHERE falls_name='Dryer Hose'; 
    Lob工作原理图解 

           从上面的图可以看出,要处理lob数据,必须先获得lob locators。我们可以通过一个select语句获取,当赋值给lob变量的时候,它也获得同样的lob locators。我们在plsql中处理可以使用dbms_lob包,里面内置了很多过程和函数来读取和修改我们的lob数据。下面给出处理lob数据的一般方法。 

    1.        通过select语句获取一个lob locator。 

    2.        通过调用dbms_lob.open打开lob。 

    3.        调用dbms_lob.getchunksize获得最佳读写lob值。 

    4.        调用dbms_lob.getlength获取lob数据的字节值。 

    5.        调用dbms_lob.read获取lob数据。 

    6.        调用dbms_lob.close关闭lob。 

    2.Empty
    lob and Null lob

    Empty的意思是我们已经获取了一个lob
    locator,但是没有指向任何lob数据。Null是定义了一个变量,但是没有获得lob locator。对lob类型的处理和其他类型不一样。如下面的例子:
    1. /* null lob example*/  
    2. DECLARE  
    3.   directions CLOB; --定义了,但是没有分配值,为null   
    4. BEGIN  
    5.   IF directions IS NULL THEN  
    6.     dbms_output.put_line('directions is null');  
    7.   ELSE  
    8.     dbms_output.put_line('directions is not null');  
    9.   END IF;  
    10. END;  
    11. /  
    12. DECLARE  
    13.   directions CLOB; --定义一个,并且分配值   
    14. BEGIN  
    15.   --删除一行   
    16.   DELETE FROM waterfalls WHERE falls_name = 'Munising Falls';  
    17.   --插入一行通过使用 EMPTY_CLOB(  ) to 建立一个lob locator   
    18.   INSERT INTO waterfalls  
    19.     (falls_name, falls_directions)  
    20.   VALUES  
    21.     ('Munising Falls', empty_clob());  
    22.   --获得lob locator,上面插入的数据,因为我们插入的是一个empty_clob(),那么lob locator不指向任何数据,虽然给变量分配了只   
    23.   SELECT falls_directions  
    24.     INTO directions  
    25.     FROM waterfalls  
    26.    WHERE falls_name = 'Munising Falls';  
    27.   IF directions IS NULL THEN  
    28.     dbms_output.put_line('directions is NULL');  
    29.   ELSE  
    30.     dbms_output.put_line('directions is not NULL'); --打印此句   
    31.   END IF;  
    32.   dbms_output.put_line('Length = ' || dbms_lob.getlength(directions)); --结果为o   
    33. END;  
    /* null lob example*/
    DECLARE
      directions CLOB; --定义了,但是没有分配值,为null 
    BEGIN
      IF directions IS NULL THEN
        dbms_output.put_line('directions is null');
      ELSE
        dbms_output.put_line('directions is not null');
      END IF;
    END;
    /
    DECLARE
      directions CLOB; --定义一个,并且分配值 
    BEGIN
      --删除一行 
      DELETE FROM waterfalls WHERE falls_name = 'Munising Falls';
      --插入一行通过使用 EMPTY_CLOB(  ) to 建立一个lob locator 
      INSERT INTO waterfalls
        (falls_name, falls_directions)
      VALUES
        ('Munising Falls', empty_clob());
      --获得lob locator,上面插入的数据,因为我们插入的是一个empty_clob(),那么lob locator不指向任何数据,虽然给变量分配了只 
      SELECT falls_directions
        INTO directions
        FROM waterfalls
       WHERE falls_name = 'Munising Falls';
      IF directions IS NULL THEN
        dbms_output.put_line('directions is NULL');
      ELSE
        dbms_output.put_line('directions is not NULL'); --打印此句 
      END IF;
      dbms_output.put_line('Length = ' || dbms_lob.getlength(directions)); --结果为o 
    END;
    注意: 
    1. 上面例子中的empty_clob()是oracle的内置函数,创建了一个lob locator。但是我们没有让它指向任何数据,所以是empty。而且通过select语句给变量directions分配了lob locator,所以不是null,但是length为0,故为empty。 
    2. 在基本类型中,我们判断一个变量是不是有数据,只要is null就可以了。但是在lob类型中我们从以上的例子看出来是不正确的。Lob首先必须判断is null看是否分配lob locator,如果分配了还需要进一步检查length是否为0,看是否是empty,所以完整的是下面这样:
    1. IF some_clob IS NULL THEN  
    2.     --如果is null为true表示未分配,肯定没有数据   
    3.   ELSIF dbms_lob.getlength(some_clob) = 0 THEN  
    4.     --分配了length为0,也没有数据   
    5.   ELSE  
    6.     --有数据   
    7.   END IF;  
    IF some_clob IS NULL THEN
        --如果is null为true表示未分配,肯定没有数据 
      ELSIF dbms_lob.getlength(some_clob) = 0 THEN
        --分配了length为0,也没有数据 
      ELSE
        --有数据 
      END IF;

    3.建立LOB

    在上面我们使用empty_clob()建立了一个空的clob,lob
    locator只是一个指针,真正的数据是存储在磁盘中或数据库文件中。我 们先建立一个空的clob,然后我们可以update来让变量真正指向有数据的lob。Empty_clob()可以用来处理clob和nclob。在oracle 8i中可以使用temporary lob达到同样的效果。



    4.
    向LOB里写入数据
    当获得一个有效的lob
    locator之后,就可以使用dbms_lob包的下列procedure向lob中写入数据。 


           DBMS_LOB.WRITE:允许自动写入数据到lob中。 

           DBMS_LOB.WRITEAPPEND:向lob的末尾写入数据。
    1. --write lob   
    2. DECLARE  
    3.   directions      CLOB;  
    4.   amount          BINARY_INTEGER;  
    5.   offset          INTEGER;  
    6.   first_direction VARCHAR2(100);  
    7.   more_directions VARCHAR2(500);  
    8. BEGIN  
    9.   --Delete any existing rows for 'Munising Falls' so that this   
    10.   --example can be executed multiple times   
    11.   DELETE FROM waterfalls WHERE falls_name = 'Munising Falls';  
    12.   --Insert a new row using EMPTY_CLOB(  ) to create a LOB locator   
    13.   INSERT INTO waterfalls  
    14.     (falls_name, falls_directions)  
    15.   VALUES  
    16.     ('Munising Falls', empty_clob());  
    17.   --Retrieve the LOB locator created by the previous INSERT statement   
    18.   SELECT falls_directions  
    19.     INTO directions  
    20.     FROM waterfalls  
    21.    WHERE falls_name = 'Munising Falls';  
    22.   --Open the LOB; not strictly necessary, but best to open/close LOBs.   
    23.   dbms_lob.open(directions, dbms_lob.lob_readwrite);  
    24.   --Use DBMS_LOB.WRITE to begin   
    25.   first_direction := 'Follow I-75 across the Mackinac Bridge.';  
    26.   amount          := length(first_direction); --number of characters to write   
    27.   offset          := 1; --begin writing to the first character of the CLOB   
    28.   dbms_lob.write(directions, amount, offset, first_direction);  
    29.   --Add some more directions using DBMS_LOB.WRITEAPPEND   
    30.   more_directions := ' Take US-2 west from St. Ignace to Blaney Park.' ||  
    31.                      ' Turn north on M-77 and drive to Seney.' ||  
    32.                      ' From Seney, take M-28 west to Munising.';  
    33.   dbms_lob.writeappend(directions,  
    34.                        length(more_directions),  
    35.                        more_directions);  
    36.   --Add yet more directions   
    37.   more_directions := ' In front of the paper mill, turn right on H-58.' ||  
    38.                      ' Follow H-58 to Washington Street. Veer left onto' ||  
    39.                      ' Washington Street. You''ll find the Munising' ||  
    40.                      ' Falls visitor center across from the hospital at' ||  
    41.                      ' the point where Washington Street becomes' ||  
    42.                      ' Sand Point Road.';  
    43.   dbms_lob.writeappend(directions,  
    44.                        length(more_directions),  
    45.                        more_directions);  
    46.   --Close the LOB, and we are done.   
    47.   dbms_lob.close(directions);  
    48. END;  
    --write lob 
    DECLARE
      directions      CLOB;
      amount          BINARY_INTEGER;
      offset          INTEGER;
      first_direction VARCHAR2(100);
      more_directions VARCHAR2(500);
    BEGIN
      --Delete any existing rows for 'Munising Falls' so that this 
      --example can be executed multiple times 
      DELETE FROM waterfalls WHERE falls_name = 'Munising Falls';
      --Insert a new row using EMPTY_CLOB(  ) to create a LOB locator 
      INSERT INTO waterfalls
        (falls_name, falls_directions)
      VALUES
        ('Munising Falls', empty_clob());
      --Retrieve the LOB locator created by the previous INSERT statement 
      SELECT falls_directions
        INTO directions
        FROM waterfalls
       WHERE falls_name = 'Munising Falls';
      --Open the LOB; not strictly necessary, but best to open/close LOBs. 
      dbms_lob.open(directions, dbms_lob.lob_readwrite);
      --Use DBMS_LOB.WRITE to begin 
      first_direction := 'Follow I-75 across the Mackinac Bridge.';
      amount          := length(first_direction); --number of characters to write 
      offset          := 1; --begin writing to the first character of the CLOB 
      dbms_lob.write(directions, amount, offset, first_direction);
      --Add some more directions using DBMS_LOB.WRITEAPPEND 
      more_directions := ' Take US-2 west from St. Ignace to Blaney Park.' ||
                         ' Turn north on M-77 and drive to Seney.' ||
                         ' From Seney, take M-28 west to Munising.';
      dbms_lob.writeappend(directions,
                           length(more_directions),
                           more_directions);
      --Add yet more directions 
      more_directions := ' In front of the paper mill, turn right on H-58.' ||
                         ' Follow H-58 to Washington Street. Veer left onto' ||
                         ' Washington Street. You''ll find the Munising' ||
                         ' Falls visitor center across from the hospital at' ||
                         ' the point where Washington Street becomes' ||
                         ' Sand Point Road.';
      dbms_lob.writeappend(directions,
                           length(more_directions),
                           more_directions);
      --Close the LOB, and we are done. 
      dbms_lob.close(directions);
    END;
    
    在这个例子里,我们使用了write 和writeappend这两个过程来插入数据到lob中。因为开始的时候,我们插入了一个空的lob locator。要注意一点,我们最后使用了dbms_lob.close方法关闭lob。这是一个好的方法,特别是在处理oracle text的时候,任何oracle text domain和function-based indexes被update是在wirte和writeappend的时候调用的,而不是在close的时候被update的。        
    我们向lob中写入数据的时候,没有必要更新表中的列。因为它保存的只是一个locator,我们的变量也获得同样的locator,当我们写入数据去lob的时候,locator并没有改变。改变的只是locator指向的物理数据。 


    5.
    从lob中读取数据

    步骤:a.通过select查询获得lob locator初始化lob变量。2.调用dbms_lob.read过程读取lob数据。 
    下面是dbms_lob.read过程的定义,注意参数.  
     
    1. PROCEDURE READ(lob_loc IN BLOB, --初始化后的lob变量lob locator   
    2.                amount  IN OUT NOCOPY INTEGER--读取的数量(clob为字符数,blob,bfile是字节数)   
    3.                offset  IN INTEGER--开始读取位置   
    4.                buffer  OUT RAW); --读到的数据,raw要显示用转换函数,见bfile   
    5. PROCEDURE READ(lob_loc IN CLOB CHARACTER SET any_cs,  
    6.                amount  IN OUT NOCOPY INTEGER,  
    7.                offset  IN INTEGER,  
    8.                buffer  OUT VARCHAR2 CHARACTER SET lob_loc%charset);  
    9. PROCEDURE READ(file_loc IN BFILE,  
    10.                amount   IN OUT NOCOPY INTEGER,  
    11.                offset   IN INTEGER,  
    12.                buffer   OUT RAW);  
    PROCEDURE READ(lob_loc IN BLOB, --初始化后的lob变量lob locator 
                   amount  IN OUT NOCOPY INTEGER, --读取的数量(clob为字符数,blob,bfile是字节数) 
                   offset  IN INTEGER, --开始读取位置 
                   buffer  OUT RAW); --读到的数据,raw要显示用转换函数,见bfile 
    PROCEDURE READ(lob_loc IN CLOB CHARACTER SET any_cs,
                   amount  IN OUT NOCOPY INTEGER,
                   offset  IN INTEGER,
                   buffer  OUT VARCHAR2 CHARACTER SET lob_loc%charset);
    PROCEDURE READ(file_loc IN BFILE,
                   amount   IN OUT NOCOPY INTEGER,
                   offset   IN INTEGER,
                   buffer   OUT RAW);

    1. --从lob中读取数据   
    2. DECLARE  
    3.   directions   CLOB;  
    4.   directions_1 VARCHAR2(300);  
    5.   directions_2 VARCHAR2(300);  
    6.   chars_read_1 BINARY_INTEGER;  
    7.   chars_read_2 BINARY_INTEGER;  
    8.   offset       INTEGER;  
    9. BEGIN  
    10.   --首先获得一个lob locator   
    11.   SELECT falls_directions  
    12.     INTO directions  
    13.     FROM waterfalls  
    14.    WHERE falls_name = 'Munising Falls';  
    15.   --记录开始读取位置   
    16.   offset := 1;  
    17.   --尝试读取229个字符,chars_read_1将被实际读取的字符数更新   
    18.   chars_read_1 := 229;  
    19.   dbms_lob.read(directions, chars_read_1, offset, directions_1);  
    20.   --当读取229个字符之后,更新offset,再读取225个字符   
    21.   IF chars_read_1 = 229 THEN  
    22.     offset       := offset + chars_read_1; --offset变为offset+chars_read_1,也就是从300开始   
    23.     chars_read_2 := 255;  
    24.     dbms_lob.read(directions, chars_read_2, offset, directions_2);  
    25.   ELSE  
    26.     chars_read_2 := 0; --否则后面不在读取   
    27.     directions_2 := '';  
    28.   END IF;  
    29.   --显示读取的字符数   
    30.   dbms_output.put_line('Characters read = ' ||  
    31.                        to_char(chars_read_1 + chars_read_2));  
    32.   --显示结果   
    33.   dbms_output.put_line(directions_1);  
    34.   dbms_output.put_line(length(directions_1));  
    35.   dbms_output.put_line(directions_2);  
    36.   dbms_output.put_line(length(directions_2));  
    37. END;  
    --从lob中读取数据 
    DECLARE
      directions   CLOB;
      directions_1 VARCHAR2(300);
      directions_2 VARCHAR2(300);
      chars_read_1 BINARY_INTEGER;
      chars_read_2 BINARY_INTEGER;
      offset       INTEGER;
    BEGIN
      --首先获得一个lob locator 
      SELECT falls_directions
        INTO directions
        FROM waterfalls
       WHERE falls_name = 'Munising Falls';
      --记录开始读取位置 
      offset := 1;
      --尝试读取229个字符,chars_read_1将被实际读取的字符数更新 
      chars_read_1 := 229;
      dbms_lob.read(directions, chars_read_1, offset, directions_1);
      --当读取229个字符之后,更新offset,再读取225个字符 
      IF chars_read_1 = 229 THEN
        offset       := offset + chars_read_1; --offset变为offset+chars_read_1,也就是从300开始 
        chars_read_2 := 255;
        dbms_lob.read(directions, chars_read_2, offset, directions_2);
      ELSE
        chars_read_2 := 0; --否则后面不在读取 
        directions_2 := '';
      END IF;
      --显示读取的字符数 
      dbms_output.put_line('Characters read = ' ||
                           to_char(chars_read_1 + chars_read_2));
      --显示结果 
      dbms_output.put_line(directions_1);
      dbms_output.put_line(length(directions_1));
      dbms_output.put_line(directions_2);
      dbms_output.put_line(length(directions_2));
    END;
    

    Dbms_lob.read的第2个参数是传递要读取的数量。对于clob是字符数,blob和bfile都是字节数。它是随着读取的数目自动更新的,offset不会更新。所以分布读取需要手动更新offset,下个offset是上一个offset+读取的数量。我们可以通过dbms_lob.get_length(lob_locator)获得这个lob的长度,结果clob是字符数,blob和bfile是字节数,然后分布读取。


    展开全文
  • Oracle数据库对象简介

    万次阅读 2013-01-15 10:20:36
    对数据库的操作可以基本归结为对数据对象操作,理解和掌握Oracle数据库对象是学习Oracle的捷径。    表和视图    Oracle中表是数据存储的基本结构。ORACLE8引入了分区表和对象表,ORACLE8i引入了临时表,使...

    Oracle数据库数据对象中最基本的是表和视图,其他还有约束、序列、函数、存储过程、包、触发器等。对数据库的操作可以基本归结为对数据对象的操作,理解和掌握Oracle数据库对象是学习Oracle的捷径。

     

      表和视图

     

      Oracle中表是数据存储的基本结构。ORACLE8引入了分区表和对象表,ORACLE8i引入了临时表,使表的功能更强大。视图是一个或多个表中数据的逻辑表达式。本文我们将讨论怎样创建和管理简单的表和视图。
      管理表

      表可以看作有行和列的电子数据表,表是关系数据库中一种拥有数据的结构。用CREATE TABLE语句建立表,在建立表的同时,必须定义表名,列,以及列的数据类型和大小。例如:

    CREATE TABLE products
      ( PROD_ID NUMBER(4),
       PROD_NAME VAECHAR2(20),
       STOCK_QTY NUMBER(5,3)
      );

      这样我们就建立了一个名为products的表, 关键词CREATE TABLE后紧跟的表名,然后定义了三列,同时规定了列的数据类型和大小。

      在创建表的同时你可以规定表的完整性约束,也可以规定列的完整性约束,在列上普通的约束是NOT NULL,关于约束的讨论我们在以后进行。

      在建立或更改表时,可以给表一个缺省值。缺省值是在增加行时,增加的数据行中某一项值为null时,oracle即认为该值为缺省值。

      下列数据字典视图提供表和表的列的信息:

       . DBA_TABLES
       . DBA_ALL_TABLES
       . USER_TABLES
       . USER_ALL_TABLES
       . ALL_TABLES
       . ALL_ALL_TABLES
       . DBA_TAB_COLUMNS
       . USER_TAB_COLUMNS
       . ALL_TAB_COLUMNS

      表的命名规则

      表名标识一个表,所以应尽可能在表名中描述表,oracle中表名或列名最长可以达30个字符串。表名应该以字母开始,可以在表名中包含数字、下划线、#、$等。

      从其它表中建立表

      可以使用查询从基于一个或多个表中建立表,表的列的数据类型和大小有查询结果决定。建立这种形式的表的查询可以选择其他表中所有的列或者只选择部分列。在CREATE TABLE语句中使用关键字AS,例如:

    SQL>CREATE TABLE emp AS SELECT * FROM employee

    TABLE CREATED

    SQL> CREATE TABLE Y AS SELECT * FROM X WHERE no=2

      需要注意的是如果查询涉及LONG数据类型,那么CREATE TABLE....AS SELECT....将不会工作。

      更改表定义

      在建立表后,有时候我们可能需要修改表,比如更改列的定义,更改缺省值,增加新列,删除列等等。ORACLE使用ALTER TABLE语句来更改表的定义

      1、增加列

      语法:

    ALTER TABLE [schema.] table_name ADD column_definition

      例:

    ALTER TABLE orders ADD order_date DATE;

    TABLE ALTER

      对于已经存在的数据行,新列的值将是NULL.

      2、更改列

      语法:

    ALTER TABLE [schema.] table_name MODIFY column_name new_attributes;

      例:

    ALTER TABLE orders MODITY (quantity number(10,3),status varchar2(15));

      这个例子中我们修改了表orders,将STATUS列的长度增加到15,将QUANTITY列减小到10,3;

      修改列的规则如下:

       . 可以增加字符串数据类型的列的长度,数字数据类型列的精度。

       . 减少列的长度时,该列应该不包含任何值,所有数据行都为NULL.

       . 改变数据类型时,该列的值必须是NULL.

       . 对于十进制数字,可以增加或减少但不能降低他的精度。

      3、删除数据列

      优化ORACLE数据库,唯一的方法是删除列,重新建立数据库。在ORACLE8i中有很多方法删除列,你可以删除未用数据列或者可以标示该列为未用数据列然后删除。

      删除数据列的语法是:

    ALTER TABLE [schema.] table_name DROP {COLUM column_names | (column_names)}[CASCADE CONSTRAINS]

      要注意的是在删除列时关于该列的索引和完整性约束也同时删除。注意关键字CASCADE CONSTRAINS,如果删除的列是多列约束的一部分,那么这个约束条件相对于其他列也同时删除。

      如果用户担心在大型数据库中删除列要花太多时间,可以先将他们标记为未用数据列,标记未用数据列的语法如下:

    ALTER TABLE [schema.] table_name SET UNUSED {COLUM column_names | (column_names)}[CASCADE CONSTRAINS]

      这个语句将一个或多个数据列标记为未用数据列,但并不删除数据列中的数据,也不释放占用的磁盘空间。但是,未用数据列在视图和数据字典中并不显示,并且该数据列的名称将被删除,新的数据列可以使用这个名称。基于该数据列的索引、约束,统计等都将被删除。

      删除未用数据列的语句是:

    ALTER TABLE [schema.] table_name DROP {UNUSED COLUM | COLUMN CONTINUE}
      删除表和更改表名

      删除表非常简单,但它是一个不可逆转的行为。

      语法:

    DROP TABLE [schema.] table_name [CASCADE CONSTRAINTS]
      
      删除表后,表上的索引、触发器、权限、完整性约束也同时删除。ORACLE不能删除视图,或其他程序单元,但oracle将标示他们无效。如果删除的表涉及引用主键或唯一关键字的完整性约束时,那么DROP TABLE语句就必须包含CASCADE CONSTRAINTS子串。

      更改表名

      RENAME命令用于给表和其他数据库对象改名。ORACLE系统自动将基于旧表的完整性约束、索引、权限转移到新表中。ORACLE同时使所有基于旧表的数据库对象,比如视图、程序、函数等,为不合法。

      语法:

    RENAME old_name TO new_name;

      例:

    SQL> RENAME orders TO purchase_orders;

    TABLE RENAMED
     

      截短表

      TRUNCATE命令与DROP命令相似, 但他不是删除整个数据表,所以索引、完整性约束、触发器、权限等都不会被删除。缺省情况下将释放部分表和视图空间,如果用户不希望释放表空间,TRUNCATE语句中要包含REUSE STORAGE子串。TRUNCATE命令语法如下:

    TRUNCATE {TABLE|CLUSTER} [schema.] name {DROP|REUSE STORAGE}

      例:

    SQL> TRUNCATE TABLE t1;

    TABLE truncate.

     

      视图(VIEW)

      视图是一个或多个表中的数据的简化描述,用户可以将视图看成一个存储查询(stored query)或一个虚拟表(virtual table).查询仅仅存储在oracle数据字典中,实际的数据没有存放在任何其它地方,所以建立视图不用消耗其他的空间。视图也可以隐藏复杂查询,比如多表查询,但用户只能看见视图。视图可以有与他所基于表的列名不同的列名。用户可以建立限制其他用户访问的视图。

      建立视图

      CREATE VIEW命令创建视图,定义视图的查询可以建立在一个或多个表,或其他视图上。查询不能有FOR UPDATE子串,在早期的ORACLE8i版本中不支持ORDER BY子串,现在的版本中CREATE VIEW可以拥有ORDER BY子串。

      例:

    SQL> CREATE VIEW TOP_EMP AS
    SELECT empno EMPLOYEE_ID,ename EMPLOYEE_NAME,salary
    FROM emp
    WHERE salary >2000

      用户可以在创建视图的同时更改列名,方法是在视图名后立即加上要命名的列名。重新定义视图需要包含OR REPLACE子串。

    SQL> CREATE VIEW TOP_EMP
    (EMPLOYEE_ID,EMPLOYEE_NAME,SALARY) AS
    SELECT empno ,ename ,salary
    FROM emp
    WHERE salary >2000

      如果在创建的视图包含错误在正常情况下,视图将不会被创建。但如果你需要创建一个带错误的视图必须在CREATE VIEW语句中带上FORCE选项。如:

    CREATE FORCE VIEW ORDER_STATUS AS
    SELECT * FROM PURCHASE_ORDERS
    WHERE STATUS=APPPOVE;

    SQL>/

    warning :View create with compilation errors

      这样将创建了一个名为ORDER_STATUS的视图,但这样的视图的状态是不合法的,如果以后状态发生变化则可以重新编译,其状态也变成合法的。

      从视图中获得数据

      从视图中获得数据与从表中获得数据基本一样,用户可以在连接和子查询中使用视图,也可以使用SQL函数,以及所有SELECT语句的字串。

     

      插入、更新、删除数据

      用户在一定的限制条件下可以通过视图更新、插入、删除数据。如果视图连接多个表,那么在一个时间里只能更新一个表。所有的能被更新的列可以在数据字典USER_UPDATETABLE_COLUMNS中查到。

      用户在CREATE VIEW中可以使用了WITH子串。WITH READ ONLY子串表示创建的视图是一个只读视图,不能进行更新、插入、删除操作。WITH CHECK OPTION表示可以进行插入和更新操作,但应该满足WHERE子串的条件。这个条件就是创建视图WHERE子句的条件,比如在上面的例子中用户创建了一个视图TOP_EMP,在这个视图中用户不能插入salary小于2000的数据行。

     

      删除视图

      删除视图使用DROP VIEW命令。同时将视图定义从数据字典中删除,基于视图的权限也同时被删除,其他涉及到该视图的函数、视图、程序等都将被视为非法。

      例:

    DROP VIEW TOP_EMP;

     
     
     完整性约束


      完整性约束用于增强数据的完整性,Oracle提供了5种完整性约束:

        Check
        NOT NULL
        Unique
        Primary
        Foreign key

      完整性约束是一种规则,不占用任何数据库空间。完整性约束存在数据字典中,在执行SQL或PL/SQL期间使用。用户可以指明约束是启用的还是禁用的,当约束启用时,他增强了数据的完整性,否则,则反之,但约束始终存在于数据字典中。

      禁用约束,使用ALTER语句

    ALTER TABLE table_name DISABLE CONSTRAINT constraint_name;

      或

    ALTER TABLE policies DISABLE CONSTRAINT chk_gender

      如果要重新启用约束:

    ALTER TABLE policies ENABLE CONSTRAINT chk_gender

      删除约束

    ALTER TABLE table_name DROP CONSTRAINT constraint_name

      或

    ALTER TABLE policies DROP CONSTRAINT chk_gender;

      Check 约束

      在数据列上Check 约束需要 一个特殊的布尔条件或者将数据列设置成TRUE,至少一个数据列的值是NULL,Check约束用于增强表中数据内容的简单的商业规则。用户使用Check约束保证数据规则的一致性。Check约束可以涉及该行同属Check约束的其他数据列但不能涉及其他行或其他表,或调用函数SYSDATE,UID,USER,USERENV。如果用户的商业规则需要这类的数据检查,那么可以使用触发器。Check约束不保护LOB数据类型的数据列和对象、嵌套表、VARRY、ref等。单一数据列可以有多个Check约束保护,一个Check约束可以保护多个数据列。

      创建表的Check约束使用CREATE TABLE语句,更改表的约束使用ALTER TABLE语句。

      语法:

    CONSTRAINT [constraint_name] CHECK (condition);

      Check约束可以被创建或增加为一个表约束,当Check约束保护多个数据列时,必须使用表约束语法。约束名是可选的并且如果这个名字不存在,那么oracle将产生一个以SYS_开始的唯一的名字。

      例:

    CREATE TABLE policies
    (policy_id NUMBER,
    holder_name VARCHAR2(40),
    gender VARCHAR2(1) constraint chk_gender CHECK (gender in (M,F),
    marital_status VARCHAR2(1),
    date_of_birth DATE,
    constraint chk_marital CHECK (marital_status in(S,M,D,W))
    );
     

      NOT NULL约束

      NOT NULL约束应用在单一的数据列上,并且他保护的数据列必须要有数据值。缺省状况下,ORACLE允许任何列都可以有NULL值。某些商业规则要求某数据列必须要有值,NOT NULL约束将确保该列的所有数据行都有值。

      例:

    CREATE TABLE policies
    (policy_id NUMBER,
    holder_name VARCHAR2(40) NOT NULL,
    gender VARCHAR2(1),
    marital_status VARCHAR2(1),
    date_of_birth DATE NOT NULL
    );

      对于NOT NULL的ALTER TABLE语句与其他约束稍微有点不同。

    ALTER TABLE policies MODIFY holder_name NOT NULL

      唯一性约束(Unique constraint)

      唯一性约束可以保护表中多个数据列,保证在保护的数据列中任何两行的数据都不相同。唯一性约束与表一起创建,在唯一性约束创建后,可以使用ALTER TABLE语句修改。

      语法:

    column_name data_type CONSTRAINT constraint_name UNIQUE 

      如果唯一性约束保护多个数据列,那么唯一性约束要作为表约束增加。语法如下:

    CONSTRAINT constraint_name (column) UNIQUE USING INDEX TABLESPACE (tablespace_name) STORAGE (stored clause)

      唯一性约束由一个B-tree索引增强,所以可以在USING子串中为索引使用特殊特征,比如表空间或存储参数。CREATE TABLE语句在创建唯一性约束的同时也给目标数据列建立了一个唯一的索引。

    CREATE TABLE insured_autos
    (policy_id NUMBER CONSTRAINT pk_policies PRIMARY KEY,
    vin VARCHAR2(10),
    coverage_begin DATE,
    coverage_term NUMBER,
    CONSTRAIN unique_auto UNIQUE (policy_id,vin) USING INDEX TABLESPACE index STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0)
    );

      用户可以禁用未以性约束,但他仍然存在,禁用唯一性约束使用ALTER TABLE 语句

    ALTER TABLE insured_autos DISABLE CONSTRAIN unique_name;

      删除唯一性约束,使用ALTER TABLE....DROP CONSTRAIN语句

    ALTER TABLE insured_autos DROP CONSTRAIN unique_name;

      注意用户不能删除在有外部键指向的表的唯一性约束。这种情况下用户必须首先禁用或删除外部键(foreign key)。

      删除或禁用唯一性约束通常同时删除相关联的唯一索引,因而降低了数据库性能。经常删除或禁用唯一性约束有可能导致丢失索引带来的性能错误。要避免这样错误,可以采取下面的步骤:

      1、在唯一性约束保护的数据列上创建非唯一性索引。

      2、添加唯一性约束

      主键(Primary Key)约束

      表有唯一的主键约束。表的主键可以保护一个或多个列,主键约束可与NOT NULL约束共同作用于每一数据列。NOT NULL约束和唯一性约束的组合将保证主键唯一地标识每一行。像唯一性约束一样,主键由B-tree索引增强。

      创建主键约束使用CREATE TABLE语句与表一起创建,如果表已经创建了,可以使用ALTER TABLE语句。

    CREATE TABLE policies
    (policy_id NUMBER CONSTRAINT pk_policies PRIMARY KEY,
    holder_name VARCHAR2(40),
    gender VARCHAR2(1),
    marital_status VARCHAR2(1),
    date_of_birth DATE
    );

      与唯一性约束一样,如果主键约束保护多个数据列,那么必须作为一个表约束创建。

    CREATE TABLE insured_autos
    (policy_id NUMBER,
    vin VARCHAR2(40),
    coverage_begin DATE,
    coverage_term NUMBER,
    CONSTRAINT pk_insured_autos PRIMARY KEY (policy_id,vin)
    USING INDEX TABLESPACE index
    STORAGE (INITIAL 1M NEXT 10M PCTINCREASE 0)
    );

      禁用或删除主键必须与ALTER TABLE 语句一起使用

    ALTER TABLE policies DROP PRIMARY KEY;

      或

    ALTER TABLE policies DISABLE PRIMARY KEY;

      外部键约束(Foreign key constraint)

      外部键约束保护一个或多个数据列,保证每个数据行的数据包含一个或多个null值,或者在保护的数据列上同时拥有主键约束或唯一性约束。引用(主键或唯一性约束)约束可以保护同一个表,也可以保护不同的表。与主键和唯一性约束不同外部键不会隐式建立一个B-tree索引。在处理外部键时,我们常常使用术语父表(parent table)和子表(child table),父表表示被引用主键或唯一性约束的表,子表表示引用主键和唯一性约束的表。

      创建外部键使用CREATE TABLE语句,如果表已经建立了,那么使用ALTER TABLE语句。

    CREATE TABLE insured_autos
    (policy_id NUMBER CONSTRAINT policy_fk
    REFERENCE policies(policy_id
    ON DELETE CASCADE,
    vin VARCHAR2(40),
    coverage_begin DATE,
    coverage_term NUMBER,
    make VARCHAR2(30),
    model VARCHAR(30),
    year NUMBER,
    CONSTRAIN auto_fk FROEIGN KEY (make,model,year)
    REFERENCES automobiles (make,model,year)
    ON DELETE SET NULL
    );
     

      ON DELETE子串告诉ORACLE如果父纪录(parent record)被删除后,子记录做什么。缺省情况下禁止在子记录还存在的情况下删除父纪录。

      外部键和NULL值

      在外部键约束保护的数据列中NULL值的处理可能产生不可预料的结果。ORACLE 使用ISO standar Match None规则增强外部键约束。这个规则规定如果任何外部键作用的数据列包含有一个NULL值,那么任何保留该键的数据列在父表中没有匹配值。

      比如,在父表AUTOMOBILES中,主键作用于数据列MAKE,MODEL,YEAR上,用户使用的表INSURED_AUTOS有一个外部约束指向AOTOMOBILES,注意在INSURES_AUTOS中有一数据行的MODEL列为NULL值,这一行数据已经通过约束检查,即使MAKE列也没有显示在父表AUTOMOBILES中,如下表:

      表1 AUTOMOBILES

    MAKE  MODEL  YEAR
    Ford  Taurus 2000
    Toyota Camry  1999

      表2 INSURED_AUTOS

    POLICY_ID MAKE  MODEL  YEAR
    576  Ford  Taurus  2000
    577  Toyota Camry  1999 
    578  Tucker  NULL  1949

      延迟约束检验(Deferred Constraint Checking)

      约束检验分两种情况,一种是在每一条语句结束后检验数据是否满足约束条件,这种检验称为立即约束检验(immediately checking),另一种是在事务处理完成之后对数据进行检验称之为延迟约束检验。在缺省情况下Oracle约束检验是立即检验(immediately checking),如果不满足约束将先是一条错误信息,但用户可以通过SET CONSTRAINT语句选择延迟约束检验。语法如下:

    SET CONSTRAINT constraint_name|ALL DEFEERRED|IMMEDIATE --;

      序列(Sequences)

      Oracle序列是一个连续的数字生成器。序列常用于人为的关键字,或给数据行排序否则数据行是无序的。像约束一样,序列只存在于数据字典中。序列号可以被设置为上升、下降,可以没有限制或重复使用直到一个限制值。创建序列使用SET SEQUENCE语句。

    CREATE SEQUENCE [schema] sequence KEYWORD

      KEYWORD包括下面的值:


    KEYWORD  描述
    START WITH  定义序列生成的第一个数字,缺省为1
    INCREMENT BY  定义序列号是上升还是下降,对于一个降序的序列INCREMENT BY为负值
    MINVALUE  定义序列可以生成的最小值,这是降序序列中的限制值。缺省情况下该值为NOMINVALUE,NOMINVALUE,对于升序为1,对于降序为-10E26.
    MAXVALUE  序列能生成的最大数字。这是升序序列中的限制值,缺省的MAXVALUE为NOMAXVALUE,NOMAXVALUE,对于升序为10E26,对于降序为-1。
    CYCLE  设置序列值在达到限制值以后可以重复
    NOCYCLE  设置序列值在达到限制值以后不能重复,这是缺省设置。当试图产生MAXVALUE+1的值时,将会产生一个异常
    CACHE  定义序列值占据的内存块的大小,缺省值为20
    NOCACHE  在每次序列号产生时强制数据字典更新,保证在序列值之间没有间隔当创建序列时,START WITH值必须等于或大于MINVALUE。

      删除序列使用DROP SEQUENCE语句

    DROP SEQUENCE sequence_name
     

      索引(INDEXES)

      索引是一种可以提高查询性能的数据结构,在这一部分我们将讨论索引如何提高查询性能的。ORACLE提供了以下几种索引:

       B-Tree、哈希(hash)、位图(bitmap)等索引类型
       基于原始表的索引
       基于函数的索引
       域(Domain)索引

      实际应用中主要是B-Tree索引和位图索引,所以我们将集中讨论这两种索引类型。

      B-Tree索引

      B-Tree索引是最普通的索引,缺省条件下建立的索引就是这种类型的索引。B-Tree索引可以是唯一或非唯一的,可以是单一的(基于一列)或连接的(多列)。B-Tree索引在检索高基数数据列(高基数数据列是指该列有很多不同的值)时提供了最好的性能。对于取出较小的数据B-Tree索引比全表检索提供了更有效的方法。但当检查的范围超过表的10%时就不能提高取回数据的性能。正如名字所暗示的那样,B-Tree索引是基于二元树的,由枝干块(branch block)和树叶块(leaf block)组成,枝干块包含了索引列(关键字)和另一索引的地址。树叶块包含了关键字和给表中每个匹配行的ROWID。

      位图索引

      位图索引主要用于决策支持系统或静态数据,不支持行级锁定。位图索引可以是简单的(单列)也可以是连接的(多列),但在实践中绝大多数是简单的。位图索引最好用于低到中群集(cardinality)列,在这些列上多位图索引可以与AND或OR操作符结合使用。位图索引使用位图作为键值,对于表中的每一数据行位图包含了TRUE(1)、FALSE(0)、或NULL值。位图索引的位图存放在B-Tree结构的页节点中。B-Tree结构使查找位图非常方便和快速。另外,位图以一种压缩格式存放,因此占用的磁盘空间比B-Tree索引要小得多。

      同义词(Synonyms)

      对另一个数据对象而言同义词是一个别名。public同义词是针对所有用户的,相对而言private同义词则只针对对象拥有者或被授予权限的账户。在本地数据库中同义词可以表示表、视图、序列、程序、函数或包等数据对象,也可以通过链接表示另一个数据库的对象。

      创建同义词语法如下:

    CREATE [PUBLIC] SYNONYM synonym_name FOR [schema.] object[@db_link];
      
      例:

    CREATE PUBLIC SYNONYM policies FOR poladm.policies@prod;

    CREATE SYNONYM plan_table FOR system.plan_table;
     

      过程和函数

      过程和函数都以编译后的形式存放在数据库中,函数可以没有参数也可以有多个参数并有一个返回值。过程有零个或多个参数,没有返回值。函数和过程都可以通过参数列表接收或返回零个或多个值,函数和过程的主要区别不在于返回值,而在于他们的调用方式。过程是作为一个独立执行语句调用的:

    pay_involume(invoice_nbr,30,due_date);

      函数以合法的表达式的方式调用:

    order_volumn:=open_orders(SYSDATE,30);

      创建过程的语法如下:

    CREATE [ OR REPLACE] PROCEDURE [schema.]procedure_name
    [parameter_lister]
    {AS|IS}
    declaration_section
    BEGIN
    executable_section
    [EXCEPTION
    exception_section]
    END [procedure_name] 

      每个参数的语法如下:

    paramter_name mode datatype [(:=|DEFAULT) value]

      mode有三种形式:IN、OUT、INOUT。

      IN表示在调用过程的时候,实际参数的取值被传递给该过程,形式参数被认为是只读的,当过程结束时,控制会返回控制环境,实际参数的值不会改变。

      OUT在调用过程时实际参数的取值都将被忽略,在过程内部形式参数只能是被赋值,而不能从中读取数据,在过程结束后形式参数的内容将被赋予实际参数。

      INOUT这种模式是IN和OUT的组合;在过程内部实际参数的值会传递给形式参数,形势参数的值可读也可写,过程结束后,形势参数的值将赋予实际参数。

      创建函数的语法和过程的语法基本相同,唯一的区别在于函数有RETUREN子句

    CREATE [ OR REPLACE] FINCTION [schema.]function_name
    [parameter_list]
    RETURN returning_datatype
    {AS|IS}
    declaration_section
    BEGIN
    executable_section
    [EXCEPTION]
    exception_section
    END [procedure_name] 

      在执行部分函数必须有哟个或多个return语句。

      在创建函数中可以调用单行函数和组函数,例如:

    CREATE OR REPLACE FUNCTION my_sin(DegreesIn IN NUMBER)
    RETURN NUMBER
    IS
    pi NUMBER=ACOS(-1);
    RadiansPerDegree NUMBER;

    BEGIN
    RadiansPerDegree=pi/180;
    RETURN(SIN(DegreesIn*RadiansPerDegree));
    END


      

      包是一种将过程、函数和数据结构捆绑在一起的容器;包由两个部分组成:外部可视包规范,包括函数头,过程头,和外部可视数据结构;另一部分是包主体(package body),包主体包含了所有被捆绑的过程和函数的声明、执行、异常处理部分。

      打包的PL/SQL程序和没有打包的有很大的差异,包数据在用户的整个会话期间都一直存在,当用户获得包的执行授权时,就等于获得包规范中的所有程序和数据结构的权限。但不能只对包中的某一个函数或过程进行授权。包可以重载过程和函数,在包内可以用同一个名字声明多个程序,在运行时根据参数的数目和数据类型调用正确的程序。

      创建包必须首先创建包规范,创建包规范的语法如下:

    CREATE [OR REPLACE] PACKAGE package_name
    {AS|IS}
    public_variable_declarations |
    public_type_declarations |
    public_exception_declarations |
    public_cursor_declarations |
    function_declarations |
    procedure_specifications
    END [package_name]

      创建包主体使用CREATE PACKAGE BODY语句:

    CREATE [OR REPLACE] PACKAGE BODY package_name
    {AS|IS}
    private_variable_declarations |
    private_type_declarations |
    private_exception_declarations |
    private_cursor_declarations |
    function_declarations |
    procedure_specifications
    END [package_name]

      私有数据结构是那些在包主体内部,对被调用程序而言是不可见的。

     

      触发器(Triggers)

      触发器是一种自动执行响应数据库变化的程序。可以设置为在触发器事件之前或之后触发或执行。能够触发触发器事件的事件包括下面几种:

      DML事件
      DDL事件
      数据库事件

      DML事件触发器可以是语句或行级触发器。DML语句触发器在触发语句之前或之后触发DML行级触发器在语句影响的行变化之前或之后触发。用户可以给单一事件和类型定义多个触发器,但没有任何方法可以增强多触发器触发的命令。下表列出了用户可以利用的触发器事件:

    事件 触发器描述
    INSERT  当向表或视图插入一行时触发触发器
    UPDATE  更新表或视图中的某一行时触发触发器
    DELETE 从表或视图中删除某一行时触发触发器
    CREATE 当使用CREATE语句为数据库或项目增加一个对象时触发触发器
    ALTER 当使用ALTER语句为更改一个数据库或项目的对象时触发触发器
    DROP 当使用DROP语句删除一个数据库或项目的对象时触发触发器
    START 打开数据库时触发触发器,在事件后触发
    SHUTDOWN  关闭数据库时触发,事件前触发
    LOGON 当一个会话建立时触发,事件前触发
    LOGOFF 当关闭会话时触发,事件前触发
    SERVER 服务器错误发生时触发触发器,事件后触发

      创建触发器的语法如下:

    CREATE [OR REPLACE] TRIGGER trigger_name
    {before|after|instead of} event
    ON {table_or_view_name|DATABASE}
    [FOR EACH ROW[WHEN condition]]
    trigger_body

      只有DML触发器(INSERT、UPDATE、DELETE)语句可以使用INSTEAD OF触发器并且只有表的DML触发器可以是BEFORE或AFTER触发器。

      象约束一样触发器可以被设置为禁用或启用来关闭或打开他们的执行体(EXECUTE),将触发器设置为禁用或启用使用ALTER TRIGGER语句:

    ALTER TRIGGER trigger_name ENABLE;
    ALTER TRIGGER trigger_name DISABLE;

      要禁用或启用表的所有触发器,使用ALTER TABLE语句

    ALTER TRIGGER table_name DISABLE ALL TRIGGER;
    ALTER TRIGGER table_name ENABLE ALL TRIGGER;

      删除触发器使用DROP TRIGGER

    DROP TRIGGER trigger_name;

     

      数据字典

      Oracle数据字典包含了用户数据库的元数据。带下划线的表名称中带OBJ$、UET$、SOURCE$,这些表是在执行CREATE DATABASE语句期间由sql.bsq脚本创建的,一般情况下用户很少访问这些表。脚本catalog.sql(通常位于$oracle_home/rdbms/admin)在CREATE DATABASE语句之后立即运行,创建数据字典视图。

      数据字典视图大致可以分为三类:

      .前缀为USER_的数据字典视图,包含了用户拥有的对象的信息。

      .前缀为ALL_的数据字典视图,包含了用户当前可以访问的全部对象和权限的信息。

      .前缀为DBA_的数据字典视图,包含了数据库拥有的所有对象和权限的信息。

      在绝大多数数据字典视图中都有象DBA_TABLES,ALL_TABLES和USER_TABLES这样的视图家族。Oracle中有超过100个视图家族,所以要全面介绍这些视图家族是单调乏味的而且没有多大的意义。在下表中列出了最重要和最常用的视图家族,需要注意的是每个视图家族都有一个DBA_,一个ALL_一个USER_视图。

    视图家族(View Family) 描述
    COL_PRIVS 包含了表的列权限,包括授予者、被授予者和权限
    EXTENTS  数据范围信息,比如数据文件,数据段名(segment_name)和大小
    INDEXES 索引信息,比如类型、唯一性和被涉及的表
    IND_COLUMNS  索引列信息,比如索引上的列的排序方式
    OBJECTS  对象信息,比如状态和DDL time
    ROLE_PRIVS 角色权限,比如GRANT和ADMIN选项
    SEGMENTS  表和索引的数据段信息,比如tablespace和storage
    SEQUECNCES 序列信息,比如序列的cache、cycle和ast_number
    SOURCE  除触发器之外的所有内置过程、函数、包的源代码
    SYNONYMS  别名信息,比如引用的对象和数据库链接db_link
    SYS_PRIVS  系统权限,比如grantee、privilege、admin选项
    TAB_COLUMNS  表和视图的列信息,包括列的数据类型
    TAB_PRIVS  表权限,比如授予者、被授予者和权限
    TABLES 表信息,比如表空间(tablespace),存储参数(storage parms)和数据行的数量
    TRIGGERS  触发器信息,比如类型、事件、触发体(trigger body)
    USERS 用户信息,比如临时的和缺省的表空间
    VIEWS 视图信息,包括视图定义

      在Oracle中还有一些不常用的数据字典表,但这些表不是真正的字典家族,他们都是一些重要的单一的视图。

    VIEW NAME 描述
    USER_COL_PRIVS_MADE 用户授予他人的列权限
    USER_COL_PRIVS_RECD  用户获得的列权限
    USER_TAB_PRIVS_MADE  用户授予他人的表权限
    USER_TAB_PRIVS_RECD 用户获得的表权限

      其他的字典视图中主要的是V$视图,之所以这样叫是因为他们都是以V$或GV$开头的。V$视图是基于X$虚拟视图的。V$视图是SYS用户所拥有的,在缺省状况下,只有SYS用户和拥有DBA系统权限的用户可以看到所有的视图,没有DBA权限的用户可以看到USER_和ALL_视图,但不能看到DBA_视图。与DBA_,ALL,和USER_视图中面向数据库信息相反,这些视图可视的给出了面向实例的信息。

       在大型系统上化几周时间手工输入每一条语句

       手工输入带用户名变量的语句,然后再输入每一个用户名,这需要花好几个小时的时间

       写一条SQL语句,生成需要的ALTER USER语句,然后执行他,这只需要几分钟时间

      很明显我们将选择生成SQL的方法:

      例:

    SELECT ALTER USER||username||
    TEMPORARY TABLESPACE temp;
    FROM DBA_USERS
    WHERE username<>SYS
    AND temporary_tablespace<>TEMP;

      这个查询的结果将被脱机处理到一个文件中,然后在执行:

    ALTER USER SYSTEM TEMPORARY TABLESPACE temp;
    ALTER USER OUTLN TEMPORARY TABLESPACE temp;
    ALTER USER DBSNMP TEMPORARY TABLESPACE temp;
    ALTER USER SCOTT TEMPORARY TABLESPACE temp;
    ALTER USER DEMO TEMPORARY TABLESPACE temp;


    展开全文
  • ORACLE操作

    千次阅读 2011-08-13 14:19:45
    ORACLE的简单介绍  ORACLE公司是一家提供综合技术产品、方案、服务的数据库公司  ORACLE数据库设计成可大量存储数据,快速查询数据,保证数据的安全和一致性,  跨网络的分布式管理及客户-服
     
    

    本文转载自:http://actuping.cnblogs.com/

    ORACLE的简单介绍 
    ORACLE公司是一家提供综合技术产品、方案、服务的数据库公司 
    ORACLE数据库设计成可大量存储数据,快速查询数据,保证数据的安全和一致性, 
    跨网络的分布式管理及客户-服务器的配置等。 
    ORACLE SQL语法符合ANSI 1986标准 
    SQL 和数据库交流的命令式语言 
    SQL*PLUS ORACLE的一种工具, 用来运行SQL和PL/SQL语句 
    PL/SQL ORACLE的过程化编程语言

     

    一、选择行 
    1. 简单的SELECT 语句 
    SELECT [DISTINCT] {*,COLUMN [ALIAS], ……} FROM table_name; 
    字段的非唯一的结果集 
    DISTINCT 字段名1 [ ,字段名2] 
    数字类型字段名之间可以进行算术运算 
    + - * / 等 
    例如: (字段名1*字段名2)/3 
    合并字段内容的连接字符 || 
    字段名1 || 字段名2 
    字段可以有别名 
    SELECT 字段名1 [AS] '字段名1 解释' FROM table;

    2. 处理NULL 
    NULL 未定义,不可操作,什么都不是 
    NULL != 0 NULL!='空格' 
    和NULL的任何运算都返回NULL 
    ORACLE里未定义的变量值都为NULL 
    NVL函数可把NULL转换成其它类型的符号 
    NVL(EXPR1, EXPR2)函数 
    解释: IF EXPR1=NULL RETURN EXPR2 
    ELSE RETURN EXPR1 
    编程技巧: NVL函数在多条件模糊查询的时候比较有用 
    nvl('+input_value+','0')='0' or filed_name like '%+input_value+%' 
    NVL函数可返回多种数据类型: 
    返回日期 NVL(start_date,'2002-02-01') 
    返回字符串 NVL(title,'no title') 
    返回数字 NVL(salary,1000)

    3. 使用SQL*PLUS(1) 
    登录SQL*PLUS的方法 
    用户名,密码,数据库连接字符串 
    数据库连接字符串可以用net8 easy configuration建立本地网络服务名配置, 
    也可以手工编辑$ORACLE_HOME/network/admin/tnsnames.ora文件。 
    在UNIX系统下不要用 
    $sqlplus username/password@dbname 
    这样别的用户用$ps命令能看出用户的密码 
    SQL> desc table; 显示表结构 
    SQL> select * from tab; 查看用户下所有的表 
    SQL> set pause on; 可以使大量结果集在用户按“Enter”(回车)后翻页 
    SQL> set pagesize 100; 设定SQL语句返回结果集一页的行数100, 默认值是14 
    SQL> set linesize 100; 设定SQL语句返回结果集一行的宽度100, 默认值是80

    3. 使用SQL*PLUS(2)SQL*PLUS里的编辑命令 
    最近一条SQL命令语句存在ORACLE内存(sql buffer)里,但SQL*PLUS命令却不会存进去。 
    SQL*PLUS里的编辑命令: 
    A[PPEND] text 把text增加到当前行后面 
    C[HANGE] /old/new/ 把当前行old符号替换成new符号,new为空,删除old符号 
    CL[EAR] BUFF[ER] 从sql buffer里删除所有的行 
    DEL n 删除sql buffer里第n行 
    I[NPUT] text 在sql buffer后面插入text 
    L[IST] n 显示sql buffer里第n行 
    n 使第n行为当前行 
    n text 第n行替换成text 
    0 text 在第一行前面插入一行

    3. 使用SQL*PLUS(3) SQL*PLUS里的文件命令: 
    SAV[E] filename [REP[LACE] | APP[END] ] 
    把sql buffer里的SQL命令存到OS下一个文件filename,默认的文件名后缀为.sql. 
    REP[LACE]替换filename里的SQL命令 
    APP[END] 把sql buffer里的SQL命令添加到filename后 
    GET filename 从filename里把SQL命令读到sql buffer 
    STA[RT] filename 运行上次保存到文件filename里的SQL命令 
    @filename 运行上次保存到文件filename里的SQL命令 
    EDIT 打开编辑窗口,编辑sql buffer里的SQL命令 
    EDIT filename 打开编辑窗口,编辑文件filename里的SQL命令 
    SPO[OL] filename [OFF | OUT] 把SQL命令结果输出到OS下一个文件filename OFF结束输出到文件, OUT结束输出到文件并打印文件 

    4. SQL*PLUS里规定字段的显示格式 
    规定数字的显示格式 
    SQL>column 字段名 format 99999999999; 
    SQL>column 字段名 format 999,999,999,999; 
    规定字符串的显示宽度 
    SQL>column 字段名 format a数字 [word_wrapped]; 
    说明: 一行只显示数字位的长度, 超过长度折行,加word_wrapped后, 单词不会折行 
    规定long字符的显示宽度 
    SQL>set long 200; 
    规定字段名的显示内容 
    SQL> column 字段名 heading '字段名显示内容'; 
    SQL> set heading off; 查询时不显示字段名称 
    规定字段的对齐方向 
    SQL> column 字段名 justify [left | right | center]; 
    清除字段的格式 
    SQL> column 字段名 clear;

    5. SQL*PLUS里规定字段的显示格式例子 
    SQL> column last_name heading 'Employee|Name' format a15; 
    SQL> column salary justify right format $99,999.99; 
    SQL> column start_date format a10 null 'Not Hired'; 
    说明:如果start_date为null, 显示字符串'Not Hired'

    6. 判断题(T/F) 
    (1). SQL command are always held in sql buffer. [T] 
    (2). SQL*PLUS command assit with query data. [T] 
    SQL*PLUS命令只控制SELECT结果集的显示格式及控制文件.只有SQL命令能访问数据库.

    二、限制选择行 
    1. 按指定的规则排序 
    SELECT expr FROM table [ORDER BY {column, expr} [ASC | DESC] ]; 
    默认的排序是ASC升序(由小到大) 
    还可以ORDER BY 字段名的位置[1]| [2] ASC| DESC; 
    当字段名很复杂或者是算术表达式时用字段名显示的位置排序很方便.

    2. 用WHERE限制选择行(1) 
    比较操作符 = > < >= <= != <> ^= 与NULL比较不能用上面的比较操作符 ANY SOME ALL 
    SQL操作符 BETWEEN … AND… IN LIKE IS NULL 
    NOT BETWEEN … AND… NOT IN NOT LIKE IS NOT NULL 
    逻辑操作符 AND OR NOT

    3. 用WHERE限制选择行(2) 
    比较顺序(可以用括号改变它们的顺序) 
    (1). = < > >= <= in like is null between 
    (2). and 
    (3). Or 
    注意: char和varchar2的比较规则有不同: 
    char比较时会忽略字符串后面的空格. varchar2会计算字符串后面的空格

    4. LIKE操作 
    % 零到任意多个字符 _ 一个字符 
    例如: 字段名 like 'M%' 字段名 like '%m%' 字段名 like 'job_' 
    如果要找含下划线的字符, 要加反斜线 例如:字段名 like '%X/_Y%' escape '/'

    5. 日期字段的比较 
    举例: 
    日期字段 between to_date('2001-12-12','YYYY-MM-DD') and to_date('2002-02-01','YYYY-MM-DD') 
    日期字段> to_date('2001-12-12','YYYY-MM-DD') and日期字段<= to_date('2002-02-01','YYYY-MM-DD');

    6. 不能用到索引的比较操作符 
    IS NULL 
    IS NOT NULL 
    LIKE '%m%'

    三、单行函数 
    1. 数字函数 
    ABS 取绝对值 POWER 乘方 LN 10为底数取冪 
    SQRT 平方根 EXP e的n次乘方 LOG(m,n) m为底数n取冪 
    数学运算函数:ACOS ATAN ATAN2 COS COSH SIGN SIN SINH TAN TANH 
    CEIL 大于或等于取整数 
    FLOOR 小于或等于取整数 
    MOD 取余数 
    ROUND(n,m) 按m的位数取四舍五入值如果round(日期): 中午12以后将是明天的日期. round(sysdate,'Y')是年的第一天 
    TRUNC(n,m) 按m的位数取前面的数值如果trunc(日期), 确省的是去掉时间

    2. 字符函数 
    CHR 按数据库的字符集由数字返回字符 
    CONCAT(c1,c2) 把两个字符c1,c2组合成一个字符, 和 || 相同 
    REPLACE(c,s,r) 把字符c里出现s的字符替换成r, 返回新字符 
    SUBSTR(c,m,n) m大于0,字符c从前面m处开始取n位字符,m等于0和1一样, 
    m小与0,字符c从后面m处开始取n位字符 
    TRANSLATE(c,f1,t1) 字符c按f1到t1的规则转换成新的字符串 
    INITCAP 字符首字母大写,其它字符小写 
    LOWER 字符全部小写 
    UPPER 字符全部大写 
    LTRIM(c1,c2) 去掉字符c1左边出现的字符c2 
    RTRIM(c1,c2) 
    TRIM(c1,c2) 去掉字符c1左右两边的字符c2 
    LPAD(c1,n,c2) 字符c1按制定的位数n显示不足的位数用c2字符串替换左边的空位 
    RPAD(c1,n,c2)

    3. 日期函数 
    ADD_MONTHS(d,n) 日期值加n月 
    LAST_DAY(d) 返回当月的最后一天的日期 
    MONTHS_BETWEEN(d1,d2) 两个日期值间的月份,d1NEXT_DAY(d) 返回日期值下一天的日期 
    SYSDATE 当前的系统时间 
    DUAL是SYS用户下一个空表,它只有一个字段dummy 
    4. 转换函数(1) 
    TO_CHAR(date,'日期显示格式') 
    TO_CHAR(number) 用于显示或报表的格式对齐 
    TO_DATE(char,'日期显示格式') 
    TO_LOB 把long字段转换成lob字段 
    TO_NUMBER(char) 用于计算或者比较大小

    4. 转换函数(2) 
    to_date里日期显示格式 
    YYYY 年 YEAR YYY YY Y 
    Q 季度 
    MM 月 MONTH MON 
    W 星期 (week of month) WW, IW (week of year) 
    (说明:周计是按ISO标准,从1月1日的星期数到后面七天为一周,不一定是从周一到周日) 
    DD 日 DAY DY 
    HH24 小时 HH12 HH 
    MI 分钟 
    SS 秒 
    如果想固定日期的显示格式可以在数据库的参数文件initorasid.ora里新写一行参数 NLS_DATE_FORMAT=yyyy-mm-dd hh24:mi:ss可以在UNIX环境变量或者NT的注册表里的设置 NLS_DATE_FORMAT=yyyy-mm-dd hh24:mi:ss

    4. 转换函数(3) 
    如果想固定日期的显示格式可以用alter session命令改变 
    SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; 
    它的作用顺序如下: 
    initialization parameter 
    Environment variable 
    ALTER SESSION command

    4. 转换函数 (4) 
    to_char(number)里数字显示格式 
    9 数字位 
    0 数字前面补0 to_char(-1200,'00000.00') 
    . 小数点的位置 
    , 标记位置的逗号 用在数字显示格式的左边 
    L 根据数据库字符集加货币符号 to_char(-1200,'L9999.99') 
    B 把数字0显示为空格,用在数字显示格式的右边 

    MI 右边的负数标记 to_char(-1200,'9999.99MI') 
    PR 括起来的负数 to_char(-1200,'9999.99PR') 
    EEEE 用指数方式表示 to_char(-1200,'9999.99EEEE')

    5. 输入字符,返回数字的函数 
    instr(c1,c2) 字符c2出现在c1的位置, 不出现, 返回0, 常用于模糊查询 
    length(c) 按数据库的字符集,算出字符c的长度,跟数据库的字符集有关, 一个汉字长度为1

    6. 有逻辑比较的函数NVL(EXPR1, EXPR2)函数 
    解释: IF EXPR1=NULL RETURN EXPR2 
    ELSE RETURN EXPR1 
    DECODE(AA﹐V1﹐R1﹐V2﹐R2....)函数 
    解释: IF AA=V1 THEN RETURN R1 
    IF AA=V2 THEN RETURN R2 
    ..… 
    ELSE 
    RETURN NULL 
    举例: decode(id,1,'dept sale',2,'dept tech')

    四、从多个表里选取数据记录 
    1. 数据表间的连接 
    简单的连接语法: 
    SELECT 字段名1, 字段名2, …… FROM 表名1, [表名2, ……] 
    WHERE 表名1.字段名 = 表名2. 字段名 [ AND ……] ; 
    SELECT 字段名1, 字段名2, …… FROM 表名1, [表名2, ……] 
    WHERE 表名1.字段名 = 表名2. 字段名(+) [ AND ……] ; 
    有(+)号的字段位置自动补空值

    连接的分类: 
    等于的连接 = 
    不等于的连接 != BETWEEN … AND … IN 注意IN和OR不能一起用 
    外连接 有一个字段名(+) , 没有满足的条件补空值 
    自连接 同一个表自己跟自己连接 例如找重复记录

    2. 数据表间的连接例子 
    删除table_name表里字段名email重复的记录: 
    SQL>delete from table_name t1 
    where t1.rowid > 
    (select min(rowid) from table_name t2 
    where t1.email = t2.email 
    group by email 
    having count(email) > 1);

    找到手机用户的服务区域: 
    SQL> select a.handphoneno,nvl(c.name,'null'),a.totalscore 
    from topscore a,chargeoperator cc,chargeoperatorinfo c 
    where substr(a.handphoneno,1,7)=cc.hpnohead(+) 
    and cc.chargetype=c.chargetype(+) 
    order by a.totalscore desc;

    3. 数据表间的连接技巧 
    连接N个表, 需要N-1个连接操作 
    被连接的表最好建一个单字符的别名, 字段名前加上这个单字符的别名 
    BETWEEN .. AND.. 比用 >= AND <= 要好 
    连接操作的字段名上最好要有索引 
    连接操作的字段最好用整数数字类型 
    有外连接时, 不能用OR或IN的比较操作

    4. 如何分析和执行SQL语句 
    写多表连接SQL语句时要知道它的分析执行计划的情况. 
    Sys用户下运行@/ORACLE_HOME/sqlplus/admin/plustrce.sql 
    产生plustrace角色 
    Sys用户下把此角色赋予一般用户 SQL> grant plustrace to &username; 
    一般用户下运行@/ORACLE_HOME/rdbms/admin/utlxplan.sql 
    产生plan_table 
    SQL> set time on; 说明:打开时间显示 
    SQL> set autotrace on; 说明:打开自动分析统计,并显示SQL语句的运行结果 
    SQL> set autotrace traceonly; 说明:打开自动分析统计,不显示SQL语句的运行结果 
    接下来你就运行测试SQL语句,看到其分析统计结果了。 
    一般来讲,我们的SQL语句应该避免大表的全表扫描。 
    SQL> set autotrace off; 说明:关闭自动分析统计

    五、集合函数 经常和group by一起使用 
    1. 集合函数列表 
    AVG (DISTINCT | ALL | N) 取平均值 
    COUNT (DISTINCT | ALL | N | expr | * ) 统计数量 
    MAX (DISTINCT | ALL | N) 取最大值 
    MIN (DISTINCT | ALL | N) 取最小值 
    SUM (DISTINCT | ALL | N) 取合计值 
    STDDEV (DISTINCT | ALL | N) 取偏差值,如果组里选择的内容都相同,结果为0 
    VARIANCE (DISTINCT | ALL | N) 取平方偏差值

    2. 使用集合函数的语法 
    SELECT column, group_function FROM table 
    WHERE condition GROUP BY group_by_expression 
    HAVING group_condition ORDER BY column; 

    3. 使用count时的注意事项 
    SELECT COUNT(*) FROM table; 
    SELECT COUNT(常量) FROM table;

    都是统计表中记录数量,如果没有PK后者要好一些 
    SELECT COUNT(all 字段名) FROM table; 
    SELECT COUNT(字段名) FROM table;

    不会统计为NULL的字段的数量 
    SUM,AVG时都会忽略为NULL的字段

    4. 用group by时的限制条件 
    SELECT字段名不能随意, 要包含在GROUP BY的字段里 
    GROUP BY后ORDER BY时不能用位置符号和别名 
    限制GROUP BY的显示结果, 用HAVING条件 

    5. 例子 
    SQL> select title,sum(salary) payroll from s_emp 
    where title like 'VP%' group by title 
    having sum(salary)>5000 order by sum(salary) desc; 

    找出某表里字段重复的记录数, 并显示 
    SQL> select (duplicate field names) from table_name 
    group by (list out fields) having count(*)>1;

    6. 判断题(T/F) 
    (1) Group functions include nulls in calculations [F] 
    (2) Using the having clause to exclude rows from a group calculation [F] 
    解释: 
    Group function 都是忽略NULL值的 如果您要计算NULL值, 用NVL函数 
    Where语句在Group By前把结果集排除在外Having语句在Group By后把结果集排除在外

    7. 在SQL*PLUS里可使用的其它命令:

    Ctrl^C 终止正在运行的SQL语句 
    remark /*...*/ -- 注释符号 
    HOST 可执行的操作系统下的命令 有些unix可以用 !

    BREAK ON column_name SKIP n [ ON column_name SKIP n ] 
    按字段的名称column_name分隔显示,更清晰,SKIP n 是在分隔处空行的数量n 
    BREAK ON ROW SKIP n 每一行间隔都放n个空行

    COMPUTE 集合运算符 OF 字段1 ON 字段2 按字段2对字段1进行集合运算 
    COMPUTE后面可以跟的集合运算符: 
    SUM MINIMUM MAXIMUM AVG STD VARIANCE COUNT NUMBER

    8.在SQL*PLUS里可使用的其它命令举例:(scott用户) 

    BREAK ON REPORT 
    COMPUTE SUM LABEL TOTAL OF SAL ON REPORT 在全部结果集后面算合计 
    select ename,sal from emp where job='SALESMAN'; 

    COMPUTE AVG LABEL avg OF SAL ON REPORT 在全部结果集后面算平均值 
    / 再次执行上次的sql语句 

    break on DEPTNO skip 2 on JOB skip 1 在BREAK字段结果集后面算合计 
    COMPUTE SUM OF SAL ON DEPTNO 
    SELECT DEPTNO,JOB,ENAME,SAL FROM EMP ORDER BY DEPTNO,JOB; 

    SQL> CLEAR BREAKS; 清除设置的BREAK条件 
    SQL> CLEAR COMPUTES; 清除设置的COMPUTE条件

    六、子查询 
    1. 查询语句可以嵌套 
    例如: SELECT …… FROM (SELECT …… FROM表名1, [表名2, ……] WHERE 条件) WHERE 条件2;

    2. 何处可用子查询? 
    当查询条件是不确定的条件时 
    DML(insert, update,delete)语句里也可用子查询 
    HAVING里也可用子查询

    3. 两个查询语句的结果可以做集合操作 
    例如: 
    并集UNION(去掉重复记录) 
    并集UNION ALL(不去掉重复记录) 
    差集MINUS, 
    交集INTERSECT

    4. 子查询的注意事项 
    先执行括号里面的SQL语句,一层层到外面 
    内部查询只执行一次 
    如果里层的结果集返回多个,不能用= > < >= <=等比较符要用IN.

    5. 子查询的例子(1) 
    SQL> select title,avg(salary) from s_emp 
    group by title Having avg(salary) = 
    (select min(avg(salary)) from s_emp 
    group by title); 
    找到最低平均工资的职位名称和工资

    5. 子查询的例子(2) 
    子查询可以用父查询里的表名 
    这条SQL语句是对的: 
    SQL>select cty_name from city where st_code in 
    (select st_code from state where st_name='TENNESSEE' and 
    city.cnt_code=state.cnt_code); 
    说明:父查询调用子查询只执行一次.

    6.取出结果集的80 到100的SQL语句 
    ORACLE处理每个结果集只有一个ROWNUM字段标明它的逻辑位置, 
    并且只能 用ROWNUM<100, 不能用ROWNUM>80。 
    以下是经过分析后较好的两种ORACLE取得结果集80到100间的SQL语句( ID是唯一关键字的字段名 ): 
    语句写法: 
    SQL>select * from ( 
    ( select rownum as numrow, c.* from ( 
    select [field_name,...] from table_name where 条件1 order by 条件2) c) 
    where numrow > 80 and numrow <= 100 ) 
    order by 条件3;

    七、在执行SQL语句时绑定变量 
    1. 接收和定义变量的SQL*PLUS命令 
    ACCEPT 
    DEFINE UNDEFINE 


    2. 绑定变量SQL语句的例子(1) 
    SQL> select id, last_name, salary from s_emp where dept_id = &department_number; 
    Enter value for department_number: 10 
    old 1: select id, last_name, salary from s_emp where dept_id=&department_number; 
    new 1: select id, last_name, salary from s_emp where dept_id= 10 
    SQL> SET VERIFY OFF | ON;可以关闭和打开提示确认信息old 1和new 1的显示.

    3. 绑定变量SQL语句的例子(2) 
    SQL> select id, last_name, salary 
    from s_emp 
    where title = '&job_title'; 
    Enter value for job_title: Stock Clerk

    SQL> select id, last_name, salary 
    from s_emp 
    where hiredate >to_date( '&start_hire_date','YYYY-MM-DD'); 
    Enter value for start_hire_date : 2001-01-01

    把绑定字符串和日期类型变量时,变量外面要加单引号 
    也可绑定变量来查询不同的字段名 
    输入变量值的时候不要加;等其它符号

    4. ACCEPT的语法和例子 
    SQL> ACCEPT variable [datatype] [FORMAT] [PROMPT text] [HIDE] 
    说明: variable 指变量名 datatype 指变量类型,如number,char等 format 指变量显示格式 prompt text 可自定义弹出提示符的内容text hide 隐藏用户的输入符号 
    使用ACCEPT的例子: 
    ACCEPT p_dname PROMPT 'Provide the department name: ' 
    ACCEPT p_salary NUMBER PROMPT 'Salary amount: ' 
    ACCEPT pswd CHAR PROMPT 'Password: ' HIDE 
    ACCEPT low_date date format 'YYYY-MM-DD' PROMPT“Enter the low date range('YYYY-MM-DD'):”

    4. DEFINE的语法和例子 
    SQL> DEFINE variable = value 
    说明: variable 指变量名 value 指变量值 
    定义好了变良值后, 执行绑定变量的SQL语句时不再提示输入变量 
    使用DEFINE的例子: 
    SQL> DEFINE dname = sales 
    SQL> DEFINE dname 
    DEFINE dname = “sales” (CHAR) 
    SQL> select name from dept where lower(name)='&dname'; 
    NAME 
    ------------------------- 
    sales 
    sales 
    SQL> UNDEFINE dname 
    SQL> DEFINE dname 
    Symbol dname is UNDEFINED

    5. SQL*PLUS里传递参数到保存好的*.sql文件里 
    SQL> @ /路径名/文件名 参数名1[,参数名2, ….] 
    SQL> start /路径名/文件名 参数名1[,参数名2, ….]

    注意事项: 
    一次最多只能获取9个&变量, 变量名称只能是从&1,&2到&9 
    变量名后不要加特殊的结束符号 
    如果在SQL*PLUS里要把&符号保存在ORACLE数据库里,要修改sql*plus环境变量define 
    SQL> set define off;

    八、概述数据模型和数据库设计 
    1. 系统开发的阶段: 
    Strategy and Analysis 
    Design 
    Build and Document 
    Transition 
    Production

    2. 数据模型 
    Model of system in client's mind 
    Entity model of client's model 
    Table model of entity model 
    Tables on disk

    3. 实体关系模型 (ERM)概念 
    ERM ( entity relationship modeling) 
    实体 存有特定信息的目标和事件 例如: 客户,订单等 
    属性 描述实体的属性 例如: 姓名,电话号码等 
    关系 两个实体间的关系 例如:订单和产品等 
    实体关系模型图表里的约定 
    Dashed line (虚线) 可选参数 “may be” 
    Solid line (实线) 必选参数 “must be” 
    Crow's foot (多线) 程度参数 “one or more” 
    Single line (单线) 程度参数 “one and only one”

    4. 实体关系模型例子 
    每个订单都必须有一个或几个客户 
    每个客户可能是一个或几个订单的申请者

    5. 实体关系的类型 
    1:1 一对一 例如: 的士和司机 
    M:1 多对一 例如: 乘客和飞机 
    1:M 一对多 例如: 员工和技能

    6. 校正实体关系的原则 
    属性是单一值的, 不会有重复 
    属性必须依存于实体, 要有唯一标记 
    没有非唯一属性依赖于另一个非唯一的属性 
    7. 定义结构时的注意事项 
    减少数据冗余 
    减少完整性约束产生的问题 
    确认省略的实体,关系和属性

    8. 完整性约束的要求 
    Primary key 主关键字 唯一非NULL 
    Foreign key 外键 依赖于另一个Primary key,可能为NULL 
    Column 字段名 符合定义的类型和长度 
    Constraint 约束条件 用户自定义的约束条件,要符合工作流要求 
    例如: 一个销售人员的提成不能超过它的基本工资 
    Candidate key 候选主关键字 多个字段名可组成候选主关键字, 其组合是唯一和非NULL的

    9. 把实体关系图映射到关系数据库对象的方法 
    把简单实体映射到数据库里的表 
    把属性映射到数据库里的表的字段, 标明类型和注释 
    把唯一标记映射到数据库里的唯一关键字 
    把实体间的关系映射到数据库里的外键

    其它的考虑: 
    设计索引,使查询更快 
    建立视图,使信息有不同的呈现面, 减少复杂的SQL语句 
    计划存储空间的分配 
    重新定义完整性约束条件

    10. 实体关系图里符号的含义 
    PK 唯一关键字的字段 
    FK 外键的字段 
    FK1,FK2 同一个表的两个不同的外键 
    FK1,FK1 两个字段共同组成一个外键 
    NN 非null字段 
    U 唯一字段 
    U1,U1 两个字段共同组成一个唯一字段

    九、创建表 
    1. ORACLE常用的字段类型 
    ORACLE常用的字段类型有 
    VARCHAR2 (size) 可变长度的字符串, 必须规定长度 
    CHAR(size) 固定长度的字符串, 不规定长度默认值为1 
    NUMBER(p,s) 数字型p是位数总长度, s是小数的长度, 可存负数 
    最长38位. 不够位时会四舍五入. 
    DATE 日期和时间类型 
    LOB 超长字符, 最大可达4G 
    CLOB 超长文本字符串 
    BLOB 超长二进制字符串 
    BFILE 超长二进制字符串, 保存在数据库外的文件里是只读的.

    数字字段类型位数及其四舍五入的结果 
    原始数值1234567.89 
    数字字段类型位数 存储的值 
    Number 1234567.89 
    Number(8) 12345678 
    Number(6) 错 
    Number(9,1) 1234567.9 
    Number(9,3) 错 
    Number(7,2) 错 
    Number(5,-2) 1234600 
    Number(5,-4) 1230000 
    Number(*,1) 1234567.9

    2. 创建表时给字段加默认值 和约束条件 
    创建表时可以给字段加上默认值 
    例如 : 日期字段 DEFAULT SYSDATE 
    这样每次插入和修改时, 不用程序操作这个字段都能得到动作的时间

    创建表时可以给字段加上约束条件 
    例如: 非空 NOT NULL 
    不允许重复 UNIQUE 
    关键字 PRIMARY KEY 
    按条件检查 CHECK (条件) 
    外键 REFERENCES 表名(字段名) 

    3. 创建表的例子 
    CREATE TABLE DEPT( 
    EPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY, 
    DNAME VARCHAR2(14), 
    LOC VARCHAR2(13)) ;

    CREATE TABLE region( 
    ID number(2) NOT NULL PRIMARY KEY, 
    postcode number(6) default '0' NOT NULL, 
    areaname varchar2(30) default ' ' NOT NULL);

    4. 创建表时的命名规则和注意事项 
    表名和字段名的命名规则:必须以字母开头,可以含符号A-Z,a-z,0-9,_,$,# 
    大小写不区分 
    不用SQL里的保留字, 一定要用时可用双引号把字符串括起来. 
    用和实体或属性相关的英文符号长度有一定的限制

    注意事项: 
    建表时可以用中文的字段名, 但最好还是用英文的字段名 
    创建表时要把较小的不为空的字段放在前面, 可能为空的字段放在后面 
    建表时如果有唯一关键字或者唯一的约束条件,建表时自动建了索引 
    一个表的最多字段个数也是有限制的,254个.

    5. 约束名的命名规则和语法 
    约束名的命名规则约束名如果在建表的时候没有指明,系统命名规则是SYS_Cn(n是数字) 
    约束名字符串的命名规则同于表和字段名的命名规则

    6. 使用约束时的注意事项 
    约束里不能用系统函数,如SYSDATE和别的表的字段比较 
    可以用本表内字段的比较

    想在事务处理后, 做约束的检查 
    SQL> alter session set constraints deferred.

    7. 由实体关系图到创建表的例子 s_dept 
    前提条件:已有region表且含唯一关键字的字段id 
    SQL> CREATE TABLE s_dept 
    (id NUMBER(7) 
    CONSTRAINT s_dept_id_pk PRIMARY KEY, 
    name VARCHAR2(25) 
    CONSTRAINT s_dept_name_nn NOT NULL, 
    region_id NUMBER(7) 
    CONSTRAINT s_dept_region_id_fk REFERENCES region (id), 
    CONSTRAINT s_dept_name_region_id_uk UNIQUE(name, region_id)); 

    8. 较复杂的创建表例子 
    SQL> CREATE TABLE s_emp 
    (id NUMBER(7) 
    CONSTRAINT s_emp_id_pk PRIMARY KEY, 
    last_name VARCHAR2(25) 
    CONSTRAINT s_emp_last_name_nn NOT NULL, 
    first_name VARCHAR2(25), 
    userid VARCHAR2(8) 
    CONSTRAINT s_emp_userid_nn NOT NULL 
    CONSTRAINT s_emp_userid_uk UNIQUE, 
    start_date DATE DEFAULT SYSDATE, 
    comments VARCHAR2(25), 
    manager_id NUMBER(7), 
    title VARCHAR2(25), 
    dept_id NUMBER(7) 
    CONSTRAINT s_emp_dept_id_fk REFERENCES s_dept(id), 
    salary NUMBER(11,2), 
    commission_pct NUMBER(4,2) 
    CONSTRAINT s_emp_commission_pct_ck CHECK 
    (commission_pct IN(10,12.5,15,17.5,20)));

    8. 通过子查询建表 
    通过子查询建表的例子 
    SQL>CREATE TABLE emp_41 AS SELECT id, last_name, userid, start_date 
    FROM s_emp WHERE dept_id = 41; 

    SQL> CREATE TABLE A as select * from B where 1=2; 
    只要表的结构.

    10. 用子查询建表的注意事项 
    可以关连多个表及用集合函数生成新表,注意选择出来的字段必须有合法的字段名称,且不能重复。 
    用子查询方式建立的表,只有非空NOT NULL的约束条件能继承过来, 其它的约束条件和默认值都没有继承过来. 
    根据需要,可以用alter table add constraint ……再建立其它的约束条件,如primary key等.

    10. Foreign Key的可选参数ON DELETE CASCADE 
    在创建Foreign Key时可以加可选参数: 
    ON DELETE CASCADE它的含义是如果删除外键主表里的内容,子表里相关的内容将一起被删除. 
    如果没有ON DELETE CASCADE参数,子表里有内容,父表里的主关键字记录不能被删除掉.

    12. 如果数据库表里有不满足的记录存在,建立约束条件将不会成功.

    13. 给表创建和删除同义词的例子 
    SQL> CREATE SYNONYM d_sum 
    2 FOR dept_sum_vu;

    SQL> CREATE PUBLIC SYNONYM s_dept 
    2 FOR alice.s_dept;

    SQL> DROP SYNONYM s_dept;

    十、ORACLE里的数据字典 
    1. 什么是数据字典ORACLE的数据字典是数据库的重要组成部分之一,它随着数据库 
    的产生而产生, 随着数据库的变化而变化, 体现为sys用户下所有的一些表和视图.

    2. 数据字典里存了以下内容:用户信息 
    用户的权限信息 
    所有数据对象信息表的约束条件统计分析数据库的视图等 
    不能手工修改数据字典里的信息.

    3. 常用的数据字典 
    Dictionary 存放所有数据表,视图,同义词名称和解释 
    Dict_columns 数据字典里字段名称的和解释 
    Dba_users 用户 Dba_tablespaces 表空间 
    Dba_data_files 数据库的文件 Dba_free_space 空闲表空间 
    Dba_rollback_segs 回滚段 
    User_objects 数据对象 User_constraints 约束条件 
    User_sequences 序列号 User_views 视图 
    User_indexes 索引 User_synonyms 同义词 
    Session_roles 用户的角色 User_role_privs 用户的角色权限 
    User_sys_privs 用户的系统权限 User_tab_privs 用户的表级权限 
    V$session 实时用户情况 V$sysstat 实时系统统计 
    V$sesstat 实时用户统计 V$sgastat 实时SGA使用 
    V$locked_object 实时锁 V$controlfile 控制文件 
    V$logfile 日志文件 V$parameter 参数文件

    4. 数据字典的分类 
    数据字典四大类别 
    User_ 用户下所有数据库对象 
    All_ 用户权限范围内所有的数据库对象 
    Dba_ 所有的数据库对象 
    V$ 统计分析数据库的视图 赋于oem_monitor权限非DBA用户也可查询V$*视图

    5. 查询数据字典 
    SQL> select * from dictionary where instr(comments,'index')>0; 
    SQL> select constraint_name, constraint_type, 
    2 search_condition, r_constraint_name 
    3 from user_constraints 
    4 where table_name = ‘&table_name';

    十一. 控制数据 
    1 、INSERT(往数据表里插入记录的语句) 
    SQL> insert into 表名(字段名1, 字段名2, ……) values ( 值1, 值2, ……); 
    SQL> insert into 表名(字段名1, 字段名2, ……) select (字段名1, 字段名2, ……) 
    from 另外的表名 where 条件; 
    可以用&标记变量的方法多次输入记录

    快速插入数据的方法, 一般用于大于128M的数据转移 
    SQL> insert /*+ append */ into 表名 
    select * from 另外的用户名 .另外的表名 WHERE 条件; 
    SQL> commit;

    注意事项: 
    用INSERT /*+ APPEND */ 的方法会对target_tablename产生级别为6的独占锁, 
    如果运行此命令时还有对target_tablename的DML操作会排队在它后面, 
    对OLTP系统在用的表操作是不合适的。

    2. 插入字符串类型的字段的注意事项: 
    字符串类型的字段值必须用单引号括起来, 例如: ’GOOD DAY’ 
    如果字段值里包含单引号’ 需要进行字符串转换, 我们把它替换成两个 单引号’ ’ 
    字符串类型的字段值超过定义的长度会出错, 最好在插入前进行长度校验 
    ‘’ 标记是NULL, user 标明当前用户 
    日期字段的字段值可以用当前数据库的系统时间SYSDATE, 精确到秒 
    用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD’) 
    TO_DATE( )还有很多种日期格式, 可以参看ORACLE DOC. 
    年-月-日 小时:分钟:秒 的格式YYYY-MM-DD HH24:MI:SS 
    INSERT时最大可操作的字符串长度小于等于4000个单字节, 
    如果要插入更长的字符串, 请考虑字段用CLOB类型, 方法借用ORACLE里自带的DBMS_LOB程序包.

    3、UPDATE (修改数据表里记录的语句) 
    SQL> UPDATE 表名 SET 字段名1=值1, 字段名2=值2, …… WHERE 条件; 
    如果修改的值N没有赋值或定义时, 将把原来的记录内容清为NULL, 
    最好在修改前进行非空校验; 
    值N超过定义的长度会出错, 最好在插入前进行长度校验. 
    新功能,可以修改子查询后的结果集 
    例子:SQL> update (select * from s_dept) set id=50 where id=60;

    4、DELETE (删除数据表里记录的语句) 
    SQL> DELETE FROM 表名 WHERE 条件; 
    注意:删除记录并不能释放ORACLE里被占用的数据块表空间. 它只把那些 被删除的数据块标成unused. 
    如果确实要删除一个大表里的全部记录, 可以用 TRUNCATE 命令, 它可以释放占用的数据块表空间 
    SQL> TRUNCATE TABLE 表名; 
    此操作不可回退. 

    5、 SQL语句的分类 
    数据定义语言(DDL):create、alter、drop(创建、修改结构、删除)(其他:rename) 
    数据操纵语言(DML):insert、delete、select、update(增、删、查、改)(其他:truncate) 
    数据控制语言(DCL):grant、revoke(授权、回收)、set role 
    事务控制:commit、rollback、savepoint(其他:lock table、set constraint(s)、set transaction) 
    审计控制:audit、noaudit 
    系统控制:alter system 会话控制:alter session 
    其他语句:comment(添加注释)、explain plan、analyze、validate、call

    6、ORACLE里事务控制 
    Commit 提交事务 
    Rollback 回退事务 
    Savepoint 设置断点, 在事务中标记位置, 事务结束, 断点释放 
    事务结束的情况遇到commit或者rollback遇到DDL和DCL语句发现错误,如死锁用户退出SQL*PLUS系统重启或崩溃

    6、事物控制和SAVEPOINT命令

    7. DML操作的注意事项 
    以上SQL语句对表都加上了行级锁, 确认完成后, 必须加上事物处理结束的命令COMMIT 才能正式生效, 
    否则改变不一定写入数据库里.行级锁也未能得到释放. 
    如果想撤回这些操作, 可以用命令 ROLLBACK 复原. 
    在运行INSERT, DELETE 和 UPDATE 语句前最好估算一下可能操作的记录范围, 
    应该把它限定在较小 (一万条记录) 范围内,. 否则ORACLE处理这个事物用到很大的回退段. 
    程序响应慢甚至失去响应. 如果记录数上十万以上这些操作, 
    可以把这些SQL语句分段分次完成, 其间加上COMMIT 确认事物处理. 
    太过频繁的commit不好

    十二、改变表和约束条件 
    1. 改变表的几种情况(1) 运行时会加表级锁 
    改变表的名称 
    SQL> RENAME 表名1 TO 表名2; SQL> ALTER TABLE 表名1 RENAME TO 表名2; 
    在表的后面增加一个字段 
    SQL> ALTER TABLE 表名 ADD 字段名 字段名描述 [ DEFAULT expr ][ NOT NULL ][ ,字段名2 ……]; 
    修改表里字段的定义描述 
    SQL> ALTER TABLE 表名 MODIFY 字段名1 字段名1描述 [ DEFAULT expr ][ NOT NULL ][ ,字段名2 ……]; 记录为空时,可以减少字段长度,改变字段类型修改DEFAULT值只作用于修改后的INSERT和UPDATE的记录修改NOT NULL约束只对现存含非空记录的字段起作用

    1. 改变表的几种情况(2) 运行时会加表级锁 
    删除表里的某个字段 
    SQL> ALTER TABLE 表名 DROP 字段名; 
    给表里的字段加上/禁止/启用约束条件 
    SQL> ALTER TABLE 表名 ADD | DISABLE | ENABLE CONSTRAINT 约束名 PRIMARY KEY (字段名1[,字段名2 ……]); 
    SQL> ALTER TABLE 表名 ADD | DISABLE | ENABLE CONSTRAINT 约束名 UNIQUE (字段名1[,字段名2 ……]); 
    加唯一关键字或者唯一约束条件时自动建立索引 
    说明:禁止唯一关键字和唯一约束时索引仍然存在,可以被使用.

    1. 改变表的几种情况(3) 运行时会加表级锁 
    删除表里的约束条件 
    SQL> ALTER TABLE 表名 DROP CONSTRAINTS 约束名 [CASCADE]; 
    会把约束相关的索引一起删除. CASCADE能同时删去外键的约束条件. 
    把表放在或取出数据库的内存区 
    SQL> ALTER TABLE 表名 CACHE; 
    SQL> ALTER TABLE 表名 NOCACHE; 
    改变表存储的表空间 
    SQL> ALTER TABLE 表名 MOVE TABLESPACE 表空间名 ; 
    注意: 如果被转移表空间的表含有索引, 表转移后索引变得不可用. 
    我们要删除旧索引,建立新索引

    2. 删除表及表里的数据 
    删除表 
    SQL> DROP TABLE 表名 [CASCADE CONSTRAINTS]; 
    清空表里的记录 
    SQL> TRUNCATE TABLE 表名; 
    按时间清空日志表里的记录,使用重新命名的方法(应用程序可能有短暂出错, 可以选择在不繁忙的时间执行) 
    按原来表A的建表语句创建新表A1, 
    把表A重命名为A2(如果表A上有较频繁的DML操作,会对表加上行级锁,重命名过程用递归的方式循环做,直到DML操作结束,命名成功). 
    把创建新表A1重命名为A 
    历史记录表A2备份或删除

    3. 删除表后应该注意的问题 
    删除表后把表里的索引一起删去. 
    删除表后会结束基于它的悬而未决的事物 
    删除表后根据表创建的views,synonym,stored procedure,stored function依然存在,但views,synonym变成非法的. 需要手工找出它们并删除. 
    如果用了CASCADE CONSTRAINTS会把与它相关的约束一起删除 
    此操作不可回退

    4. 给表加注释 
    加注释的语法 
    SQL> COMMENT ON TABLE 表名 | COLUMN表名.字段名 IS ‘text‘ 
    加注释的例子 
    SQL> comment on table s_emp is ‘Enployee information‘; 
    SQL> comment on column s_emp.last_name is ‘‘; 
    关于注释的数据库字典 
    ALL_COL_COMMENTS 
    USER_COL_COMMENTS 
    ALL_TAB_COMMENTS 
    USER_TAB_COMMENTS

    十三、创建序列号 
    1. 创建序列号里各参数的解释 
    SQL> CREATE SEQUENCE name [INCREMENT BY n] 
    [START WITH n] [{MAXVALUE n | NOMAXVALUE}] 
    [{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}] 
    [{CACHE n | NOCACHE}] 
    INCREMENT BY n 一次增长n 个数字 
    NOMAXVALUE 缺省值10E+27 
    NOMINVALUE 缺省值1 
    NOCYCLE 不循环, 常用于唯一关键字 
    CACHE n 在内存里缓存n个序列,出错回退时会丢失 
    oracle8i里默认的n是20

    序列号的名称一般可以采用“表名_字段名”的命名规则

    2. 插入自动增长序列号字段的方法 
    INSERT时如果要用到从1开始自动增长的数字做唯一关键字, 应该先建立一个序列号. 
    CREATE SEQUENCE 序列号的名称 (最好是表名+序列号标记) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 NOCYCLE NOCACHE; 
    其中最大的值按字段的长度来定,比如定义的自动增长的序列NUMBER(6) , 最大值为999999 
    INSERT 语句插入这个字段值为: 序列号的名称.NEXTVAL 
    例子: SQL> insert into s_dept(id, name, region_id) values (s_dept_id.nextval, 'finance', 2); 
    1 row created. 
    只有运行了序列号的名称. nextval后序列号的名称. currval 才有效才有值.

    3. 查询序列号的情况 
    SQL> select sequence_name, min_value, max_value, increment_by, last_number from user_sequences; 
    其中last_number指的是序列号的下一个值.

    4. 改变序列号 
    SQL> ALTER SEQUENCE sequence [INCREMENT BY n] [{MAXVALUE n | NOMAXVALUE}] 
    [{MINVALUE n | NOMINVALUE}] 
    [{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}]; 
    注意: 不能改变它的起始值 
    如果要改变序列的起始值, 先把序列号删除掉, 再新建一个. 

    5. 删除序列号 
    SQL>DROP SEQUENCE sequence;

    6. 不能用序列号的nextval和currval的地方

    视图的查询 
    有distinct的查询 
    有group by,having,order by的查询 
    有子查询的查询 
    表里的缺省值

    十四、创建视图 
    1. 视图的概念和优点 
    视图是基于一个或多个表及视图的一些查询语句, 它象显示数据的视窗, 它本身是不存储数据的. 

    视图可以限制数据库的访问, 更好的控制权限 
    使用户使用简单的查询语句 
    数据的非依赖性 
    同一数据的不同表现形式

    2. 创建视图的语法 
    SQL> CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view[(alias[, alias]...)] 
    AS subquery 
    [WITH CHECK OPTION [CONSTRAINT constraint]] 
    [WITH READ ONLY] 
    参数解释: 
    FORCE 表不存在时,视图仍然可以创建成功 
    WITH CHECK OPTION 只有符合视图定义的记录才能被插入或修改 
    WITH READ ONLY 不允许DML操作

    Oracle8i以后创建视图可以用order by

    3. 创建修改视图的例子 
    SQL> CREATE OR REPLACE VIEW salvu41 AS SELECT id, first_name FIRST, 
    last_name LAST, salary MONTHLY_SALARY 
    FROM s_emp WHERE dept_id = 41; 
    SQL> CREATE VIEW dept_sum_vu (name, minsal, maxsal, avgsal) AS SELECT d.name, MIN(e.salary), MAX(e.salary), AVG(e.salary) FROM s_emp e, s_dept d WHERE e.dept_id = d.id GROUP BY d.name; 
    注意: 如果用select * from table_name创建的视图 
    table_name的结构改变后 view要重建或compile后才能显示新的字段内容

    4. 查询视图的数据字典 
    SQL> set long 1600; 
    SQL> select view_name,text from user_views; 
    说明: 可以根据视图text_length来设置set long 数字; 
    User_updatable_columns视图能查询视图里能被修改的字段

    5. 简单和复杂的视图对比 
    特 性 简单视图 复杂视图 
    表的数量 一个 多个 
    有函数吗? 没有 有 
    有分组操作吗? 没有 有 
    有基于视图的DML操作吗? 有 没有

    6. 在视图上可以用DML命令吗? 
    可以, 但有一定的限制条件 
    没有下面的情况, 可以删除view里的记录. group function, group by, distinct 
    没有上面和下面的情况, 可以修改view里的记录. 字段表达式, 
    例如: salary*12 含rownum的view 
    没有上面两种情况, 且view里含基表里所有非空字段的情况, 可以往view里插入记录. 

    7. 在视图里使用 WITH CHECK OPTION约束条件 
    SQL> create or replace view empvu41 
    as select * from s_emp where dept_id = 41 
    with check option constraint empvu41_ck; 
    如果运行下面命令会出错ora-01402 
    SQL> update empvu41 set dept_id=42 where id=16; 
    原因: 视图empvu41里规定只能看部门号为41的记录 修改后会把记录排除在视图empvu41以外 
    与它的约束条件冲突

    8. 删除视图 
    SQL> DROP VIEW view_name;

    十五、创建索引

    1.索引的概念 
    索引是数据库里的一种数据对象 
    它利用B*树, hash, bitmap结构直接快速地访问数据 
    它和表是分开存放的两个实体 
    索引创建好了后, 由系统自动调用和管理

    2. 什么时候创建索引? 
    自动创建的索引:唯一关键字, 唯一的约束条件 
    手工需要创建的索引:大表查询时, sql语句where后经常用到的字段或字段组合 
    字段内容差别很大有大量NULL值表很大, 返回记录数较少

    3. B*树索引的结构 每个索引由字段值和指针或ROWID组成

    4.创建索引的语法 
    CREATE INDEX 索引名 ON 表名 ( 字段1, [字段2, ……] ) TABLESPACE 表空间名;

    5.创建索引的注意事项 
    创建索引时会加行级独占锁 
    一个表的索引最好不要超过三个 (特殊的大表除外) 
    最好用单字段索引 
    索引最好和表分不同的表空间存放 
    结合SQL语句的分析执行情况, 也可以建立多字段的组合索引和基于函数的索引 
    大表的索引会占用很大的存储空间 
    不要建唯一的索引, 而应该加唯一的约束条件

    6.查询索引的方法 
    查询数据字典user_indexes和user_ind_columns

    例子: 
    SQL> SELECT ic.index_name, ic.column_name, 
    2 ic.column_position col_pos,ix.uniqueness 
    3 FROM user_indexes ix, user_ind_columns ic 
    4 WHERE ic.index_name = ix.index_name 
    5 AND ic.table_name = 'S_EMP';

    注意: 数据字典里存放的字符都是大写的.

    7. 不用索引的地方 
    表很小 
    where后不经常使用的比较字段 
    表被频繁修改 
    返回记录数很多 
    where后含IS NULL /IS NOT NULL/ like ‘%输入符%’等条件

    8. 重建索引的语法 
    ALTER INDEX 索引名 REBUILD TABLESPACE 原来表空间名 NOLOGGING; 
    定期重建索引可以减少索引的碎片, 更有效地使用表空间.

    9. 删除索引 
    SQL> drop index 索引名; 
    SQL> alter table 表名 drop constraint 约束名;

    十六、控制用户访问 
    1.权限的类别 
    系统级权限: 针对整个系统操作的权限 
    如: 用户名/密码, 使用表空间的限额等 
    对象级权限: 针对某个具体object操作的权限 
    如: 针对某个表, 视图, 表的某个字段的select, update, delete权限 
    2. 查看当前数据库的用户信息 
    SQL>select username,default_tablespace,temporary_tablespace from dba_users; 
    查看在线用户信息 
    SQL>select count(*) “number”,username “current username” from v$session group by username; 用户查看自己的缺省表空间SQL>select username,default_tablespace from user_users;

    3. 创建新用户 
    SQL> create user username identified by password 
    default tablespace tablespace_name temporary tablespace temp 
    quota unlimited on tablespace_name 
    quota 1k on system 
    [quota 1k on other_tablespace_name ……] ; 
    给用户赋权限 
    SQL> grant connect, resource to username; 
    查看当前用户的权限角色 
    SQL> select * from user_role_privs; 
    查看当前用户的系统权限和表级权限 
    SQL> select * from user_sys_privs;SQL> select * from user_tab_privs;

    4 、常用的角色及其权限 
    CONNECT 8 privs 连上Oracle,做最基本操作 
    RESOURCE 8 privs 具有程序开发最的权限 
    DBA 114 privs 数据库管理员所有权限 
    EXP_FULL_DATABASE 5 privs 数据库整个备份输出的权限 
    IMP_FULL_DATABASE 64 privs 数据库整个备份输入的权限 
    查看角色明细的系统权限 
    SQL> select * from role_sys_privs;

    5、改变老用户 可以改变老用户的密码, 缺省表空间, 临时表空间, 空间限额. 
    SQL> alter user username identified by password 
    default tablespace tablespace_name 
    temporary tablespace temp 
    quota unlimited on tablespace_name 
    quota 1k on system 
    [quota 1k on other_tablespace_name ……] ; 
    撤销用户的角色或权限 
    SQL> revoke role_name or priv_name from username; 
    注意事项 
    撤消用户的角色dba时, 同时撤消了用户unlimited tablespace的系统权限, 切记要再次赋予resource角色给此用户 
    SQL> grant resource to username;

    6、删除用户 
    如果用户下没有任何数据对象 
    SQL> drop user username; 
    如果用户下有数据对象 
    SQL> drop user username cascade; 
    注意事项 
    如果用户下有含clob,blob字段的表, 应该先删除这些表后,才能用cascade选项完全删除.

    7、角色的概念和管理 
    角色是命名多个相关权限的组合. 能把它赋于其它的用户或角色我们能创建角色, 使权限管理更容易一些.

    8、赋于系统的权限语法和例子 
    语法: 
    SQL> GRANT sys_priv TO {user|role|PUBLIC} [WITH ADMIN OPTION]; 
    例子: 
    SQL> GRANT create session TO sue, rich; 
    SQL> GRANT create table To scott, manager;

    注意: 如果用WITH ADMIN OPTION通过中间用户赋于的系统权限 中间用户删除后, 系统权限仍然存在.

    9、赋于数据对象级的权限语法和例子 
    语法: 
    SQL> GRANT object_priv [(columns)] ON object TO {user|role|PUBLIC} [WITH GRANT OPTION]; 
    例子: 
    SQL> GRANT select ON s_emp TO sue, rich; 
    SQL> GRANT update (name, region_id) 
    ON s_dept TO scott, manager;

    注意: 如果用WITH GRANT OPTION通过中间用户赋于的对象权限 中间用户删除后,对象权限就不存在了.

    展开全文
  • oracle中,有4个大对象(lobs)类型可用,分别是blob,clob,bfile,nclob。 下面是对lob数据类型的简单介绍。 blob:二进制lob,为二进制数据,最长可达4GB,存贮在数据库中。 clob:字符lob,字符数据,最长可以达到...
     
    
    在oracle中,有4个大对象(lobs)类型可用,分别是blob,clob,bfile,nclob。
      下面是对lob数据类型的简单介绍。
       blob:二进制lob,为二进制数据,最长可达4GB,存贮在数据库中。
       clob:字符lob,字符数据,最长可以达到4GB,存贮在数据库中。
       bfile:二进制文件;存贮在数据库之外的只读型二进制数据,最大长度由操作系统限制。
       nclob:支持对字节字符集合(nultibyte characterset)的一个clob列。
      对于如何检索和操作这些lob数据一直是oracle数据库开发者经常碰到的问题。下面我将在oracle对lob数据处理的一些方法和技巧,介绍给读者,希望能够对读者以后的开发有所帮助。
      
      oracle中可以用多种方法来检索或操作lob数据。通常的处理方法是通过dbms_lob包。
      其他的方法包括使用api(application programminginterfaces)应用程序接口和oci(oracle call interface)oracle调用接口程序。
      一、在oracle开发环境中我们可以用dbms_lob包来处理!dbms_lob包功能强大,简单应用。既可以用来读取内部的lob对象,也可以用来处理bfile对象。但处理两者之间,还有一点差别。处理内部lob对象(blob,clob)时,可以进行读和写,但处理外部lob对象bfile时,只能进行读操作,写的操作可以用pl/sql处理。另外用sql也可以处理lob,但要注意sql仅可以处理整个lob,不能操作lob的数据片。
      
      在dbms_lob包中内建了read(),append,write(),erase(),copy(),getlength(),substr()等函数,可以很方便地操作lob对象。这里不做深入讨论,读者可以参看相关的书籍。
      
      对于pl/sql,下面介绍一种技巧,用动态的pl/sql语句处理clob对象来传替表名!
      example 1.
      动态PL/SQL,对CLOB字段操作可传递表名table_name,表的唯一标志字段名field_id,clob字段名field_name记录号v_id,开始处理字符的位置v_pos,传入的字符串变量v_clob
      
      修改CLOB的PL/SQL过程:updateclob
      create or replace procedure updateclob(
      table_name in varchar2,
      field_id in varchar2,
      field_name in varchar2,v_id in number,
      v_pos in number,
      v_clob in varchar2)
      is
      lobloc clob;
      c_clob varchar2(32767);
      amt binary_integer;
      pos binary_integer;
      query_str varchar2(1000);
      begin
      pos:=v_pos*32766+1;
      amt := length(v_clob);
      c_clob:=v_clob;
      query_str :='select '||field_name||'from '||table_name||'
      where '||field_id||'= :id for update ';
      --initialize buffer with data to be inserted or updated
      EXECUTE IMMEDIATE query_str INTO lobloc USING v_id;
      --from pos position, write 32766 varchar2 into lobloc
      dbms_lob.write(lobloc, amt, pos, c_clob);
      commit;
      exception
      when others then
      rollback;
      end;
      l /用法说明:
      在插入或修改以前,先把其它字段插入或修改,CLOB字段设置为空empty_clob(),
      然后调用以上的过程插入大于2048到32766个字符。
      如果需要插入大于32767个字符,编一个循环即可解决问题。
      查询CLOB的PL/SQL函数:getclob
      create or replace function getclob(
      table_name in varchar2,
      field_id in varchar2,
      field_name in varchar2,
      v_id in number,
      v_pos in number) return varchar2
      is
      lobloc clob;
      buffer varchar2(32767);
      amount number := 2000;
      offset number := 1;
      query_str varchar2(1000);
      begin
      query_str :='select '||field_name||' from '||table_name||'
      where '||field_id||'= :id ';
      --initialize buffer with data to be found
      EXECUTE IMMEDIATE query_str INTO lobloc USING v_id;
      offset:=offset+(v_pos-1)*2000;
      --read 2000 varchar2 from the buffer
      dbms_lob.read(lobloc,amount,offset,buffer);
      return buffer;
      exception
      when no_data_found then
      return buffer;
      end;
      l 用法说明:
      用select getclob(table_name,field_id,field_name,v_id,v_pos) as
      partstr from dual;
      可以从CLOB字段中取2000个字符到partstr中,
      编一个循环可以把partstr组合成dbms_lob.getlength(field_name)长度的目标字符串。
    
    ---------------------------------------------------------------------------------------------------------------------------------
    

    13-4 Lob类型          13.4.1 基本介绍          Oracle和plsql都支持lob(large object) 类型,用来存储大数量数据,如图像文件,声音文件等。Oracle 9i realse2支持存储最大为4g的数据,oracle 10g realse1支持最大8到128万亿字节的数据存储,依赖于你的db的block size。          在plsql中可以申明的lob类型的变量如下:  类型        描述  BFILE        二进制文件,存储在数据库外的操作系统文件,只读的。把此文件当二进制处理。  BLOB        二进制大对象。存储在数据库里的大对象,一般是图像声音等文件。  CLOB        字符型大对象。一般存储大数量文本信息。存储单字节,固定宽度的数据。  NCLOB        字节字符大对象。存储单字节大块,多字节固定宽度,多字节变宽度数据。  Oracle将lob分类为两种:  1.存储在数据库里的,参与数据库的事务。BLOB,CLOB,NCCLOB。  2.存储在数据库外的BFILE,不参与数据库的事务,也就是不能rollback或commit等,它依赖于文件系统的数据完整性。  LONG和LONG RAW这两种数据类型也是存储字符的,但是有系列的问题,不建议使用,这里也就不讨论了。  13.4.2 LOB的使用  本部分不讨论lob的所有细节,只讨论lob的基本原理和在plsql中的基本使用,为plsql开发使用lob提供一个基础性指导。  本部分使用的表是:  /**  table script  **/  CREATE TABLE waterfalls (         falls_name VARCHAR2(80),--name         falls_photo BLOB,--照片         falls_directions CLOB,--文字         falls_description NCLOB,--文字         falls_web_page BFILE);--指向外部的html页面  /                这个表我们并不需要clob和nclob两个,只取一就可以,这里全部定义只是为了演示使用。  1.        理解LOB的Locator  表中的Lob类型的列中存储的只是存储指向数据库中实际存储lob数据的一个指针。  在plsql中申明了一个lob类型的变量,然后从数据库中查询一个lob类型的值分配给变量,也只是将指针复制给了它,那么这个变量也会指向数据库中实际存放lob数据的地方。如:  --understanding lob locators    DECLARE         photo BLOB;      BEGIN         SELECT falls_photo           INTO photo           FROM waterfalls          WHERE falls_name='Dryer Hose';  见下图:  Lob工作原理图解          从上面的图可以看出,要处理lob数据,必须先获得lob locators。我们可以通过一个select语句获取,当赋值给lob变量的时候,它也获得同样的lob locators。我们在plsql中处理可以使用dbms_lob包,里面内置了很多过程和函数来读取和修改我们的lob数据。下面给出处理lob数据的一般方法。  1.        通过select语句获取一个lob locator。  2.        通过调用dbms_lob.open打开lob。  3.        调用dbms_lob.getchunksize获得最佳读写lob值。  4.        调用dbms_lob.getlength获取lob数据的字节值。  5.        调用dbms_lob.read获取lob数据。  6.        调用dbms_lob.close关闭lob。         2.        Empty lob and Null lob  Empty的意思是我们已经获取了一个lob locator,但是没有指向任何lob数据。Null是定义了一个变量,但是没有获得lob locator。对lob类型的处理和其他类型不一样。如下面的例子:  /* null lob example*/  declare         directions clob;--定义了,但是没有分配值,为null         begin             if directions is null then                dbms_output.put_line('directions is null');             else                dbms_output.put_line('directions is not null');             end if;               end;  /  DECLARE         directions CLOB;--定义一个,并且分配值      BEGIN         --删除一行         DELETE           FROM waterfalls          WHERE falls_name='Munising Falls';         --插入一行通过使用 EMPTY_CLOB(  ) to 建立一个lob locator         INSERT INTO waterfalls                   (falls_name,falls_directions)            VALUES ('Munising Falls',EMPTY_CLOB(  ));         --获得lob locator,上面插入的数据,因为我们插入的是一个empty_clob(),那么lob locator不指向任何数据,虽然给变量分配了只        SELECT falls_directions          INTO directions          FROM waterfalls         WHERE falls_name='Munising Falls';        IF directions IS NULL THEN           DBMS_OUTPUT.PUT_LINE('directions is NULL');        ELSE           DBMS_OUTPUT.PUT_LINE('directions is not NULL');--打印此句        END IF;        DBMS_OUTPUT.PUT_LINE('Length = '                             || DBMS_LOB.GETLENGTH(directions));--结果为o     END;  注意:  1.        上面例子中的empty_clob()是oracle的内置函数,创建了一个lob locator。但是我们没有让它指向任何数据,所以是empty。而且通过select语句给变量directions分配了lob locator,所以不是null,但是length为0,故为empty。  2.        在基本类型中,我们判断一个变量是不是有数据,只要is null就可以了。但是在lob类型中我们从以上的例子看出来是不正确的。Lob首先必须判断is null看是否分配lob locator,如果分配了还需要进一步检查length是否为0,看是否是empty,所以完整的是下面这样:  IF some_clob IS NULL THEN        --如果is null为true表示未分配,肯定没有数据     ELSEIF DBMS_LOB.GETLENGTH(some_clob) = 0 THEN        --分配了length为0,也没有数据     ELSE        --有数据     END IF;  3.建立LOB          在上面我们使用empty_clob()建立了一个空的clob,lob locator只是一个指针,真正的数据是存储在磁盘中或数据库文件中。我们先建立一个空的clob,然后我们可以update来让变量真正指向有数据的lob。Empty_clob()可以用来处理clob和nclob。在oracle 8i中可以使用temporary lob达到同样的效果。

     

    4.向LOB里写入数据          当获得一个有效的lob locator之后,就可以使用dbms_lob包的下列procedure向lob中写入数据。          DBMS_LOB.WRITE:允许自动写入数据到lob中。          DBMS_LOB.WRITEAPPEND:向lob的末尾写入数据。  --write lob  DECLARE         directions CLOB;         amount BINARY_INTEGER;         offset INTEGER;         first_direction VARCHAR2(100);         more_directions VARCHAR2(500);      BEGIN         --Delete any existing rows for 'Munising Falls' so that this         --example can be executed multiple times         DELETE           FROM waterfalls          WHERE falls_name='Munising Falls';         --Insert a new row using EMPTY_CLOB(  ) to create a LOB locator         INSERT INTO waterfalls                   (falls_name,falls_directions)            VALUES ('Munising Falls',EMPTY_CLOB(  ));         --Retrieve the LOB locator created by the previous INSERT statement         SELECT falls_directions           INTO directions           FROM waterfalls          WHERE falls_name='Munising Falls';         --Open the LOB; not strictly necessary, but best to open/close LOBs.         DBMS_LOB.OPEN(directions, DBMS_LOB.LOB_READWRITE);         --Use DBMS_LOB.WRITE to begin         first_direction := 'Follow I-75 across the Mackinac Bridge.';         amount := LENGTH(first_direction);  --number of characters to write         offset := 1; --begin writing to the first character of the CLOB         DBMS_LOB.WRITE(directions, amount, offset, first_direction);         --Add some more directions using DBMS_LOB.WRITEAPPEND         more_directions := ' Take US-2 west from St. Ignace to Blaney Park.'                         || ' Turn north on M-77 and drive to Seney.'                         || ' From Seney, take M-28 west to Munising.';         DBMS_LOB.WRITEAPPEND(directions,                              LENGTH(more_directions), more_directions);         --Add yet more directions         more_directions := ' In front of the paper mill, turn right on H-58.'                         || ' Follow H-58 to Washington Street. Veer left onto'                         || ' Washington Street. You''ll find the Munising'                         || ' Falls visitor center across from the hospital at'                         || ' the point where Washington Street becomes'                         || ' Sand Point Road.';         DBMS_LOB.WRITEAPPEND(directions,                              LENGTH(more_directions), more_directions);         --Close the LOB, and we are done.         DBMS_LOB.CLOSE(directions);      END;  /  在这个例子里,我们使用了write 和writeappend这两个过程来插入数据到lob中。因为开始的时候,我们插入了一个空的lob locator。要注意一点,我们最后使用了dbms_lob.close方法关闭lob。这是一个好的方法,特别是在处理oracle text的时候,任何oracle text domain和function-based indexes被update是在wirte和writeappend的时候调用的,而不是在close的时候被update的。         我们向lob中写入数据的时候,没有必要更新表中的列。因为它保存的只是一个locator,我们的变量也获得同样的locator,当我们写入数据去lob的时候,locator并没有改变。改变的只是locator指向的物理数据。  在sqlplus中显示上面的例子:          SQL> SET LONG 2000                 SQL> COLUMN falls_directions WORD_WRAPPED FORMAT A70      SQL> SELECT falls_directions        2  FROM waterfalls        3  WHERE falls_name='Munising Falls';  其中set long 2000是显示2000个字符。Word_wrappend是自动换行。  5.从lob中读取数据    步骤:a.通过select查询获得lob locator初始化lob变量。2.调用dbms_lob.read过程读取lob数据。  下面是dbms_lob.read过程的定义,注意参数.    PROCEDURE read(lob_loc IN            BLOB,  --初始化后的lob变量lob locator                  amount  IN OUT NOCOPY INTEGER,--读取的数量(clob为字符数,blob,bfile是字节数)                  offset  IN            INTEGER,--开始读取位置                  buffer  OUT           RAW);--读到的数据,raw要显示用转换函数,见bfile  PROCEDURE read(lob_loc IN            CLOB     CHARACTER SET ANY_CS,                  amount  IN OUT NOCOPY INTEGER,                  offset  IN            INTEGER,                  buffer  OUT           VARCHAR2 CHARACTER SET lob_loc%CHARSET);    PROCEDURE read(file_loc IN             BFILE,                   amount   IN OUT NOCOPY  INTEGER,                   offset   IN             INTEGER,                   buffer   OUT            RAW);  下面是一个读取clob的例子:  --从lob中读取数据  DECLARE         directions CLOB;         directions_1 VARCHAR2(300);         directions_2 VARCHAR2(300);         chars_read_1 BINARY_INTEGER;         chars_read_2 BINARY_INTEGER;         offset INTEGER;      BEGIN         --首先获得一个lob locator         SELECT falls_directions           INTO directions           FROM waterfalls          WHERE falls_name='Munising Falls';         --记录开始读取位置         offset := 1;         --尝试读取229个字符,chars_read_1将被实际读取的字符数更新         chars_read_1 := 229;         DBMS_LOB.READ(directions, chars_read_1, offset, directions_1);         --当读取229个字符之后,更新offset,再读取225个字符         IF chars_read_1 = 229 THEN            offset := offset + chars_read_1;--offset变为offset+chars_read_1,也就是从300开始            chars_read_2 := 255;            DBMS_LOB.READ(directions, chars_read_2, offset, directions_2);         ELSE            chars_read_2 := 0;--否则后面不在读取            directions_2 := '';         END IF;         --显示读取的字符数         DBMS_OUTPUT.PUT_LINE('Characters read = ' ||                             TO_CHAR(chars_read_1+chars_read_2));        --显示结果        DBMS_OUTPUT.PUT_LINE(directions_1);        dbms_output.put_line(length(directions_1));        DBMS_OUTPUT.PUT_LINE(directions_2);        dbms_output.put_line(length(directions_2));     END;     /  Dbms_lob.read的第2个参数是传递要读取的数量。对于clob是字符数,blob和bfile都是字节数。它是随着读取的数目自动更新的,offset不会更新。所以分布读取需要手动更新offset,下个offset是上一个offset+读取的数量。我们可以通过dbms_lob.get_length(lob_locator)获得这个lob的长度,结果clob是字符数,blob和bfile是字节数,然后分布读取。  13.4.3 使用Bfile          Bfile和clob,nclob,blob是不同的。Bfile是外部的lob类型,其他三个是oracle内部的lob类型,它们至少有三点主要不同的地方:  1.        bfile的值是存在操作系统的文件中,而不是数据库中。  2.        bfile不参与数据库事务操作。也就是改变bifle不能commit或rollback。但是改变bfile的locator可以commit或rollback。  3.        bfile在plsql和oracle中是只读的,不允许写。你必须生成一个外部的操作系统文件让bfile locator能够完全指向它。  在plsql中使用bifle,仍然需要lob locator,只不过是一个目录和文件的别名,你可以使用biflename函数获得一个bfile locator。使用create or replace directory [alias] as ‘file locator directory’,你必须具有CREATE ANY DIRECTORY权限才能使用。如:  CREATE DIRECTORY bfile_data AS 'c:PLSQL BookCh12_Misc_Datatypes';      GRANT READ ON DIRECTORY bfile_data TO gennick;  --读的权限给这个用户。  通过all_directory查找目录信息。

    展开全文
  • Oracle 用户概念与基本操作

    千次阅读 2016-06-05 12:22:42
    oracle中,可以对用户的各种安全参数进行控制,以维护数据库的安全性,这些概念包括模式(schema)、权限、角色、存储设置、空间限额、存取资源限制、数据库审计等。每个用户都有一个口令,使用正确的username/...
  • Oracle 数据库的打开与关闭

    千次阅读 2017-04-22 17:14:04
    打开oracle 数据库三个阶段,nomount启动数据库实例,未加载数据库状态;mount启动数据库实例并加载数据库;open状态,打开数据库。   Nomout状态: 从参数文件中启动实例,但并没有加载打开数据库。所以,在...
  • oracle数据库中的大对象

    千次阅读 2013-12-12 14:29:36
    整理自丁俊老师plsql文档: 1、基本介绍 oracle和pl/sql都支持lob(large object)类型,用来存储大数量数据,如图像文件,声音文件等。oracle 10g r1 支持最大8 ...BFILE :二进制文件,存储在数据库外的操作系统
  • C# Oracle数据库连接及操作

    千次阅读 2016-12-29 18:53:39
    壹、ORACLE817安装(服务器端/客户端)... 1 贰、ORACLE817配置(服务器端)...... 叁、ORACLE817配置(客户端)......肆、安装的oracle8i怎么全部卸载......伍、Oracle数据库体系结构...捌、一个C#操作Oracle的通用类... ...
  • Oracle 登录-用户操作

    千次阅读 2018-04-19 21:25:13
    Oracle命令(一):Oracle登录命令1、运行SQLPLUS工具 C:\Users\wd-pc&gt;sqlplus2、直接进入SQLPLUS命令提示符 C:\Users\wd-pc&gt;sqlplus /nolog3、以OS身份连接 C:\Users\wd-pc&gt;sqlplus / as ...
  • Oracle数据库数据对象分析--入门必读

    千次阅读 2007-06-12 14:37:00
    对数据库的操作可以基本归结为对数据对象操作,理解和掌握Oracle数据库对象是学习Oracle的捷径。 表和视图 Oracle中表是数据存储的基本结构。ORACLE8引入了分区表和对象表,ORACLE8i引入了临时表,使表的功能更...
  • oracle基本操作

    千次阅读 2016-03-07 17:56:06
    用户创建,创建对应的方案 方案里面有数据对象(表,触发器,视图...) sys 系统管理员权限(sysdba) 数据字典的基表和动态视图在sys里面 system 数据库管理员权限(dba) 次一级的内部数据 管理用数据 创建...
  • Oracle-Oracle数据库结构

    万次阅读 2017-06-02 13:16:32
    再谈Oracle数据库结构之前写了一篇文章《Oracle-知识结构漫谈》 粗略的介绍了Oracle数据库接口,在这里再更加详细的描述一下,当做是对原有知识的巩固,温故知新。Oracle体系结构数据库的体系结构是从某一个角度来...
  • oracle sql developer 如何同时打开多张表: 步骤: 1.打开oracle sql developer 2.“工具”---->"首选项(p)"---->"数据库"------>"对象查看器"---->选中“自动冻结对象查看器窗口(A)” 如下图...
  • ORACLE基本操作语句

    万次阅读 2016-08-12 16:55:49
    ORACLE 数据库       1.简单的表操作   创建一个简单的表 create table student( name varchar2(20), age number(3) );   插入新记录 insert into student values('Tom', 18); insert into ...
  • Oracle Spatial基本操作

    千次阅读 2009-05-16 22:56:00
    Oracle Spatial主要通过元数据表、空间数据字段(即sdo_Geometry字段)和空间索引来管理空间数据,并在此基础上提供一系列空间查询和空间分析的程序包,让用户进行更深层次的GIS应用开发。Oracle Spatial使用空间...
  • PHP 5 数据对象 (PDO) 抽象层与 Oracle作者:Wez Furlong 来源:Oracle 网站一名新 PHP 数据对象 (PDO) 数据抽象层的原始开发人员为您简要介绍该抽象层,重点讲述与 Oracle 一起运行的情况。 需要 PHP:5.0需要其他:...
  • oracle控制台基本操作大全

    千次阅读 2016-06-30 11:56:29
    oracle常用数据字典,oracle10增加了不少数据字典10g r1 有1713个,r2有1870个: 1 基本的数据字典: DBA_TABLES 所有用户的所有表的信息; DBA_TAB_COLUMNS 所有用户的表的列(字段)信息; DBA_VIEWS 所有...
  • Oracle命令行操作Oracle管理用户以及角色权限 说明: 1.SQL语言大小写敏感。 2.SQL可以写在一行或者多行(使用最后要以分号结尾,表示一条SQL语句)。 3.关键字能被缩写也能分行。 如无特别说明,[]中...
  • oracle表空间操作详解

    千次阅读 2012-11-05 20:08:14
    oracle表空间操作详解 (2012-04-15 19:47) 分类: Oracle 1.创建表空间: create tablespace datafile '' size filesize autoextend on next maxsize eg: create tablespace sales datafile 'c:\1...
  • Oracle语言

    千次阅读 2008-07-29 21:13:00
    一、Oracle语言 Oracle 数据库系统使用经验 1.having 子句的用法 having 子句对 group by 子句所确定的行组进行控制 ,having 子句条件中只允许涉及常量 , 聚组函数或 group by 子句中的列 . 2. 外部联接 "+" 的...
  • Oracle基础之Oracle的体系结构

    千次阅读 2015-10-31 16:43:06
    一、Oracle体系结构概述:  Oracle的体系结构是指数据库的组成、工作过程与原理,以及数据在数据库中的组织与管理机制。要了解Oracle数据库的体系结构,必须理解Oracle系统的重要概念和主要组件。  Oracle系统...
  • Oracle常用sql操作总结

    千次阅读 2012-03-16 16:27:39
    有外连接, 能用OR或IN的比较操作 4. 如何分析和执行SQL语句 写多表连接SQL语句要知道它的分析执行计划的情况. Sys用户下运行@/ORACLE_HOME/sqlplus/admin/plustrce.sql 产生plustrace角色 ...
  • oracle基本结构

    千次阅读 2017-03-03 20:45:46
     图2.1.1 Oracle 应用C/S结构当客户机需要服务器的数据,可以通过连接服务器来获取。客户机向服务器发送SQL数据库请求,服务器接受并执行传送给它的SQL语句,然后把执行结果和产生的消息文本返
  • oracle存储过程,集合对象处理

    千次阅读 2016-05-13 16:36:24
    我们在进行pl/sql编程打交道最多的就是存储过程了。存储过程的结构是非常的简单的,我们在这里除了学习存储过程的基本结构外,还会学习编写存储过程相关的一些实用的知识。如:游标的处理,异常的处理,集合的...
  • 通过OCCI操作Oracle数据库详解

    千次阅读 2017-03-31 12:34:32
     在Windows下访问Oracle数据库可以使用ADO,ADO.NET,OLEDB,ODBC,跨平台的OCCI等方法,其中速度最快,对Oracle支持最完整的是Oracle提供的OCCI.  2.安装OCCI SDK  OCCI SDK包含在Oracle客户端中,在如下位置可以找
  • 148.Oracle数据库SQL开发之 大对象——在PLSQL中使用大对象 欢迎转载,转载请标明出处: 使用ORALCE数据自自带的DBMS_LOB包中的方法来使用LOB。 关于DBMS_LOB中的所有方法,可以查询《OracleDatabase PL/SQL ...
  • Oracle 数据库实例介绍

    万次阅读 多人点赞 2018-11-23 15:44:13
    本章介绍 Oracle 数据库实例的原理,实例的参数文件和诊断文件,以及实例创建和数据库的打开与关闭的过程。
  • oracle数据库opatch补丁操作流程

    千次阅读 2016-10-21 11:16:38
    Oracle数据库安全补丁升级流程 目录 一、升级前准备工作... 2 1、  确认数据库版本... 2 2、  查询补丁安装信息... 2 3、  补丁类型... 2 4、  查询补丁信息... 2 5、  补丁下载... 3 6、  数据库备份工作... ...
  • oracle 9i 和oracle 10g 和oracle 11g区别

    千次阅读 2012-09-19 09:23:24
    oracle 9i 和oracle 10g 和oracle 11g有什么区别??    简要说:  9i更易于管理。 详细说:  并发集群,8i OPS升级为9i RAC,8i结点间用硬盘交换信息,9i结点间采用高速网线的缓存熔合(Cache Fu
  • oracle笔记

    万次阅读 2020-09-04 09:30:38
    【1】cmd命令登录 【2】创建表空间 【3】exp导出数据 【4】解决 Oracle11g使用exp导出空表 ...【13】UNPIVOT操作,列转行 【14】CentOS6.5 安装oracle 【15】函数 【16】同义词 【17】视图 【18】时间轴sql 【19】命

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 43,775
精华内容 17,510
关键字:

oracle对象打开时不允许操作