Oracle11G基本操作

牧云@^-^@ 提交于 2020-04-07 02:38:08


[1].创建表空间

CREATE TABLESPACE SYPRO_201310 DATAFILE 'F:\ORACLE_11G\oradata\orcl\SYPRO_201310.DBF' SIZE 10M AUTOEXTEND ON 

在指定的F盘下创建一个名SYPRO_201310.DBF的文件初始空间是10M当空间不足时自动增加

[2].删除表空间同时删除表空间所有硬盘上的物理文件

DROP TABLESPACE SYPRO_201310 INCLUDING CONTENTS AND DATAFILES 

[3].查看当前用户所有表空间

SELECT * FROM DBA_TABLESPACES 

[4].创建用户liutao 密码 liutao 默认表空间 SYPRO_201310 临时表空间 TEMP

CREATE USER liutao IDENTIFIED BY liutao DEFAULT TABLESPACE SYPRO_201310 TEMPORARY TABLESPACE  TEMP 

[5].用户授权-连接数据库的权限

GRANT CONNECT TO LIUTAO WITH ADMIN OPTION

[6].用户授权-数据库管理员DBA角色

GRANT DBA TO LIUTAO WITH ADMIN OPTION

-- 创建表空间

CREATE TABLESPACE BOAICRM_201310 DATAFILE 'F:\ORACLE_11G\oradata\orcl\BOAICRM_201310.DBF' SIZE 50M AUTOEXTEND ON ;

-- 创建用户

CREATE USER BOAI IDENTIFIED BY BOAI DEFAULT TABLESPACE BOAICRM_201310 TEMPORARY TABLESPACE TEMP ;

-- 用户授权

GRANT DBA TO BOAI WITH ADMIN OPTION ;

[7].删除用户

DROP USER LIUTAO

[8].删除登录数据库的权限

REVOKE CONNECT FROM LIUTAO

=========修改数据表的一些常用操作=========

A.快速复制表结构但不复制表中的数据的方法:

CREATE TABLE TB_STUDENT_NEW AS SELECT * FROM TB_STUDENT_OLD WHERE 1 = 2 ;

B.快速复制表结构和表中的数据的方法:

CREATE TABLE TB_STUDENT_NEW AS SELECT * FROM TB_STUDENT_OLD

[9].修改已创建的表-添加字段

ALTER TABLE TB_STUDENT ADD EMAIL VARCHAR2(50)

[10].修改已创建的表-重新定义字段属性

ALTER TABLE TB_STUDNET MODIFY EMAIL VARCHAR2(100)

[11].修改已创建的表-删除字段

ALTER TABLE TB_STUDNET DROP COLUMN EMAIL

[12].修改已创建的表-字段重命名

ALTER TABLE TB_STUDNET RENAME COLUMN EMAIL TO EMAIL_163

[13].修改已创建的表-表重命名

RENAME TB_STUDNET TO TD_STUDNET

[14].给表加注释

COMMENT ON TABLE TB_STUDNET IS '学生表'

[15].给字段加注释

COMMENT ON COLUMN TB_STUDENT.EMAIL IS '邮箱'

[16].删除表

DROP TABLE TB_STUDNET 保留回滚段可恢复

DROP TABLE TB_STUDNET Purge 删除后不可恢复

[17].恢复已删除的表-10G新特性

FlashBack TABLE TB_STUDNET TO BEFORE DROP

=========数据表的约束和维护=========

[18].添加约束

ALTER TABLE TB_STUDENT ADD CONSTRAINTS TB_STUDENT_ID_PK PRIMARY KEY ID 主键约束

ALTER TABLE TB_STUDENT ADD CONSTRAINTS TB_STUDENT_EMAIL_UK UNIQUE EMAIL 唯一性约束

ALTER TABLE TB_STUDENT ADD CONSTRAINTS TB_STUDENT_CLASS_ID_FK FOREIGN KEY (CLASS_ID) REFERENCES TB_CLASS (CLASS_ID) 外键约束

