SQL入门到精通

1.help index     help set(查看set的可选项)    help column                user_tables视图很重要
2.set sqlblanklines on
3.select * from dept where deptno=20;
   select * from dept where deptno=&t;
4.list 或 l 看输入语句信息
5.c/fron/from
6.del 2 3 4
7.save d:\backup\test.txt                 @d:\backup\test.txt            get d:\backup\test.txt
8.edit                      (编辑上一条的命令)  还有  ED   (系统的默认编辑器)
9.col deptno HEADING "编号";                 col bytes format 999,999,999
10.desc dept;          (查看一个表的结构)
11.break on publish;           (相同出版社的进行分类)comp count label  "计数" of  books_name  ON publish;
12.把执行命令和结果 一起保存到TXT文件中  spool d:\backup\spool.txt     select * from books; spool off;
spool /usr/app/plsq_test.prn    select * from books; spool off;
                                                                            ORACLE数据类型
1.数值类型
number:没有规定精度或范围的数值就是number(38)
number(9,2):9个数字长度,小数点左边最多7个,右边最多两个
number(3):3位数的整数
2.字符类型
char  ,nchar,varchar2,nvarchar2,raw,long,long raw,大对象。
2.1大对象
  lob:每种类型的LOB都可以存储4GB的数据。在ORACLE中可以使用dbms_lob程序包来处理lob对象。
2.2  lob类型
 LOB包括:blob,clob,nclob,bfile等类型。BLOB是二进制对象,用于存储图像,音频,视频等数据。

 

                                                                            SQL(structured query language)语言基础
一.
1.数据定义语言DDL
   CREATE   ALTER    DROP
    create table abc (a varchar2(10),b char(10));
    alter table abc add c number;
    drop table abc;
   drop user scan;
    alter table abc drop column c;
    create table ttt as (select * from e);
    alter user scan DEFAULT TABLESPACE SCAN;
    alter user scan identified by scan;
    alter user scan ACCOUNT LOCK;    (锁定帐号)
使用替换变量插入数据:
  insert into d values(&id,&name);


1)
set VERIFY OFF
select product_name from tablename where quantity>=&minimum_quantity_sold;
set VERIFY ON

set VERIFY OFF
select product_name from tablename where purchase_date='&date_you_want_to_select';
set VERIFY ON
2)
ACCEPT 命令
ACCEPT variable_name PROMPT 'prompt_text'

set verify off
set echo  off
accept v_earliest_date prompt 'earliest date ?(dd-mm-yy): '
accept v_latest_date prompt 'thank you latest date ? (dd-mm-yy): '
select product_name,quantity from tablename where purchase_date between '&v_earliest_date' and '&v_latest_date'
order by quantity asc;
set verify on
set echo on
2.数据控制 语言DCL
   GRANT REVOKE
   grant connect ,resource to scan;
      grant select on abc to scan;
     revoke grant on abc from scan;                 (撤消权限)
    GRANT ALL ON e TO scan WITH GRANT OPTION;
    grant execute on  e  TO scan;
    grant create user to scan;
3.数据操作语言
   SELECT   INSERT  DELETE   UPDATE
    insert into abc(a,b) values ('cde','www');
    update abc set b='ttt';            update abc set b='www' where a='abc';
    delete from abc where a='abc';
    delete from abc;
二.常用系统函数
单行函数
1)系统变量
sysdate systimestamp current_date  current_timestamp user userenv
select userenv('terminal') from dual;(显示计算机的名称)
2)数字函数
round :将数字四舍五入到指定的精度。 round(input_value,decimal_places_of_pricision)
round(1234.5678,3)=1234.568    round(1234.5678,0)=1235   round(1234.5678,-1)=1230
trunc:截取数字的精确度
trunc(1234.5678,3)=1234.567
3)文本函数
upper(全大写)  lower(全小写)   initcap(开始字母大写)
length(数据长度)      substr(source_text,starting_character_position,number_of_characters)
instr(source_text,text_to_locate,starting_character_position)  can. small   '.'   4
select item_desc
          substr(item_desc,1,instr(item_desc,'.',1)-1) CATEGORY
          substr(item_desc,instr(item_desc,'.',1)+2,99) ITEM_SIZE
FROM tablename;
ltrim(去掉左边的空格)  rtrim    trim
日期处理:
 trunc:去掉日期中的时间部分
add_months:返回一个月份不同但天数相同的日期。add_months('starting_date',number_of_months)
last_day('date')         select last_day(sysdate)+1 from dual;
months_between(later_date,earlier_date)                    select round(months_between(sysdate,last_stock_date)) from tablename;
数据类型转换
to_char(input_value,'format_code')
select to_char(sysdate,'mm-dd-yyyy  hh24:mi:ss') now from dual;
to_date(input_value,'format_code')
select to_date(sysdate,'mm-dd-yyyy ') now from dual;
其它函数
decode
decode(incoming_source,
            incoming_value_1,outgoing_result_1,
            incoming_value_2,outgoing_result_2,
            .......
            default_outgoing_result_if_no_match
            )
nvl
nvl(input_value,result_if_input_value_is_null)


1.字符
    length,ltrim,replace,rtrim,substr,trim
   select length('abcde') from dual;            select lengthb('avc楞') from dual;(字节)
    select trim(' abcde ') from dual;(去掉空字符)  
    select substr('abcdefg',3,3) from dual; select substr('abcdefg' ,length('abcdefg')-3+1,3) from dual;
  2.日期
       select sysdate from dual;
select * from tablename where purchase_date between (sysdate-30) and sysdate;
       select current_date from dual;
       alter session set nls_date_format='dd- mon-yyyy hh:mi:ss';
       select next_day(sysdate,'星期二' )from dual;
3.转换
       select to_char(sysdate,'yyyy-mm-dd   hh24:mi:ss') from dual;
       select to_date('12-3月-04') from dual;
        select to_number ('333') from dual;
4.聚集函数(不能做为条件放在where语句的后面)
          sum ,avg, max , min, count
           select sum(c) from abc;
           select count(*) from abc;
           select count(c) from abc;
5.其它
    decode, nvl, null, order
    select user from dual;
    select sum(decode(sex,'男',1,0)) 男人数,sum(decode(sex,'女',1,0)) 女人数 from e;
    select a1,nvl(a2,'未输入') a2 from aa;
    select * from aa where a1 is null;    select *  from aa where a2 is not null;
    select * from aa order by a1 desc;
    select * from aa order by a1 asc;
    select  distinct a1 from aa;
6.生成随机数
SELECT DBMS_RANDOM.VALUE(下限﹐上限) FROM DUAL;
随机整数
select ceil(dbms_random.value(0,3)) from dual;
 select trunc(dbms_random.value(0,4))   from   dual
问题解决:修改表后怎么让其保存         解决办法:commit
3.分组语句
        select publish ,sum(price*qty) from books group by publish;     (publish与by **** 相匹配 )
        select publish ,sum(price*qty) from books group by publish having         sum(price)>200;
4.模糊查询(即使用通配符)
          select * from abc where a like 'a%';  (%g代表任意个字符)
          select * from abc where a like '%a%';
5.表的链接
        create table e(EID varchar(10),ENAME varchar(10),SEX varchar(10), ID varchar(10))
        insert into e  values ('001' ,'赵1','男','01');
   
       create table d(ID varchar(10) ,NAME varchar(10));

      select  EID 编号,ENAME 姓名,SEX 性别,e.ID 所在部门 from e,d where e.id=d.id;
      select  EID 编号,ENAME 姓名,SEX 性别,d.name 所在部门 from e,d where e.id=d.id;
    内连接:两个表的相匹配
    select  EID 编号,ENAME 姓名,SEX 性别,d.name 所在部门 from e join d on e.id=d.id;
   外连接:不完全匹配。
   左连接:以 左边的表为主:select  EID 编号,ENAME 姓名,SEX 性别,d.name 所在部门 from e,d where e.id=d.id(+);
   右连接:以 右边的表为主:select  EID 编号,ENAME 姓名,SEX 性别,d.name 所在部门 from e,d where e.id(+)=d.id;
6.子查询
          select * from e where id=(select id from d where id=e.id and id='03');
          select * from e where id in(select id from d  where id=e.id and id='03');                     相关
          select * from e where id not  in(select id from d  where id=e.id and id='03');              不相关
          select * from e where  exists(select id from d where id=e.id );                                      相关
          select * from e where  not exists(select *from d where id=e.id );                                 不相关
       
         select id  from e
         intersect
         select id  from d;       (把两个匹配的显示出来,oracle专有)

        create table ttt as (select * from e);                  (用另一个表来创建一个表)
        create table table_name1 as select * from table_name2;      (用另一个表来创建一个表)
        create talbe ttt as select eid,name from e where eid='001';
        insert into e (eid,ename)  select id,name from d;