[19].删除约束

ALTER TABLE TB_STUDENT DROP CONSTRAINTS TB_STUDENT_CLASS_ID_FK 

[20].禁用约束

ALTER TABLE TB_STUDENT DISABLE CONSTRAINTS TB_STUDENT_CLASS_ID_FK

[21].激活约束

ALTER TABLE TB_STUDENT ENABLE CONSTRAINTS TB_STUDENT_CLASS_ID_FK

[22].用户解锁

ALTER USER SCOTT ACCOUNT UNLOCK

[23].重新设密码

ALTER USER SCOTT IDENTIFIED BY TIGER

===========PL/SQL编程部分=========

[24].PLSQL语法规则:

DECLARE

/**声明部分在此处声明要使用的变量、游标、以及局部的存储过程及函数。**/

BEGIN 

/** 执行部分过程及SQL **/

EXCEPTION

/** 异常处理部分 **/

END 

/** 结束部分 **/

DECLARE   

STR varchar(50):='HELLOWORD' ;  

BEGIN  

  STR:=STR || 'LIUTAO' ;    

  dbms_output.put_line(STR) ;  

EXCEPTION   

  WHEN OTHERS THEN     

  dbms_output.put_line('发生错误');    

END ;

其中 := 是赋值符号 || 是字符连接符号 dbms_output.put_line()是一个输出方法

[1].--查询功能实现

DECLARE 

V_ID NUMBER ;

V_NAME VARCHAR(50) ;

BEGIN 

  SELECT STU_ID,STU_NAME 

  INTO V_ID ,V_NAME FROM TB_STUDENT 

  WHERE STU_ID = 11 ;  

  dbms_output.put_line('V_ID=' || V_ID) ;

  dbms_output.put_line('V_NAME=' || V_NAME);  

END ;

[2].--添加功能

DECLARE

BEGIN      

    INSERT INTO TB_STUDENT(STU_ID,STU_NAME,STU_AGE) VALUES(20,'刘江红',10) ;

    commit;     

END ;

%TYPE 和 %ROWTYPE 用来表示不确定类型

%TYPE 可以理解成对数据库表一个字段的副本

%ROWTYPE 可以理解成对数据库一行记录提取出来的一个副本

[3].-- %TYPE用法示例 :

DECLARE 

V_STU_ID TB_STUDENT.STU_ID%TYPE ;

V_STU_NAME TB_STUDENT.STU_NAME%TYPE ;

V_STU_AGE TB_STUDENT.STU_AGE%TYPE ;

BEGIN    

SELECT STU_ID ,STU_NAME,STU_AGE INTO V_STU_ID ,V_STU_NAME,V_STU_AGE FROM TB_STUDENT WHERE STU_ID = 14 ;

DBMS_OUTPUT.PUT_LINE('STU_ID=' || V_STU_ID);

DBMS_OUTPUT.PUT_LINE('STU_NAME=' || V_STU_NAME) ;

DBMS_OUTPUT.PUT_LINE('STU_AGE=' || V_STU_AGE) ;  

END ;

[4].--  %ROWTYPE用法示例 :

DECLARE     

    V_TB_STU_ROW TB_STUDENT%ROWTYPE ;    

BEGIN  

    SELECT * INTO V_TB_STU_ROW FROM TB_STUDENT WHERE STU_ID=10;    

    DBMS_OUTPUT.PUT_LINE('STU_ID=' || V_TB_STU_ROW.STU_ID) ;    

    DBMS_OUTPUT.PUT_LINE('STU_NAME=' || V_TB_STU_ROW.STU_NAME) ;     

    DBMS_OUTPUT.PUT_LINE('STU_AGE=' || V_TB_STU_ROW.STU_AGE) ;      

    DBMS_OUTPUT.PUT_LINE('STU_SEX=' || V_TB_STU_ROW.STU_SEX) ;    

END ;