多行子查询:
select * from table_name_1 where product_name not in(select distinct product_name from table_name_2) order by procuct_name;
create table table_name1 (purchase_date date, product_name varchar2(25),....);
改变表名
rename old_table_name to new_table_name;
改变表结构:
alter table table_name add new_column_name datetype not null;
alter table table_name add data_load_date varchar2(8);
改变列名
alter table table_name rename column old_column_name to new_column_name;
删除列
alter table table_name drop column column_name;
改变列中的数据类型
alter table table_name modify column_name new_datatype;
改变NULL选项
alter table table_name modify column_name not null;

7.集合运算符
      UNION(两个SELECT 语句中的所有行,删除重复值),UNION ALL(显示重复值),
       INTERSECT(求交集),MINUS(第一个SELECT语句返回行减去第二个SELECT语句返回行)
select * from tablename
MINUS
select * from tablename where product_price<0 or product_price>100;

8.格式化查询结果
COLUMN:     column ename heading '雇员姓名' format A15
                       column sal heading '薪水' justify center format $99,999,00
TITLE ,BTITLE:         ttitle '我的帐单'                 btitle '-------------bean公司-----------'
PAUSE:         set pause on;    set pause off;
PAGESIZE:     set pagesize 14;                (增加每一页显示的数据量)
LINESIZE:  show linesize;           set linesize 160;
FEEDBACK:       set feedback on ;
NUMFORMAT:   set numformat 99999999999999999999999,9999999999
LONG:     set long 10000    (为了显示列中的更多数据)
PROMPT:     prompt 显示用户和表空间的清单
&:                 select ename from e wher sal>&amount;         &&:  输入变量一次
9.如何 插入包含撇号的数据
set scan off
insert into table_name values ('fifth product''s name',25,'05-may-06');
set scan on
10.将两个或更多的文本段结合在一起
select product_name || 'was old by' || salesperson from tablesname;
11.查询
select * from tablename where produce_price>50 and product_price<1000;
select * from tablename where produce_price between 50 and 1000;
select * from tablename where produce_price <> 90;(选择不等于90的行)
select * from tablename where produce_price != 90;(选择不等于90的行)
select * from tablename where color in ('red' ,  'green' , 'white');(进行一个组(包含这几个颜色的行)选择)
select * from tablename where last_stock_date='10-JAN-06';
select * from tablename where last_stock_date >'10-JAN-06';
select * from tablename where last_stock_date BETWEEN '01-JAN-06' AND '31-DEC-06';
select * from tablename  order by product_price ,product_name;
select * from tablename  order by product_price DESC;
select distinct produc_name from tablename order by product_name;

12.格式化SQL*PLUS 中的数字
1)对齐小数位
COLUMN procduct_price FORMAT  999.99
2)将数字安每三位一节插入分组符
COLUMN quanlity_on_hand FORMAT 99,999
3)插入货币符号
COLUMN product_price FORMAT $99.99

 

         
                                                                                   三.PL/SQL基础
参数之后的IN表示在调用该过程时可以读取该参数中的输入值。OUT表示过程可以使用该参数将某个值传递回调用它的过程。
过程中的数据类型不可以包含尺寸规范。如不可以NUMBER(10,2).
以下语法声明某个列类型的PL/SQL变量(单行单 列):variable_name table_name.column_name%TYPE;
以下语法声明某个记录的字段与某个表中的行相同:record_name table_name%ROWTYPE;
以下语法声明某个记录的字段与游标中的列相同:record_name cursor_name%ROWTYPE;(???是列还是行呀?????)
单行单列:v_name employee.employeename%TYPE
DECLARE
              v_name employee.employeename%TYPE
单行多列:Dept_record department%ROWTYPE
 
单列多行:TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY key_type;
                     identifier type_name;
DECLARE
   TYPE ename_table_type IS TABLE OF employee.employeename%TYPE
    INDEX BY BINARY_INTEGER;
   ename_table   ename_table_type;
BEGIN
   SELECT employeename INTO ename_table(-1) FROM employee
   WHERE employeeno='128';
   dbms_output.put_line('员工名:' ||ename_table(-1));
END;
/


 1.块结构
           head              命名块才有的如函数或过程
           declare           对变量,过程,子程序声明
           execute           执行处理
           exception         捕获和处理异常
                    DECLARE   ....            
                    BEGIN           ....
                    EXCEPTION     ...
                    END;
                    /

EXCEPTION
WHEN exception_name
THEN  actions to take

   2.变量声明的内容
       。赋予变量适当的名称
       。赋予变量正确的数据类型
       。定义变量(变量,记录)
       。控制变量范围
   3.命名规则
        。 变量由字符开头
        。 可以包含:数字,下划线,'$', '#'等
        。变量长度范围:1---30
        。大小写不区分
        。变量名不能是系统关键字

    declare   1_number_constant  constant number:=60;             (常量的赋值)
    begin
     null;
    end;
    /
     
     DECLARE
     x varchar2(10);
     BEGIN
     x:='This is ..';
     DBMS_OUTPUT.PUT_LINE('x的值为:' ||x) ;
     END;
     /
4. 分支语句
    4.1  IF分支
         IF...THEN
         ELSIF ....THEN
         ELSE ...
         END IF

   例子:
DECLARE
a number;
b varchar2(10);
BEGIN
a:=2;
IF a=1 THEN
b:='A';
ELSIF a=2 THEN           --注意ELSIF的写法
b:='B';
ELSE
b:='C';
END IF;
DBMS_OUTPUT.PUT_LINE('b的值为:' ||b);
END;
/
       
      4.2 CASE分支
         CASE
         WHEN ...THEN...
          WHEN...THEN...
         ELSE
         END CASE

DECLARE
a number;
b varchar2(10);
BEGIN
a:=4;
CASE
WHEN a=1  THEN b:='A';
WHEN a=2  THEN b:='B';
WHEN a=3  THEN b:='C';
ELSE
b:='others';
END CASE;
DBMS_OUTPUT.PUT_LINE('b的值为:' ||b);
END;
/
5.循环语句
   5.1基本循环(LOOP)
      LOOP
      ..........
     END LOOP
    
DECLARE                                                                                                   
x number;                                                                    
BEGIN
x:=0;
LOOP
X:=X+1;
IF X>=3 THEN
EXIT;
END IF;
DBMS_OUTPUT.PUT_LINE('内: x=' ||x);
END LOOP;
DBMS_OUTPUT.PUT_LINE('外: x=' || x);
END;
/


DECLARE
x number;
BEGIN
x:=0;
LOOP
X:=X+1;
EXIT WHEN X>=3;
DBMS_OUTPUT.PUT_LINE('内: x=' ||x);
END LOOP;
DBMS_OUTPUT.PUT_LINE('外: x=' || x);
END;
/
      

 

    5.2WHILE循环
        WHILE expression LOOP
         .........
         END LOOP;


DECLARE
X number;
BEGIN
X:=0;
WHILE X<=3 LOOP
x:=x+1;
DBMS_OUTPUT.PUT_LINE('X1=' ||x);
END LOOP;
DBMS_OUTPUT.PUT_LINE('X2=' || X);
END;
/
    5.3 FOR循环
         FOR counter IN[REVERSE] start_value..end_value LOOP
          ........
          END LOOP;


            BEGIN
            FOR i IN 1..5 LOOP                                                                 (REVERSE)                                                      
            DBMS_OUTPUT.PUT_LINE('i=' ||i);
             END LOOP;
            DBMS_OUTPUT.PUT_LINE('END OF FOR LOOP');
            END;
           /


6.异常处理
    常见系统异常:DUP_VAL_ON_INDEX:向有唯一约束的表中插入重复行
                                NO_DATA_FOUND:在一个SELECT INTO语句中无返回值
                                TOO_MANY_ROWS:SELECT INTO 语句返回了多行
                                 VALUE_ERROY:一个算法、转换、截断或大小约束发生错误
                                 ZERO_DIVIDE:发生被零除

  6.1异常结构
DECLARE
test varchar2(10);
BEGIN
SELECT a INTO test from abc where a='tt';
DBMS_OUTPUT.PUT_LINE(test);
END;
/
 