[5].复合数据类型  特点包含多个内部组件、用于存放多个值。需要先定义类型然后用该类型可重复定义多个变量

1.数组 VARRAY 

语法:TYPE TYPE_NAME IS VARRAY (MAXINUM_SIZE) OF ELEMENT_TYPE

TYPE_NAME : 可变数组的名称

MAXINUM_SIZE : 可变数组元素的最大数目

ELEMNET_TYPE : 数组元素的类型

可变数组的下标从1开始 

用法示例 :

--  VARRAY 用法示例 :

DECLARE    

    TYPE ARY IS VARRAY (5) OF VARCHAR2(20) ;    

    V_ARY ARY := ARY('LIUTAO','MANY','KING','SAN','ABBY') ; /** 不能直接使用需赋值给一个变量 **/    

BEGIN  

    DBMS_OUTPUT.PUT_LINE(V_ARY(1)) ;

    DBMS_OUTPUT.PUT_LINE(V_ARY(2)) ;

    DBMS_OUTPUT.PUT_LINE(V_ARY(3)) ; 

    DBMS_OUTPUT.PUT_LINE(V_ARY(4)) ;

    DBMS_OUTPUT.PUT_LINE(V_ARY(5)) ;    

END ;

=======================================

2.可变数组 TABLE 与JAVA中的数组类似、可以理解成可变数组、下标无限、按照二进制进行索引

-- TABLE 用法示例 :

DECLARE 

   TYPE ARY IS TABLE OF VARCHAR(30) INDEX BY BINARY_INTEGER ;   

   V_LIST ARY ;   

BEGIN  

   V_LIST(10) := 'HELLOWORD_LIUTAO' ;

   V_LIST(12) := 'WHERE AND STU_ID' ;   

   DBMS_OUTPUT.PUT_LINE('V_LIST(10) = ' || V_LIST(10)) ;

   DBMS_OUTPUT.PUT_LINE('V_LIST(12) = ' || V_LIST(12)) ;   

END ;

=======================================

3.RECORD 可以理解成JAVA中的集合类型

-- RECORD 用法示例 :

DECLARE 

   TYPE ARY IS RECORD (        

        V_ID NUMBER ,

        V_NAME TB_STUDENT.STU_NAME%TYPE ,

        V_TB_STU TB_STUDENT%ROWTYPE  

   ) ;

   

   V_STUDENT ARY ;

BEGIN   

   SELECT STU_ID , STU_NAME , STU_AGE , STU_BIRTHDAY , STU_SEX INTO   V_STUDENT.V_ID ,  V_STUDENT.V_NAME ,   

    V_STUDENT.V_TB_STU.STU_AGE , V_STUDENT.V_TB_STU.STU_BIRTHDAY , V_STUDENT.V_TB_STU.STU_SEX  FROM TB_STUDENT WHERE STU_ID = 10 ;    

    DBMS_OUTPUT.PUT_LINE(V_STUDENT.V_ID) ;

    DBMS_OUTPUT.PUT_LINE(V_STUDENT.V_NAME) ;

    DBMS_OUTPUT.PUT_LINE(V_STUDENT.V_TB_STU.STU_AGE) ;

    DBMS_OUTPUT.PUT_LINE(V_STUDENT.V_TB_STU.STU_BIRTHDAY) ;

    DBMS_OUTPUT.PUT_LINE(V_STUDENT.V_TB_STU.STU_SEX) ;     

END ;

[6].PLSQL异常处理部分实例 :

-- 异常处理

DECLARE 

   TB_ROWS TB_STUDENT%ROWTYPE ;

   V_SQL_CODE VARCHAR2(200) ;

   V_SQL_MSG VARCHAR2(200) ;   