7.复合变量:记录
    7.1记录声明
       TYPE type_name IS RECORD(
        Variable_name datatype[,
        Variable_name datatype[,
        ......
         );
        Real_name type_name;   


   DECLARE
   TYPE myrecord IS RECORD(
   id varchar2(10),
   name varchar2(10));
   real_record myrecord;
   BEGIN
   SELECT eid,ename INTO real_record FROM e where eid='001';
   DBMS_OUTPUT.PUT_LINE(real_record.id || ',' || real_record.name);
   END;
   /     

 

DECLARE
myrec e%ROWTYPE;
BEGIN
SELECT * INTO myrec FROM e WHERE eid='001';
DBMS_OUTPUT.PUT_LINE(myrec.eid|| ',' || myrec.ename||','|| myrec.sex);
END;
/


%TYPE:用户声明单独的变量                                   %ROWTYPE:声明完整行的记录变量

                                             
                                                                                        PL/SQL高级应用
 
1.游标:对SQL语句进行显式控制,便于对表的行数据逐条进行处理        (打开游标,从游标中获取记录,关闭游标)
    1.1游标的属性:
cursor_name%FOUND     检查从游标中获取记录的最后一次尝试是否成功。成功则返回TRUE
cursor_name%ISOPEN     检查游标cursor_name是否打开,打开则返回TRUE  
cursor_name%NOTFOUND  与FOND相反
cursor_name%ROWCOUNT    游标的SELECT语句返回的行数。
1.2PL/SQL记录
1)基于表    这种记录的列名称与类型相匹配。 因此游标可以选择整个行。
2)基于游标 
3)用户自定义

1.3游标FOR循环
FOR cursor_record IN cursor_name LOOP
  statements
END LOOP;


1.4WHERE CURRENT OF
当打开游标进行更新或删除所选择的行时,可以使用
WHERE CURRENT OF cursor_name
DECLARE
     CURSOR product_cur IS
     SELECT * FROM plsql_product
     FOR UPDATE OF procuct_price;            ???????????????
BEGIN
    FOR product_rec IN product_cur
    LOOP
          UPDATE plsql_product
          SET product_price = (product_rec.product_price * 0.97)
          WHERE CURRENT OF product_cur;
    END LOOP;
END;
/

      DECLARE
      CURSOR  mycur IS
      SELECT * FROM  e;
      myrecord  e%ROWTYPE;
      BEGIN
      OPEN mycur;
      FETCH mycur INTO myrecord;
      WHILE mycur%FOUND  LOOP
       DBMS_OUTPUT.PUT_LINE(myrecord.eid ||',' || myrecord.ename);          
       FETCH mycur INTO  myrecord;
        END LOOP;
        CLOSE mycur;
        END;
          /
           为什么取不出来数据?????????????????????:因为没有设置显示 应该:set serveroutput on

DECLARE
CURSOR  cur_para(idd varchar2)  IS
SELECT  ename  FROM e  WHERE idd=eid;
t_name    e.ename%TYPE;
BEGIN
OPEN cur_para('001');
LOOP
FETCH cur_para INTO t_name;
EXIT WHEN cur_para%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(t_name);
END LOOP;
CLOSE cur_para;
END;
/
     
DECLARE
CURSOR cur_para(idd varchar2) IS
SELECT ename FROM e WHERE eid=idd;
BEGIN
FOR cur IN cur_para('001') LOOP
DBMS_OUTPUT.PUT_LINE(cur.ename);
END LOOP;
END;
/


DECLARE
t_name  e.ename%TYPE;
CURSOR cur(idd varchar2) IS
SELECT ename FROM e WHERE idd=eid;
BEGIN
IF cur%ISOPEN  THEN
DBMS_OUTPUT.PUT_LINE('游标打开了');
ELSE
OPEN cur('003');
END IF;
FETCH cur INTO t_name;
close cur;
DBMS_OUTPUT.PUT_LINE(t_name);
END;
/
          
DECLARE
t_name varchar2(10);
CURSOR mycur IS
SELECT ename FROM e;
BEGIN
OPEN mycur;
LOOP
FETCH mycur INTO t_name;
EXIT WHEN mycur%NOTFOUND OR mycur%NOTFOUND IS NULL;
DBMS_OUTPUT.PUT_LINE('游标MYCUR 的ROWCOUNT是: ' || mycur%ROWCOUNT);
END LOOP;
CLOSE mycur;
END;
/

DECLARE
     CURSOR emp_cursor IS SELECT employeename,sal FROM employee
     WHERE departmentno='008';
     emp_record emp_cursor%ROWTYPE;--字义游标的类型的记录变量
BEGIN
     IF NOT emp_cursor % ISOPEN THEN
        OPEN  emp_cursor;
      END IF;
LOOP
      FETCH emp_cursor INTO emp_record;
      EXIT WHEN emp_cursor % NOTFOUND;
      dbms_output.put_line(................);
END LOOP;
      CLOSE emp_cursor;
END;
/

DECLARE
      CURSOR emp_cursor IS SELECT employeename FROM employee
       WHERE departmentno = '008';
BEGIN
     FOR  emp_record IN emp_cursor LOOP
                dbms_output.put_line('第' || emp_cursor %rowcount || '个员工:' || emp_record.employeename);
       END LOOP;
END;
/

 

 

2.存储过程
  2.1创建语法
    过程的创建与执行
CREATE OR REPLACE PROCEDURE myproc(idd IN varchar2)
IS
name varchar2(10);
BEGIN
SELECT ename INTO name FROM e where eid=idd;
DBMS_OUTPUT.PUT_LINE(name);
END  myproc;
/
执行方法:
(1)DECLARE
tid varchar2(10);
BEGIN
tid:='001';
myproc(tid);
END;

(2)BEGIN
myproc('001');
END;
/
(3)
EXECUTE myproc('001');            注意:是输入参数或常量才可以
(4)
CREATE OR REPLACE PROCEDURE
myproc2(tid varchar2,tname out varchar2)
IS
BEGIN
SELECT  ename INTO tname FROM e WHERE eid=tid;
END;
/
DECLARE
id1 varchar2(10);
name1 varchar2(10);
BEGIN
id1:='002';
myproc2 (id1,name1);
END;
/

建立一个输出员工名和新工资的过程,输入参数为员工号
CREATE OR REPLACE PROCEDURE query_sal
    (eno VARCHAR2,name OUT VARCHAR2,salary IN OUT NUMBER)
IS
v_sal NUMBER;
BEGIN
    SELECT employeename,sal INTO name,v_sal
    FROM employee WHERE employeeno = eno;
    salary :=salary+v_sal;
EXCEPTION
    WHEN NO_DATA_FOUND THEN
         raise_application_error(-20000,'该员工不存在');
END query_sal;
/
过程建立后,通过定义变量接收输出参数.
SQL>var name VARCHAR2(20)
SQL>var salary NUMBER
SQL>exec:salary:=100
SQL>exec query_sal('003',: name, : salary)
SQL>print name salary

                                                                                       DML触发器
指定触发时机(BEFORE 或 AFTER)、触发事件(INSERT,UPDATE,DELETE)、表名、触发类型、触发条件、以及触发操作。

CREATE OR REPLACE TRIGGER tr_sec_emp
BEFORE INSERT OR UPDATE ON employee
DECLARE
--可以在这里声明私有变量
BEGIN
   IF to_char (SYSDATE,'DY','nls_date_language = AMERICAN') in ('SAT','SUN') THEN
            raise_application_error(-20001,'不能在休息日改变雇员信息');
   END IF;
END tr_sec_emp;


CREATE OR REPLACE TRIGGER tr_emp_time
BEFORE INSERT OR UPDATE OR DELETE ON employee
BEGIN
     IF to_char(sysdate,'HH24') NOT BETWEEN '09' AND '17' THEN
          raise_application_error(-20001,'非工作时间');
    END IF;
END tr_emp_time;

CREATE OR REPLACE TRIGGER tr_check_sal
BEFORE UPDATE OF sal on employee
FOR EACH ROW
WHEN (new.sal 1.2*old.sal)
BEGIN
          raise_application_error(-20001,'工资只升不降,且幅度不超过20%');
END tr_check_sal;

定义登录和退出数据库的触发器
CONN sys/password AS SYSDBA
CREATE TABLE log_table(
      username varchar(20), --记录用户名
      logon_time  date, --记录用户登录时间
      logoff_time date, --记录用户退出时间
      address varchar2(20)) --用户登录的IP地址
/
CREATE OR REPLACE TRIGGER tr_logon
AFTER logon ON DATABASE
BEGIN
      INSERTE INTO log_table(username,logon_time,address)
      VALUES(ora_login_user,sysdate,ora_client_ip_address);
END tr_logon;
/*ora_login_user    返回登录用户的事件属性函数
ora_client_ip_address   事件属性函数*/
/
CREATE OR REPLACE TRIGGER tr_logoff
BEFORE logoff on DATABASE
BEGIN
    INSERT INTO log_table(username,logoff_time,address)
    VALUES(ora_login_user,sysdate,ora_client_ip_address);
END tr_logoff;
/