BEGIN   

  SELECT * INTO TB_ROWS FROM TB_STUDENT ;

  DBMS_OUTPUT.PUT_LINE('STU_NAME = ' || TB_ROWS.STU_NAME) ;  

  EXCEPTION -- 处理异常通用将异常信息记录到数据库表中保存                      

   WHEN OTHERS THEN     

  V_SQL_CODE := SQLCODE ; -- 返回错误编码

  V_SQL_MSG := SQLERRM ;  -- 返回错误信息  

  INSERT INTO TB_ERROR (ID,TABLE_NAME,SQL_CODE,SQL_MSG) VALUES (TB_ERROR_SEQ.NEXTVAL ,'TB_STUDENT',V_SQL_CODE,V_SQL_MSG) ;  

  COMMIT ;  

END ;

[7].PLSQL流程控制语句与循环语句实例 :

[7.1] ************ 流程控制分支语句 ************

-- 语法规则 

-- IF (条件) THEN 执行的语句  

-- ELSIF (条件) THEN  执行的语句  

-- ELSE   

-- END IF ;

DECLARE  

 V_STR VARCHAR2(20) := 'LIUTAO' ;

BEGIN  

 IF (V_STR = 'LIUTAO') THEN   

   DBMS_OUTPUT.PUT_LINE('V_STR = ' || 'LIUTAO') ;   

 ELSIF (V_STR = 'HELLO') THEN    

   DBMS_OUTPUT.PUT_LINE('V_STR = ' || 'HELLO') ;    

 ELSE     

   DBMS_OUTPUT.PUT_LINE('V_STR = ' || '都不满足条件') ;    

 END IF ;   

END ;

[7.2] ********** 循环语句 简单循环 LOOP **********

DECLARE 

  V_INDEX NUMBER := 10 ;

BEGIN

  LOOP 

      V_INDEX := V_INDEX + 1 ;

      DBMS_OUTPUT.PUT_LINE(V_INDEX);

      EXIT  WHEN V_INDEX = 15 ;

  END LOOP ;

END ;

[7.3] ***************** 嵌套循环 *****************

DECLARE 

 V_A NUMBER := 0 ; 

 V_B NUMBER := 0 ; 

BEGIN   

 LOOP    

    V_A := V_A + 1 ;

    DBMS_OUTPUT.PUT_LINE('V_A = ' || V_A) ;    

    EXIT WHEN V_A = 4 ; -- 外循环四次

    V_B := 0 ;     

   LOOP      

    EXIT WHEN V_B = 4 ; -- 内循环再次    

    V_B := V_B + 2 ;     

    DBMS_OUTPUT.PUT_LINE('V_B = ' || V_B) ;  

   END LOOP ;   

 END LOOP ;

    DBMS_OUTPUT.PUT_LINE('结束循环...........') ;    

END ;

[7.4] *************** 跳出循环体方法 ***************

DECLARE 

 V_A NUMBER := 0 ; 

 V_B NUMBER := 0 ; 

BEGIN   

 <<OUTER>>LOOP  -- 加上外层循环标识符 OUTER    

    V_A := V_A + 1 ;

    DBMS_OUTPUT.PUT_LINE('V_A = ' || V_A) ;    

    EXIT WHEN V_A = 4 ; -- 外循环四次

    V_B := 0 ;         

   <<INNER>>LOOP  -- 加上内层循环标识符 OUTER      

    EXIT OUTER WHEN V_B = 8 ; -- 内循环两次 当V_B = 8 时结束外层循环    

    V_B := V_B + 2 ;     

    DBMS_OUTPUT.PUT_LINE('V_B = ' || V_B) ;  

   END LOOP ;   

 END LOOP ;

    DBMS_OUTPUT.PUT_LINE('结束循环...........') ;       

END ;

[7.5] ************ FOR 循环语句 ****************

BEGIN

  FOR V_INDEX IN 1..20 LOOP

     DBMS_OUTPUT.PUT_LINE(V_INDEX) ;        

  END LOOP ;

END ; 

[7.6] ************ WHILE 循环语句 ************

DECLARE

   V_INDEX NUMBER := 1 ;

BEGIN

   WHILE V_INDEX < 10 LOOP 

     DBMS_OUTPUT.PUT_LINE(V_INDEX);

     V_INDEX := V_INDEX + 2 ;

   END LOOP ;

END ;

[7.6] ************ 游标的使用  ************

游标的作用 :提取结果集

DECLARE   

 CURSOR C_STUDENT IS SELECT * FROM TB_STUDENT ; -- 定义一个游标提取表 TB_STUDNET 中的所有数据 

 C_STUDENT_ROW TB_STUDENT%ROWTYPE ; -- 声明变量接收结果 

BEGIN 

 OPEN C_STUDENT ; -- 打开游标 

 LOOP    

    FETCH C_STUDENT INTO C_STUDENT_ROW ; -- FETCH关键字用来提取一行记录

    EXIT WHEN C_STUDENT%NOTFOUND ; -- 判断是否还有记录提取

    DBMS_OUTPUT.PUT_LINE('STU_ID = ' || C_STUDENT_ROW.STU_ID || 'STU_NAME = ' || C_STUDENT_ROW.STU_NAME) ;    

 END LOOP ; 

 CLOSE C_STUDENT ; -- 关闭游标 

END ;

-- 游标使用案例查询所有班级信息并列出对应班级的所有学生信息

-- 学习使用带参数的游标

DECLARE -- 声明部分

  CURSOR C_CLASS_CURSOR IS SELECT * FROM TB_CLASS ;-- 班级游标

  CURSOR C_STUDENT_CURSOR(V_CLASS_ID NUMBER) IS SELECT * FROM TB_STUDENT WHERE STU_CLASS_ID = V_CLASS_ID ; -- 学生游标  

  V_CLASS_RESULT TB_CLASS%ROWTYPE ; -- 保存班级信息

  V_STUDENT_RESULT TB_STUDENT%ROWTYPE ; -- 保存学生信息  

BEGIN  -- 执行部分  

  OPEN C_CLASS_CURSOR ; -- 打开游标

  LOOP 

    FETCH C_CLASS_CURSOR INTO V_CLASS_RESULT ; -- 提取结果

    EXIT WHEN C_CLASS_CURSOR%NOTFOUND ; -- 判断是否还有结果

    DBMS_OUTPUT.PUT_LINE('CLASS_ID = ' || V_CLASS_RESULT.CLASS_ID || 'CLASS_NAME = ' || V_CLASS_RESULT.CLASS_NAME) ;

      OPEN C_STUDENT_CURSOR(V_CLASS_RESULT.CLASS_ID) ; -- 打开学生游标要传参数

      LOOP

        FETCH C_STUDENT_CURSOR INTO V_STUDENT_RESULT ;

        EXIT WHEN C_STUDENT_CURSOR%NOTFOUND ; 

        DBMS_OUTPUT.PUT_LINE('STU_ID = ' || V_STUDENT_RESULT.STU_ID || 'STU_NAME' || V_STUDENT_RESULT.STU_NAME); 

      END LOOP ;

      CLOSE C_STUDENT_CURSOR ; -- 关闭游标

  END LOOP ;

  CLOSE C_CLASS_CURSOR ; -- 关闭游标  

END ; -- 结束部分

[8].PLSQL程序单元

主要有四类:过程:执行特定操作、无返回值

   函数:进行复杂计算、有返回值

   包:逻辑上相关的过程和函数组合到一起

   触发器:事件触发执行相应操作

[8.1] ************ 存储过程 ************

-- 第一个无参的存储过程

CREATE OR REPLACE PROCEDURE INSERT_TB_STUDENT

IS V_SEX VARCHAR2(4) := '女';

BEGIN

  INSERT INTO TB_STUDENT

    (STU_ID, STU_NAME, STU_AGE, STU_SEX, STU_BIRTHDAY, STU_CLASS_ID)

  VALUES

    (TB_ERROR_SEQ.NEXTVAL, 'LIUTAO', 11, V_SEX, SYSDATE, 1015,);

  COMMIT ;  