禁止触发器:ALTER TRIGGER tr_check_sal DISABLE;
激活触发器:ALTER TRIGGER tr_check_sal ENABLE;
禁止或激活表的所有触发器:ALTER TABLE table employee DISABLE ALL TRIGGERS;
                                                    ALTER TABLE table employee ENABLE ALL TRIGGERS;
重新编译触发器:ALTER TRIGGER tr_check_sal COMPLE;
删除触发器:DROP TRIGGER tr_check_sal;

 


显示错误:SHOW ERRORS PROCEDURE myproc;
                    SHOW ERRORS  PACKAGE  ***;
                     SHOW ERRORS  FUNCTION ***;
2.3使用参数


                                                                       PL/SQL数据类型
pls_integer和binary_integer是PL/SQL专用的数据类型
补充:
1.查看其编译级别:show parameter plsql_optimize_level;
2.show all 显示所有的sql*plus 设置
3.删除一个过程、函数:drop procedure procedure_name;   drop function function_name;
4.绑定变量并显示:begin          :x:=4;   end; /             print x;
5.养成一个良好的习惯,写完一个对象后,用show error 进行一下检查。

 

 


                                                                 视图、同义词、序列

1.视图实际上是一条查询语句,占用内存空间
      1.1创建一个视图:就是为了方便查询某些特定的元素而编写的SELECT 语句(可以增强安全性,防止用户看到不该看到的东西)
CREATE OR REPLACE VIEW myview
AS
SELECT * FROM e;

如:SELECT eid,ename,sex,d.name,d.id FROM e,d WHERE d.id=e.id;
   CREATE OR REPLACE VIEW v_e_d
 AS
SELECT   eid,ename,sex,d.name,d.id FROM e,d WHERE d.id=e.id;

INSERT INTO v_e_d VALUES('006','GGG','NV','D','04');
CREATE OR REPLACE VIEW v_read
AS
SELECT eid,ename FROM e
WITH READ ONLY;

DESC v_read;
删除视图
drop view view_name;
2.同义词的使用
 select user from dual;
  2.1创建同一词
create [public] synonym synonym_name for object_name;
 create synonym e for sys.e;
 select * from e;                                select * from sys.e;
 drop synonym e;
3、创建序列
create sequence sequence_name;
create sequence sequence_name (increment by increment_quanlity/start with starting_value/maxvalue highest_value/minvalue lowest_value/cycle);
create sequence myseq;
CREATE SEQUENCE myseq
START WITH 1
INCREMENT BY 3
ORDER
NOCYCLE;

改变其递进值:alter sequence myseq increment by 1;

SELECT  myseq.NEXTVAL  FROM dual;
SELECT myseq.CURRVAL FROM dual;


CREATE TABLE auto(a number,b varchar2(10));
INSERT INTO auto VALUES(myseq.NEXTVAL,'dfd');
修改现有序列
alter sequence sequence_name (ncrement by increment_quanlity/start with starting_value/maxvalue highest_value|nomaxvalue/minvalue lowest_value|nominvalue/cycle|nocycle)

desc dba_sequences;
当视图无效时重新进行选择就可以使其生效。
                                                                          索引
1.建立索引(向表中添加索引可以使该表响应查询的速度比平时快31倍)
何时使用索引:索引本身也是表,所以INSERT会延长操作时间2.5倍。使数据输入时间变长,读取速度变快。
create index index_name on table_name(column_name);   (b*_索引,适合多个惟一值)
create bitmap index_name on table_name(column_name); (位图索引,适合少数惟一值)
create table indextext as select * from dba_objects where owner in ('public', 'sys','system' );
analyze table indextext compute statistics;                   (表分析)
analyze index indextest_objectname_idx validate structure;    (索引分析)    
set autotrace trace explain;
select  owner ,object_name from indextext where object_name='dba_indexes';
create index indextest_objectname_idx on indextext(object_name);
查看索引的大小 :select name,height,lf_blks,pct_used from index_stats;
2.索引的开销很大,最好的办法是使需要的表上创建的索引数量最小化
3.索引的联接、压缩、跳跃
建立联接索引:create index  e_name_idx on e(ename,eid) pctfree 25;
create table e(ename varchar2(10) constraint invent_ename_pk primary key,eid number(10) constraint invent_eid_uq unique);
反转键索引:create index e_ename_idx on e(ename) reverse;


                                                                     安全管理