END INSERT_TB_STUDENT;

-- 有参数的存储过程

CREATE OR REPLACE PROCEDURE INSERT_TB_STUDENT_PARAMS (       

 STU_NAME IN VARCHAR2 ,

 STU_AGE IN NUMBER ,

 STU_SEX IN VARCHAR2 ,

 STU_BIRTHDAY IN DATE ,

 STU_CLASS_ID IN NUMBER 

)

IS  

BEGIN     

   INSERT INTO TB_STUDENT

    (STU_ID, STU_NAME, STU_AGE, STU_SEX, STU_BIRTHDAY, STU_CLASS_ID)

  VALUES

    (TB_ERROR_SEQ.NEXTVAL, STU_NAME ,STU_AGE, STU_SEX, STU_BIRTHDAY, STU_CLASS_ID);

  COMMIT ;    

END INSERT_TB_STUDENT_PARAMS ;

-- 测试存储过程的方法

BEGIN 

   INSERT_TB_STUDENT_PARAMS('张三',14,'男',SYSDATE,1015) ;

END ;

-- 存储过程实例应用之数据表定时备份:

-- 将TB_STUDENT表中的数据备份到TB_STUDENT_BACK表中、TB_BACK_MAXID表记录备份的表名、和已完成备份的最大ID

CREATE OR REPLACE PROCEDURE BACK_DATA(MAX_ID NUMBER) 

IS 

  CURSOR C_STUDENT_CURSOR IS 

  SELECT * FROM TB_STUDENT WHERE STU_ID > MAX_ID ; -- 定义游标提取TB_STUDENT表中的数据  

  TB_STUDENT_ROW TB_STUDENT%ROWTYPE ; -- 定义变量存储游标的数据  

  V_INDEX NUMBER := 0 ; -- 分段提交的标识

  V_MAX_ID NUMBER := 0 ; -- 最在备份ID

BEGIN   

  IF C_STUDENT_CURSOR%ISOPEN THEN -- 断送游标是否打开

    NULL ;

  ELSIF 

    OPEN C_STUDENT_CURSOR ;    -- 打开游标

  END IF ;        

  LOOP     

   INDEX := INDEX + 1 ;   

   FETCH C_STUDENT_CURSOR INTO TB_STUDENT_ROW ; -- 提取学生表中的数据

   EXIT WHEN C_STUDENT_CURSOR%NOTFOUND ;  

   INSERT INTO TB_STUDENT_BACK (STU_ID,STU_NAME,_STU_AGE,STU_SEX,STU_BIRTHDAY,STU_CLASS_ID)

   VALUES (C_STUDENT_ROW.STU_ID,C_STUDENT_ROW.STU_NAME,C_STUDENT_ROW.STU_AGE,C_STUDENT_ROW.STU_BIRTHDAY,C_STUDENT_ROW.STU_CLASS_ID) ;

   IF V_INDEX = 2000 THEN

     COMMIT ; -- 分段提交防止内存溢出

     V_INDEX := 0 ;

   END IF ;   

  END LOOP ;  

  SELECT MAX(MAX_ID) INTO V_MAX_ID FROM TB_STUDENT_BACK ;

  -- 备份完成及时更新已完成的最大备份ID

  UPDATE TB_BACK_MAXID SET MAX_ID = V_MAX_ID WHERE TABLE_NAME = 'TB_STUDENT' ;  

  COMMIT ;  

  CLOSE TB_STUDENT_CURSOR ;  

END BACK_DATA ;

-- 调用备份存储过程

CREATE OR REPLACE PROCEDURE EXECUTION_BACK 

IS

  V_MAX_ID NUMBER := 0 ;

BEGIN

  SELECT MAX_ID INTO V_MAX_ID FROM TB_BACK_MAXID WHERE TABLE_NAME='TB_STUDENT' ;

  BACK_DATA(V_MAX_ID) ;

END EXECUTION_BACK ;