1.系统授权
grant create user to scan WITH ADMIN OPTION;
2.对象授权
 grant connect ,resource to scan;
      grant select on abc to scan;
     revoke grant on abc from scan;                 (撤消权限)
     revoke  create user from scan;   
GRANT ALL ON e TO scan WITH GRANT OPTION;
    grant execute on  e  TO scan;
    grant create user to scan;
3.通过角色来管理用户(对楖要文件的了解)
     create role myrole;
      grant select on sys.abc to myrole;
     grant myrole to scan;


                                                           表空间的管理
1.创建表空间
create tablespace  tabs
datafile  'e:\oracle\product\tabs.dbf' size=100m;

alter user scan default tablespace tabs;
grant unlimited tablespace ,dba to scan;
表空间的查看:
desc dba_tablespace_groups;
desc dba_users;
2.修改表空间名称:alter tablespace user rename to wjl;
    
                                                             表的管理
1.表的完整性与约束
NOT NULL
create table nn(n1 varchar2(10) not null, n2 char(10));
alter table table_name modify (column_name not null);
UNIQUE
alter table table_name add constraint constraint_name UNIQUE(column_name);
create unique index index_name on table_name( upper(first_name),upper(last_name));  (与创建默认的惟一性索引不同)
CHECK
alter table table_name add constraint constraint_name check(column_name,condition_to_satisfy);
alter table table_name add (constraint reasonable_date check(purchase_date is not null and purchase_date >= '30-JUN-2008'));
启用和禁止现有约束
alter table table_name disable constraint constraint_name;
alter table table_name enable constraint constraint_name;
改变和删除现有约束
alter table table_name modify(column_name null);
alter table table_name modify(column_name not null);
alter table table_name drop constraint constraint_name;
表间关联:
创建主键
alter table table_name add primary key (column_name_1,column_name_2,...);
create table table_name (product_name varchar2(25) primary key, .....);
alter table table_name add constraint constraint_name foreign key (column_name_in_child_table) references parent_table_name;
alter table mm add constraint fk_mm FOREIGN KEY(n1) references nn(n1);
alter table modify (id number,data varchar2(255));
alter table e add constraint ck_e_sex CHECK(sex='男' or sex= '女');
DESC dba_constraints;
2.管理索引
create index my_mm_idx on mm(m1);
create bitmap index bit_e on e(sex);
create unique index myidx on mm(m2);
3.创建索引组织表
     create table states(state_id varchar2(2),state_name varchar2(20), constraint pk_states_state_id primary key (state_id))
       oraganization index
         /
4.删除列和标注不用列
 alter table d drop column ssn;               无法删除属于SYS的表中的列???????????????
5.重命名表
  alter table d rename to dep;
6.改变表的特性
设置CACHE 属性会通知ORACLE将数据块放到最近最少使用的列表,从而强制ORACLE将数据块保留在内存中更长时间
alter table[cache|nocache]
alter table[logging|nologging]
alter table move tablespace
7.删除带有外键约束的表
drop table d cascade constraints;
drop 是删除表,delete 是删除表中的所有数据而没有删除表。
truncate table是用于删除表中所有数据,但不删除表本身的DDL语句,该表的索引也删除。比 DELETE效率更高。而且自动释放所清空记录以前占用的空间;
truncate table[schema.][drop storage|reuse storage]               (不再会回滚)
truncate tablename abc;
alter database datafile 'E:\oracle\product\10.2.0\oradata\orc1\SYSAUX05.DBF' resize 100M;
alter tablespace sysaux drop datafile 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORC1\sysaux01.dbf';


                                                                                   事物处理与并发控制
1.事物处理控制语句包括:
COMMIT,ROLLBACK,SAVEPOINT,ROLLBACK TO SAVEPOINT,SET TRANSACTION,SET CONSTRAINTS.
1.1 savepoint function_name;                            rollback to function_name;
1.2 set transaction read only;                      set transaction read write;
 1.3 set constraint_name deferred;              set constraint all deferred;
1.4锁定:是一种用来控制共享资源并发访问的一机制。     

         
一些功能设置:
   set serveroutput on;
   set autotrace trace stat;
   set autotrace trace explain;
   alter database backup controlfile to trace;  (备份控制文件到E:\oracle\product\10.2.0\admin\orc1\udump)
GRANT SELECT ON sys.e TO scan;    

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12878495/viewspace-683376/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12878495/viewspace-683376/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值