--  测试备份存储过程

BEGIN

  EXECUTION_BACK ;

END ;

-- 定时完成备份工作

DECLARE

  JOBNO NUMBER  ;

BEGIN

  DBMS_JOB.SUBMIT(          

          JOBNO ,

          WHAT => 'EXECUTION_BACK ;' , -- 要执行的存储过程名称

          Interval => 'TRUNC(SYSDATE,''MI'')+3/(24*60)' -- 定义时间间隔每三分钟

  ) ;

  COMMIT ;

END ;

[8.2] ***************PLSQL函数***************

函数与过程的区别是函数有返回值

-- 计算年薪的函数

CREATE OR REPLACE FUNCTION FUN_COUNT_SAL(

                                          SAL IN NUMBER

                                         ) 

                                         RETURN NUMBER IS 

  

BEGIN  

  RETURN SAL*12 ;  

END FUN_COUNT_SAL;

-- 测试函数

DECLARE

 V_SAL NUMBER ;

BEGIN    

 SELECT SAL INTO V_SAL FROM EMP WHERE EMPNO='7521' ;

 DBMS_OUTPUT.PUT_LINE(FUN_COUNT_SAL(V_SAL)) ;

END ;

[8.3] ***************PLSQL程序包***************

A.-- 定义程序包 :

CREATE OR REPLACE PACKAGE FK_COUNT_SAL IS

  V_BOUNS NUMBER := 150 ; -- 定义变量每月150奖金 

  -- 定义一个求年薪的函数

  FUNCTION COUNT_EMP_SAL(V_SAL NUMBER) RETURN NUMBER ;  

  -- 定义一个添加学生的过程

  PROCEDURE INSERT_STUDENT ;  

END FK_COUNT_SAL;

B.--  定义包体用于实现包中定义的函数和方法:

CREATE OR REPLACE PACKAGE BODY FK_COUNT_SAL IS 

 FUNCTION COUNT_EMP_SAL(V_SAL NUMBER) RETURN NUMBER IS   

 BEGIN 

    RETURN (V_SAL+V_BOUNS)*12 ;

 END ;

 PROCEDURE INSERT_STUDENT IS   

 BEGIN

   INSERT INTO TB_STUDENT (STU_ID,STU_NAME,STU_AGE,STU_SEX) VALUES (TB_ERROR_SEQ.NEXTVAL,'POW',12,'男') ;

   COMMIT ;

 END ; 

END FK_COUNT_SAL;

C.-- 测试程序包

DECLARE

  V_SAL NUMBER ;  

BEGIN  

   SELECT SAL INTO V_SAL FROM EMP WHERE EMPNO = '7369' ;   

   DBMS_OUTPUT.PUT_LINE(FK_COUNT_SAL.COUNT_EMP_SAL(V_SAL => V_SAL)) ;   

   FK_COUNT_SAL.INSERT_STUDENT ;   

END ;

[8.4] ***************PLSQL触发器***************

[二]. ***************ORACLE表连接查询***************

普通等值连接(内连接)查询:

SELECT * FROM EMP E ,DEPT D WHERE E.DEPTNO = D.DEPTNO ; 可连接多张表、可用 AND 加多个条件限定结果。

标准SQL写法:

SELECT * FROM EMP E INNER JOIN DEPT D ON E.DEPTNO = D.DEPTNO ; 标准SQL写法等值连接称为内连接条件用ON限定。

外连接查询分为左外连接和右外连接:

左外连接:以左表为主表、右表为驱动表、左表中的数据全部列出、在右表中没有匹配的项则用NULL补齐。

右外连接:以右表为主表、左表为驱动表、右表中的数据全部列出、在左表中没有匹配的项则用NULL补齐。

普通写法:

SELECT * FROM EMP E ,DEPT D WHERE E.DEPTNO(+) = D.DEPTNO ; 加号在左边表示以右表为主表。

SELECT * FROM EMP E , DEPT D WHERE E.DEPTNO = D.DEPTNO(+) ; 加号在右边表示以左表为主表。

标准SQL写法:

SELECT * FROM EMP E RIGHT OUTER JOIN DEPT D ON E.DEPTNO = D.DEPTNO ; 右连接查询。

SELECT * FROM EMP E LEFT OUTER JOIN DEPT D ON E.DEPTNO = D.DEPTNO ; 左连接查询。

[三]. 组函数、GROUP BY 分组子句、ORDER BY 排序子句

HAVING 与 WHERE 的区别 :

WHERE是在分组前进行条件过滤 

HAVING是在分组后进行条件过滤

WHERE子句中不能存在分组函数

HAVING子句中可以使用分组函数

[四]. 多行比较运算符

IN 与列表中的任一成员相等

ANY 与子查询返回的每一个值比较

ALL 与子查询返回的所有值比较

SELECT * FROM EMP WHERE SAL > ANY (

SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO ) 工资大于子查询返回结果中最小的值都满足条件 。

SELECT * FROM EMP WHERE SAL < ANY (

SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO ) 工资小于子查询中返回结果最大的值都是满足条件。

SELECT * FROM EMP WHERE SAL < ALL (

SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO ) 工资小于子查询中返回结果最小的值才满足条件 。

SELECT * FROM EMP WHERE SAL > ALL (

SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO ) 大于所有返回值即大于最大的值才满足条件 。

案例:删除表中的重复数据保留一条、现在TB_STUDNET表假设STU_NAME和STU_SEX完全相同则认为是重复。

1.创建临时表 CREATE TABLE TB_STUDENT_TMP AS SELECT DISTINCT STU_NAME , STU_SEX FROM TB_STUDENT 

2.删除原有数据表中的数据 TRUNCATE TABLE TB_STUDENT

3.将临时表中的数据插回来 INSERT INTO TB_STUDENT SELECT * FROM TB_STUDENT_TMP 

案例:删除表中的重复数据不保留

DELETE FROM TB_STUDENT WHERE ROWID IN ( SELECT ROWID FROM TB_STUDENT GROUP BY  STU_NAME , STU_SEX HAVING COUNT(*) > 1 )

[五].DECODE 函数的用法

SELECT DECODE(ENAME,'SCOTT','LIUTAO','POW') ENAME ,DEPTNO FROM EMP 查询员工表如果姓名是SCOTT则显示LIUTAO否则显示WANGWU 。

[六].ORACLE 中的序列 SEQUENCE

-- 创建序列

CREATE SEQUENCE STUDENT_SEQ 

MINVALUE 1 -- 最小值

MAXVALUE 9999999 -- 最大值

START WITH 1 -- 从1开始

INCREMENT BY 1 -- 每次递增1

CACHE 20 -- 缓存20个值

SELECT STUDENT_SEQ.NEXTVAL FROM DUAL ; 查看下一值

SELECT STUDENT_SEQ.CURRVAL FROM DUAL ; 查看当前值必须是至少执行一次NEXTVAL才有值

-- 删除序列

DROP SEQUENCE STUDENT_SEQ 

[七].ORACLE中的同义词

-- 同义词 为简化操作有时需要对某些表或视图创建一个同义词来引用

CREATE SYNONYM TB_CLS FOR SCOTT.TB_CLASS ; 以后则查询TB_CLS就是查询表TB_CLASS 

[八].ORACLE中的索引 加快数据检索

主键约束和唯一性约束系统自动创建对应的索引。

手动创建索引:

CREATE INDEX TB_ERROR_SQL_MSG ON TB_ERROR(SQL_MSG) ; 为TB_ERROR表中字段SQL_MSG创建索引名称为TB_ERROR_SQL_MSG 

删除索引:

DROP INDEX TB_ERROR_SQL_MSG 

[九].ORACLE视图 简化查询

简单视图:

CREATE VIEW LIU_EMP AS SELECT * FROM SCOTT.EMP ;







易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!