Oracle 知识

【run;r;/的用法】

SQL> SELECT * FROM dept;

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     NEW YORK

        20 RESEARCH       DALLAS

        30 SALES          CHICAGO

        40 OPERATIONS     BOSTON

SQL> run

  1* SELECT * FROM dept

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     NEW YORK

        20 RESEARCH       DALLAS

        30 SALES          CHICAGO

        40 OPERATIONS     BOSTON

SQL> r

  1* SELECT * FROM dept

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     NEW YORK

        20 RESEARCH       DALLAS

        30 SALES          CHICAGO

        40 OPERATIONS     BOSTON

SQL> /

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     NEW YORK

        20 RESEARCH       DALLAS

        30 SALES          CHICAGO

        40 OPERATIONS     BOSTON

SQL>

【修改Oracle日期的默认格式】

SQL> alter session set NLS_date_format='YYYY-MM-DD';

【绑定变量查询】

SQL> SELECT * FROM dept t WHERE t.deptno = &dept_no;

输入 dept_no 的值:  40

原值    1: SELECT * FROM dept t WHERE t.deptno = &dept_no

新值    1: SELECT * FROM dept t WHERE t.deptno = 40

    DEPTNO DNAME          LOC

---------- -------------- -------------

        40 OPERATIONS     BOSTON

【绑定变量插入】

SQL> INSERT INTO dept(deptno,dname,loc) VALUES (&dept_no,'&dept_name','&loc_name');

输入 dept_no 的值:  90

输入 dept_name 的值:  work

输入 loc_name 的值:  hangzhou

原值    1: INSERT INTO dept(deptno,dname,loc) VALUES (&dept_no,'&dept_name','&loc_name')

新值    1: INSERT INTO dept(deptno,dname,loc) VALUES (90,'work','hangzhou')

已创建 1 行。

【绑定变量修改】

SQL> UPDATE dept t SET t.dname = '&d_name' WHERE t.deptno = 90;

输入 d_name 的值:  job

原值    1: UPDATE dept t SET t.dname = '&d_name' WHERE t.deptno = 90

新值    1: UPDATE dept t SET t.dname = 'job' WHERE t.deptno = 90

已更新 1 行。

【绑定变量删除】

SQL> DELETE FROM dept t WHERE t.deptno = &dept_no;

输入 dept_no 的值:  90

原值    1: DELETE FROM dept t WHERE t.deptno = &dept_no

新值    1: DELETE FROM dept t WHERE t.deptno = 90

已删除 1 行。

【利用子查询创建表】

SQL> CREATE TABLE my_dept AS SELECT * FROM dept;

表已创建。

【利用子查询插入数据】

SQL> INSERT INTO my_dept SELECT * FROM dept;

已创建4行。

【事务】

多个DML语句

单个DCL语句

单个DDL语句

【事务保存点】

SQL> SAVEPOINT p;

保存点已创建。

SQL> INSERT INTO my_dept VALUES (&dept_no,'&d_name','&loc_name');

输入 dept_no 的值:  70

输入 d_name 的值:  work

输入 loc_name 的值:  hangzhou

原值    1: INSERT INTO my_dept VALUES (&dept_no,'&d_name','&loc_name')

新值    1: INSERT INTO my_dept VALUES (70,'work','hangzhou')

已创建 1 行。

SQL> SELECT * FROM my_dept;

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     NEW YORK

        20 RESEARCH       DALLAS

        30 SALES          CHICAGO

        40 OPERATIONS     BOSTON

70 work  hangzhou

SQL> SAVEPOINT s;

保存点已创建。

SQL> ROLLBACK TO SAVEPOINT p;

回退已完成。

SQL> SELECT * FROM my_dept;

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     NEW YORK

        20 RESEARCH       DALLAS

        30 SALES          CHICAGO

        40 OPERATIONS     BOSTON

【别名】

SQL> SELECT deptno "部门编号", dname AS "部门名称", loc location FROM dept;

  部门编号 部门名称       LOCATION

---------- -------------- -------------

        10 ACCOUNTING     NEW YORK

        20 RESEARCH       DALLAS

        30 SALES          CHICAGO

        40 OPERATIONS     BOSTON

【“||”连接符】

SQL> SELECT deptno || ' -- ' || dname || ' -- ' || loc AS list FROM dept;

LIST

---------------------------------------------------------------------------

10 -- ACCOUNTING -- NEW YORK

20 -- RESEARCH -- DALLAS

30 -- SALES -- CHICAGO

40 -- OPERATIONS -- BOSTON

【“<>” 不等于】

SQL> SELECT * FROM dept WHERE deptno <> 20;

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     NEW YORK

        30 SALES          CHICAGO

        40 OPERATIONS     BOSTON

【NULL 是否为空】

SQL> SELECT * FROM emp WHERE mgr IS NULL ;

     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO

---------- ---------- --------- ---------- ---------- ---------- ---------- ----------

      7839 KING       PRESIDENT            17-11月-81       5000                    10

【函数】

LOWER

UPPER

INITCAP

CONCAT

SUBSTR

LENGTH

INSTR

LPAD

ROUND

TRUNC

MOD

MONTHS_BETWEEN

ADD_MONTHS

NEXT_DAY

LAST_DAY

NVL

DECODE

... ...

SQL> SELECT ename , CONCAT(empno,job) ejob, LENGTH(ename) len, INSTR(ename,'A') ins , LOWER(job) ljob, LPAD(job,10,'*') pjob, SUBSTR(ename,1,3) str FROM emp ;

ENAME      EJOB                                                     LEN        INS LJOB      PJOB         STR

---------- ------------------------------------------------- ---------- ---------- --------- -------------------- ------

SMITH      7369CLERK                                                  5          0 clerk     *****CLERK           SMI

ALLEN      7499SALESMAN                                               5          1 salesman  **SALESMAN           ALL

WARD       7521SALESMAN                                               4          2 salesman  **SALESMAN           WAR

JONES      7566MANAGER                                                5          0 manager   ***MANAGER           JON

MARTIN     7654SALESMAN                                               6          2 salesman  **SALESMAN           MAR

BLAKE      7698MANAGER                                                5          3 manager   ***MANAGER           BLA

CLARK      7782MANAGER                                                5          3 manager   ***MANAGER           CLA

SCOTT      7788ANALYST                                                5          0 analyst   ***ANALYST           SCO

KING       7839PRESIDENT                                              4          0 president *PRESIDENT           KIN

TURNER     7844SALESMAN                                               6          0 salesman  **SALESMAN           TUR

ADAMS      7876CLERK                                                  5          1 clerk     *****CLERK           ADA

JAMES      7900CLERK                                                  5          2 clerk     *****CLERK           JAM

FORD       7902ANALYST                                                4          0 analyst   ***ANALYST           FOR

MILLER     7934CLERK                                                  6          0 clerk     *****CLERK           MIL

已选择14行。

SQL> SELECT ROUND(45.923,2) a, ROUND(45.923,0) b, ROUND(45.923,-1) c FROM DUAL;

         A          B          C

---------- ---------- ----------

     45.92         46         50

SQL> SELECT TRUNC(45.923,2) a, TRUNC(45.923,0) b, TRUNC(45.923,-1) c FROM DUAL;

         A          B          C

---------- ---------- ----------

     45.92         45         40

【sqlplus命令】

SQL> save 'd:\a.txt';

已创建文件 d:\a.txt

SQL> get 'd:\a.txt';

  1* SELECT TRUNC(45.923,2) a, TRUNC(45.923,0) b, TRUNC(45.923,-1) c FROM DUAL

SQL> /

         A          B          C

---------- ---------- ----------

     45.92         45         40

SQL> @ 'd:\a.txt';

         A          B          C

---------- ---------- ----------

     45.92         45         40

【连接】

SQL> conn scott/tiger@ORCL

已连接。

【访问其他用户的表】

SQL> conn sys/sys as sysdba;

已连接。

SQL> select * from emp;

select * from emp

              *

ERROR 位于第 1 行:

ORA-00942: 表或视图不存在

SQL> select * from scott.emp;

     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO

---------- ---------- --------- ---------- ---------- ---------- ---------- ----------

      7369 SMITH      CLERK           7902 17-12月-80        800                    20

      7499 ALLEN      SALESMAN        7698 20-2月 -81       1600        300         30

      7521 WARD       SALESMAN        7698 22-2月 -81       1250        500         30

      7566 JONES      MANAGER         7839 02-4月 -81       2975                    20

      7654 MARTIN     SALESMAN        7698 28-9月 -81       1250       1400         30

      7698 BLAKE      MANAGER         7839 01-5月 -81       2850                    30

      7782 CLARK      MANAGER         7839 09-6月 -81       2450                    10

      7788 SCOTT      ANALYST         7566 19-4月 -87       3000                    20

      7839 KING       PRESIDENT            17-11月-81       5000                    10

      7844 TURNER     SALESMAN        7698 08-9月 -81       1500          0         30

      7876 ADAMS      CLERK           7788 23-5月 -87       1100                    20

      7900 JAMES      CLERK           7698 03-12月-81        950                    30

      7902 FORD       ANALYST         7566 03-12月-81       3000                    20

      7934 MILLER     CLERK           7782 23-1月 -82       1300                    10

已选择14行。

【修改"SQL>"的名字】

SQL> set sqlprompt tom

tomselect * from dept;

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     NEW YORK

        20 RESEARCH       DALLAS

        30 SALES          CHICAGO

        40 OPERATIONS     BOSTON

【授权】

SQL> grant select,update,insert,delete on dept to sys;

授权成功。

【撤销授权】

SQL> revoke select,update,insert,delete on dept from sys;

撤销成功。

【创建用户】

SQL> conn sys/sys as sysdba

已连接。

SQL> create user yangyz identified by yangyz ;

用户已创建

【for update wait语句】

SQL> select * from my_dept for update of deptno;

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     NEW YORK

        20 RESEARCH       DALLAS

        30 SALES          CHICAGO

        40 OPERATIONS     BOSTON

SQL> select * from my_dept for update wait 80;

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     NEW YORK

        20 RESEARCH       DALLAS

        30 SALES          CHICAGO

        40 OPERATIONS     BOSTON

【锁定表-共享锁】

SQL> LOCK TABLE my_dept IN SHARE MODE ;

表已锁定。

SQL> LOCK TABLE my_dept IN SHARE UPDATE MODE;

表已锁定。

SQL> LOCK TABLE my_dept IN EXCLUSIVE MODE;

表已锁定。

SQL> LOCK TABLE my_dept IN EXCLUSIVE MODE NOWAIT ;

【数据类型】

VARCHAR

VARCHAR2 

CHAR 

NUMBER

DATE

LONG

CLOB

RAW

LONG RAW

BLOB

BFILE

【修改表结构】

SQL> ALTER TABLE my_dept ADD(worker varchar2(20)) ;

表已更改。

SQL> desc my_dept;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ---------------------------

 DEPTNO                                             NUMBER(2)

 DNAME                                              VARCHAR2(14)

 LOC                                                VARCHAR2(13)

 WORKER                                             VARCHAR2(20)

SQL> ALTER TABLE my_dept MODIFY(worker varchar2(10)) ;

表已更改。

SQL> desc my_dept;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 DEPTNO                                             NUMBER(2)

 DNAME                                              VARCHAR2(14)

 LOC                                                VARCHAR2(13)

 WORKER                                             VARCHAR2(10)

SQL> ALTER TABLE my_dept DROP COLUMN worker;

表已更改。

SQL> desc my_dept;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 DEPTNO                                             NUMBER(2)

 DNAME                                              VARCHAR2(14)

 LOC                                                VARCHAR2(13)

 SQL> ALTER TABLE my_dept SET UNUSED COLUMN deptno;

表已更改。

SQL> desc my_dept;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 DNAME                                              VARCHAR2(14)

 LOC                                                VARCHAR2(13)

 WORKER                                             VARCHAR2(10)

SQL> ALTER TABLE my_dept DROP UNUSED COLUMNS;

表已更改。

SQL> create table student(stuid number,stuname varchar2(30),stuage number,score number(5,2));

表已创建。

SQL> ALTER TABLE student ADD CONSTRAINT pk_stu PRIMARY KEY (stuid);

表已更改。

SQL> ALTER TABLE student DROP CONSTRAINT pk_stu;

表已更改。

【查看约束表】

SQL> DESC USER_CONSTRAINTS;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 OWNER                                     NOT NULL VARCHAR2(30)

 CONSTRAINT_NAME                           NOT NULL VARCHAR2(30)

 CONSTRAINT_TYPE                                    VARCHAR2(1)

 TABLE_NAME                                NOT NULL VARCHAR2(30)

 SEARCH_CONDITION                                   LONG

 R_OWNER                                            VARCHAR2(30)

 R_CONSTRAINT_NAME                                  VARCHAR2(30)

 DELETE_RULE                                        VARCHAR2(9)

 STATUS                                             VARCHAR2(8)

 DEFERRABLE                                         VARCHAR2(14)

 DEFERRED                                           VARCHAR2(9)

 VALIDATED                                          VARCHAR2(13)

 GENERATED                                          VARCHAR2(14)

 BAD                                                VARCHAR2(3)

 RELY                                               VARCHAR2(4)

 LAST_CHANGE                                        DATE

 INDEX_OWNER                                        VARCHAR2(30)

 INDEX_NAME                                         VARCHAR2(30)

 INVALID                                            VARCHAR2(7)

 VIEW_RELATED                                       VARCHAR2(14)

 【表分区】

 范围分区法

 散列分区法 Hash分区

 复合分区法

 列表分区法

SQL> CREATE TABLE student(id number not null,name varchar2(20),score number(5,2)) PARTITION BY RANGE(score)(PARTITION p1 VALUES LESS THAN (60),PARTITION p2 VALUES LESS THAN (70),PARTITION p3 VALUES LESS THAN (80),PARTITION p4 VALUES LESS THAN (MAXVALUE));

表已创建。

SQL> CREATE TABLE teacher(id number not null,name varchar2(20),salary number(10,2)) PARTITION BY HASH(id) (PARTITION p1,PARTITION p2,PARTITION p3,PARTITION p4) ;

表已创建。

SQL> CREATE TABLE my_saldegree

     (pid number,grade number,losal number,hisal number)

       PARTITION BY RANGE(grade)

     SUBPARTITION BY HASH(losal,hisal)(

       PARTITION p1 VALUES LESS THAN(10) (SUBPARTITION sp1,SUBPARTITION sp2),

       PARTITION p2 VALUES LESS THAN(20) (SUBPARTITION sp3,SUBPARTITION sp4)

     );

表已创建。

SQL> CREATE TABLE customer (cusid number, name varchar2(20), state varchar2(20)) PARTITION BY LIST(state) (PARTITION asia VALUES('china','jpan','india'), PARTITION europe VALUES('england','franch'));

表已创建。

【查询分区】

SQL> SELECT * FROM user_tab_partitions ;

SQL> SELECT * FROM user_tab_partitions WHERE table_name = 'STUDENT';

SQL> SELECT * FROM user_tab_partitions WHERE LOWER(table_name) = 'student';

TABLE_NAME                     COM PARTITION_NAME                 SUBPARTITION_COUNT HIGH_VALUE

------------------------------ --- ------------------------------ ------------------ -----------------------

STUDENT                        NO  P1                                              0 60

STUDENT                        NO  P2                                              0 70

STUDENT                        NO  P3                                              0 80

STUDENT                        NO  P4                                              0 MAXVALUE

【修改表分区】

SQL> ALTER TABLE student DROP PARTITION p4;

表已更改。

SQL> ALTER TABLE student ADD PARTITION p5 VALUES LESS THAN (90);

表已更改。

SQL> ALTER TABLE student TRUNCATE PARTITION p5;

表已截掉。

SQL> ALTER TABLE student MERGE PARTITIONS p2,p3 INTO PARTITION p6;

表已更改。

SQL> SELECT * FROM user_tab_partitions WHERE table_name = UPPER('student');

TABLE_NAME                     COM PARTITION_NAME                 SUBPARTITION_COUNT HIGH_VALUE

------------------------------ --- ------------------------------ ------------------ ---------------------------

STUDENT                        NO  P1                                              0 60

STUDENT                        NO  P6                                              0 80

STUDENT                        NO  P5                                              0 90

【按分区查询】

SQL> SELECT * FROM student PARTITION(p1);

SQL> desc user_tab_partitions;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 TABLE_NAME                                         VARCHAR2(30)

 COMPOSITE                                          VARCHAR2(3)

 PARTITION_NAME                                     VARCHAR2(30)

 SUBPARTITION_COUNT                                 NUMBER

 HIGH_VALUE                                         LONG

 HIGH_VALUE_LENGTH                                  NUMBER

 PARTITION_POSITION                                 NUMBER

 TABLESPACE_NAME                                    VARCHAR2(30)

 PCT_FREE                                           NUMBER

 PCT_USED                                           NUMBER

 INI_TRANS                                          NUMBER

 MAX_TRANS                                          NUMBER

 INITIAL_EXTENT                                     NUMBER

 NEXT_EXTENT                                        NUMBER

 MIN_EXTENT                                         NUMBER

 MAX_EXTENT                                         NUMBER

 PCT_INCREASE                                       NUMBER

 FREELISTS                                          NUMBER

 FREELIST_GROUPS                                    NUMBER

 LOGGING                                            VARCHAR2(7)

 COMPRESSION                                        VARCHAR2(8)

 NUM_ROWS                                           NUMBER

 BLOCKS                                             NUMBER

 EMPTY_BLOCKS                                       NUMBER

 AVG_SPACE                                          NUMBER

 CHAIN_CNT                                          NUMBER

 AVG_ROW_LEN                                        NUMBER

 SAMPLE_SIZE                                        NUMBER

 LAST_ANALYZED                                      DATE

 BUFFER_POOL                                        VARCHAR2(7)

 GLOBAL_STATS                                       VARCHAR2(3)

 USER_STATS                                         VARCHAR2(3)

 SQL> desc user_ind_partitions;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 INDEX_NAME                                         VARCHAR2(30)

 COMPOSITE                                          VARCHAR2(3)

 PARTITION_NAME                                     VARCHAR2(30)

 SUBPARTITION_COUNT                                 NUMBER

 HIGH_VALUE                                         LONG

 HIGH_VALUE_LENGTH                                  NUMBER

 PARTITION_POSITION                                 NUMBER

 STATUS                                             VARCHAR2(8)

 TABLESPACE_NAME                                    VARCHAR2(30)

 PCT_FREE                                           NUMBER

 INI_TRANS                                          NUMBER

 MAX_TRANS                                          NUMBER

 INITIAL_EXTENT                                     NUMBER

 NEXT_EXTENT                                        NUMBER

 MIN_EXTENT                                         NUMBER

 MAX_EXTENT                                         NUMBER

 PCT_INCREASE                                       NUMBER

 FREELISTS                                          NUMBER

 FREELIST_GROUPS                                    NUMBER

 LOGGING                                            VARCHAR2(7)

 COMPRESSION                                        VARCHAR2(8)

 BLEVEL                                             NUMBER

 LEAF_BLOCKS                                        NUMBER

 DISTINCT_KEYS                                      NUMBER

 AVG_LEAF_BLOCKS_PER_KEY                            NUMBER

 AVG_DATA_BLOCKS_PER_KEY                            NUMBER

 CLUSTERING_FACTOR                                  NUMBER

 NUM_ROWS                                           NUMBER

 SAMPLE_SIZE                                        NUMBER

 LAST_ANALYZED                                      DATE

 BUFFER_POOL                                        VARCHAR2(7)

 USER_STATS                                         VARCHAR2(3)

 PCT_DIRECT_ACCESS                                  NUMBER

 GLOBAL_STATS                                       VARCHAR2(3)

 DOMIDX_OPSTATUS                                    VARCHAR2(6)

 PARAMETERS                                         VARCHAR2(1000)

【重复插入】

SQL> INSERT INTO student SELECT * FROM student;

已创建2行。

SQL> INSERT INTO student SELECT * FROM student;

已创建4行。

【同义词】

SQL> CREATE SYNONYM stu FOR student;

同义词已创建。

SQL> CREATE PUBLIC SYNONYM st FOR scott.student;

同义词已创建。

SQL> DROP SYNONYM stu;

同义词已丢弃。

SQL> DESC user_synonyms;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 SYNONYM_NAME                              NOT NULL VARCHAR2(30)

 TABLE_OWNER                                        VARCHAR2(30)

 TABLE_NAME                                NOT NULL VARCHAR2(30)

 DB_LINK                                            VARCHAR2(128)

【序列】

SQL> CREATE SEQUENCE seq_1 INCREMENT BY 1 START WITH 1 MAXVALUE 9999 NOMINVALUE CYCLE ;

序列已创建。

SQL> CREATE SEQUENCE seq_2 INCREMENT BY 1 START WITH 1 NOMAXVALUE MINVALUE 1 NOCYCLE NOCACHE;

序列已创建。

SQL> CREATE SEQUENCE seq_5 INCREMENT BY -1 START WITH 10 MAXVALUE 20 MINVALUE 0 NOCYCLE NOCACHE;

序列已创建。

SQL> SELECT seq_1.nextval FROM DUAL;

   NEXTVAL

----------

         1

SQL> SELECT seq_1.currval FROM DUAL;

   CURRVAL

----------

         1

SQL> ALTER SEQUENCE seq_1 MAXVALUE 99;

序列已更改。

SQL> DROP SEQUENCE seq_5;

序列已丢弃。

SQL> desc user_sequences;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 SEQUENCE_NAME                             NOT NULL VARCHAR2(30)

 MIN_VALUE                                          NUMBER

 MAX_VALUE                                          NUMBER

 INCREMENT_BY                              NOT NULL NUMBER

 CYCLE_FLAG                                         VARCHAR2(1)

 ORDER_FLAG                                         VARCHAR2(1)

 CACHE_SIZE                                NOT NULL NUMBER

 LAST_NUMBER                               NOT NULL NUMBER

【视图】

SQL> CREATE VIEW job AS SELECT empno, ename,job,mgr,hiredate,sal,comm,e.deptno,dname,loc FROM emp e, dept d WHERE e.deptno = d.deptno;

视图已建立。

SQL> CREATE OR REPLACE VIEW job AS SELECT empno, ename,job,mgr,hiredate,sal,comm,e.deptno,dname,loc FROM emp e, dept d WHERE e.deptno = d.deptno;

视图已建立。

SQL> CREATE OR REPLACE VIEW job AS SELECT empno, ename,job,mgr,hiredate,sal,comm,e.deptno,dname,loc FROM emp e, dept d WHERE e.deptno = d.deptno ORDER BY d.deptno;

视图已建立。

SQL> CREATE OR REPLACE FORCE VIEW v_none AS SELECT * FROM no_table;

警告: 创建的视图带有编译错误。

SQL> DROP VIEW v_none;

视图已丢掉。

SQL> CREATE OR REPLACE VIEW v_emp  AS SELECT * FROM emp t WHERE t.deptno = 10 UNION ALL SELECT * FROM emp e WHERE e.deptno = 20 ;

视图已建立。

SQL> ALTER VIEW v_emp COMPILE ;

视图已变更。

SQL> DESC user_views;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 VIEW_NAME                                 NOT NULL VARCHAR2(30)

 TEXT_LENGTH                                        NUMBER

 TEXT                                               LONG

 TYPE_TEXT_LENGTH                                   NUMBER

 TYPE_TEXT                                          VARCHAR2(4000)

 OID_TEXT_LENGTH                                    NUMBER

 OID_TEXT                                           VARCHAR2(4000)

 VIEW_TYPE_OWNER                                    VARCHAR2(30)

 VIEW_TYPE                                          VARCHAR2(30)

 SUPERVIEW_NAME                                     VARCHAR2(30)

【rownum,rowid】

SQL> select rownum,rowid from dual;

    ROWNUM ROWID

---------- ------------------

         1 AAAADeAABAAAAZSAAA

SQL> SELECT t.* ,rowid FROM emp t WHERE rowid = 'AAAHW7AABAAAMUiAAA';

     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO ROWID

---------- ---------- --------- ---------- ---------- ---------- ---------- ---------- ------------------

      7369 SMITH      CLERK           7902 17-12月-80        800                    20 AAAHW7AABAAAMUiAAA

SQL> select * from emp where rownum <= 3;

     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO

---------- ---------- --------- ---------- ---------- ---------- ---------- ----------

      7369 SMITH      CLERK           7902 17-12月-80        800                    20

      7499 ALLEN      SALESMAN        7698 20-2月 -81       1600        300         30

      7521 WARD       SALESMAN        7698 22-2月 -81       1250        500         30

SQL> select * from emp where rownum = 3;

未选定行

【索引】

唯一索引

组合索引

反向键索引

位图索引

键压缩索引

分区索引

SQL> CREATE UNIQUE INDEX idx_stuid ON student(id);

索引已创建。

SQL> CREATE INDEX idx_empno_deptno ON emp(empno,deptno);

索引已创建。

SQL> DROP INDEX idx_stuid;

索引已丢弃。

SQL> CREATE BITMAP INDEX idx_job ON my_emp(job);

索引已创建。

SQL> CREATE TABLE indexorg (id number primary key, name varchar2(20)) ORGANIZATION INDEX ;

表已创建。

SQL> CREATE INDEX idx_ename ON scott.my_emp(LOWER(ename));

索引已创建。

SQL> CREATE INDEX idx_job_ename ON employee(job,ename) COMPRESS 1 ;

索引已创建。

【簇】

SQL> CREATE CLUSTER class_clsuter(classno varchar2(10)) TABLESPACE users;

已创建数据簇。

SQL> CREATE INDEX idx_class_cluster ON cluster class_clsuter;

索引已创建。

SQL> CREATE TABLE stuclass(classno varchar2(10), classname varchar2(20)) CLUSTER class_clsuter(classno);

表已创建。

SQL> CREATE TABLE classstu(stuno varchar2(10), stuname varchar2(20),classno varchar2(10)) CLUSTER class_clsuter(classno) ;

表已创建。

SQL> DROP CLUSTER class_clsuter INCLUDING TABLES ;

数据簇已丢弃。

SQL> desc user_clusters;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 CLUSTER_NAME                              NOT NULL VARCHAR2(30)

 TABLESPACE_NAME                           NOT NULL VARCHAR2(30)

 PCT_FREE                                           NUMBER

 PCT_USED                                           NUMBER

 KEY_SIZE                                           NUMBER

 INI_TRANS                                 NOT NULL NUMBER

 MAX_TRANS                                 NOT NULL NUMBER

 INITIAL_EXTENT                                     NUMBER

 NEXT_EXTENT                                        NUMBER

 MIN_EXTENTS                               NOT NULL NUMBER

 MAX_EXTENTS                               NOT NULL NUMBER

 PCT_INCREASE                                       NUMBER

 FREELISTS                                          NUMBER

 FREELIST_GROUPS                                    NUMBER

 AVG_BLOCKS_PER_KEY                                 NUMBER

 CLUSTER_TYPE                                       VARCHAR2(5)

 FUNCTION                                           VARCHAR2(15)

 HASHKEYS                                           NUMBER

 DEGREE                                             VARCHAR2(10)

 INSTANCES                                          VARCHAR2(10)

 CACHE                                              VARCHAR2(5)

 BUFFER_POOL                                        VARCHAR2(7)

 SINGLE_TABLE                                       VARCHAR2(5)

 DEPENDENCIES                                       VARCHAR2(8)

 【ORDBMS和RDBMS】

 面向过程和面向对象

 【抽象数据类型】

SQL> CREATE OR REPLACE TYPE addresss_type AS OBJECT (province varchar2(20), city varchar2(20), details varchar2(40))

  2  /

类型已创建。

SQL> CREATE OR REPLACE TYPE provider AS OBJECT (proname varchar2(20), address addresss_type)

  2  /

类型已创建。

SQL> CREATE TABLE providers (proid number, prodetail provider);

表已创建。

SQL> CREATE TABLE provider_tab OF provider ;

表已创建。

SQL> INSERT INTO providers VALUES (101,provider('XX公司',addresss_type('浙江','杭州','滨江滨康路1号')));

已创建 1 行。

SQL> CREATE OR REPLACE TYPE person AS OBJECT (pid number, pname varchar2(20)) NOT FINAL ;

  2  /

类型已创建。

SQL> CREATE OR REPLACE TYPE worker UNDER person (salary number(10,2));

  2  /

类型已创建。

SQL> INSERT INTO workers SELECT worker(1001,'zhangsan',5000) FROM dual;

已创建 1 行。

SQL> CREATE OR REPLACE TYPE programer AS OBJECT(pid number, pname varchar2(20), address addresss_type, MEMBER FUNCTION getaddress RETURN addresss_type, MEMBER PROCEDURE setaddress(newaddress addresss_type));

  2  /

类型已创建。

SQL> CREATE OR REPLACE TYPE BODY programer AS 

MEMBER FUNCTION getaddress RETURN addresss_type IS

BEGIN

RETURN address;

END;

MEMBER PROCEDURE setaddress(newaddress addresss_type) IS

BEGIN

address := newaddress;

END;

END;

类型主体已创建。

SQL> SELECT * FROM providers;

     PROID PRODETAIL(PRONAME, ADDRESS(PROVINCE, CITY, DETAILS))

       101 PROVIDER('XX公司', ADDRESSS_TYPE('浙江', '杭州', '滨江滨康路1号'))

SQL> SELECT s.proid, s.prodetail.proname, s.prodetail.address.province, s.prodetail.address.city, s.prodetail.address.details FROM providers s;

     PROID PRODETAIL.PRONAME    PRODETAIL.ADDRESS.PR PRODETAIL.ADDRESS.CI PRODETAIL.ADDRESS.DETAILS

---------- -------------------- -------------------- -------------------- ----------------------------------------

       101 XX公司               浙江                 杭州                 滨江滨康路1号

SQL> SELECT s.proid id, s.prodetail.proname proname, s.prodetail.address.province province, s.prodetail.address.city city, s.prodetail.address.details addressdetail FROM providers s;

        ID PRONAME              PROVINCE             CITY                 ADDRESSDETAIL

---------- -------------------- -------------------- -------------------- ----------------------------------------

       101 XX公司               浙江                 杭州                 滨江滨康路1号

SQL> UPDATE providers s SET s.prodetail.address.details = '西湖区文一路' WHERE s.proid = 101;

已更新 1 行。

SQL> UPDATE providers s SET s.prodetail.address = addresss_type('浙江','杭州','萧山区萧绍路') WHERE s.proid = 101;

已更新 1 行。

SQL> DESC user_types;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ---------------

 TYPE_NAME                                 NOT NULL VARCHAR2(30)

 TYPE_OID                                  NOT NULL RAW(16)

 TYPECODE                                           VARCHAR2(30)

 ATTRIBUTES                                         NUMBER

 METHODS                                            NUMBER

 PREDEFINED                                         VARCHAR2(3)

 INCOMPLETE                                         VARCHAR2(3)

 FINAL                                              VARCHAR2(3)

 INSTANTIABLE                                       VARCHAR2(3)

 SUPERTYPE_OWNER                                    VARCHAR2(30)

 SUPERTYPE_NAME                                     VARCHAR2(30)

 LOCAL_ATTRIBUTES                                   NUMBER

 LOCAL_METHODS                                      NUMBER

 TYPEID                                             RAW(16)

SQL> desc user_type_attrs;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- --------------------------

 TYPE_NAME                                 NOT NULL VARCHAR2(30)

 ATTR_NAME                                 NOT NULL VARCHAR2(30)

 ATTR_TYPE_MOD                                      VARCHAR2(7)

 ATTR_TYPE_OWNER                                    VARCHAR2(30)

 ATTR_TYPE_NAME                                     VARCHAR2(30)

 LENGTH                                             NUMBER

 PRECISION                                          NUMBER

 SCALE                                              NUMBER

 CHARACTER_SET_NAME                                 VARCHAR2(44)

 ATTR_NO                                   NOT NULL NUMBER

 INHERITED                                          VARCHAR2(3)

 SQL> DESC user_tab_columns;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- -------------------------

 TABLE_NAME                                NOT NULL VARCHAR2(30)

 COLUMN_NAME                               NOT NULL VARCHAR2(30)

 DATA_TYPE                                          VARCHAR2(106)

 DATA_TYPE_MOD                                      VARCHAR2(3)

 DATA_TYPE_OWNER                                    VARCHAR2(30)

 DATA_LENGTH                               NOT NULL NUMBER

 DATA_PRECISION                                     NUMBER

 DATA_SCALE                                         NUMBER

 NULLABLE                                           VARCHAR2(1)

 COLUMN_ID                                          NUMBER

 DEFAULT_LENGTH                                     NUMBER

 DATA_DEFAULT                                       LONG

 NUM_DISTINCT                                       NUMBER

 LOW_VALUE                                          RAW(32)

 HIGH_VALUE                                         RAW(32)

 DENSITY                                            NUMBER

 NUM_NULLS                                          NUMBER

 NUM_BUCKETS                                        NUMBER

 LAST_ANALYZED                                      DATE

 SAMPLE_SIZE                                        NUMBER

 CHARACTER_SET_NAME                                 VARCHAR2(44)

 CHAR_COL_DECL_LENGTH                               NUMBER

 GLOBAL_STATS                                       VARCHAR2(3)

 USER_STATS                                         VARCHAR2(3)

 AVG_COL_LEN                                        NUMBER

 CHAR_LENGTH                                        NUMBER

 CHAR_USED                                          VARCHAR2(1)

 V80_FMT_IMAGE                                      VARCHAR2(3)

 DATA_UPGRADED                                      VARCHAR2(3)

 SQL> desc user_dependencies;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 NAME                                      NOT NULL VARCHAR2(30)

 TYPE                                               VARCHAR2(17)

 REFERENCED_OWNER                                   VARCHAR2(30)

 REFERENCED_NAME                                    VARCHAR2(64)

 REFERENCED_TYPE                                    VARCHAR2(17)

 REFERENCED_LINK_NAME                               VARCHAR2(128)

 SCHEMAID                                           NUMBER

 DEPENDENCY_TYPE                                    VARCHAR2(4)

 SQL> SELECT * from user_types;

TYPE_NAME                      TYPE_OID                         TYPECODE                       ATTRIBUTES    METHODS PRE INC FIN INS SUPERTYPE_OWNER                SUPERTYPE_NAME                 LOCAL_ATTRIBUTES LOCAL_METHODS TYPEID

------------------------------ -------------------------------- ------------------------------ ---------- ---------- --- --- --- --- ------------------------------ ------------------------------ ---------------- ------------- ----------------------

ADDRESSS_TYPE                  53B7FBD04821463B8EDD5C3290527745 OBJECT                               3     0 NO  NO  YES YES

PROVIDER                       A34E3BE1A9F343B6B74C782BB53111D4 OBJECT                               2     0 NO  NO  YES YES

【可变数组】

SQL> CREATE OR REPLACE TYPE detail_type AS OBJECT

  2  (

  3     goodsid    number,

  4     incount    number,

  5     providerid number

  6  ) ;

  7  /

类型已创建。

SQL> CREATE OR REPLACE TYPE detail_array AS VARRAY(10) OF detail_type ;

  2  /

类型已创建。

SQL> CREATE TABLE income_stock_order(orderid number not null primary key, indate date, operatorid number, orderdetail detail_array);

表已创建。

SQL> INSERT INTO income_stock_order VALUES (1001,sysdate,9010,detail_array(detail_type(111,111,111),detail_type(222,222,222),detail_type(333,333,333)));

已创建 1 行。

SQL> SELECT * FROM TABLE(SELECT orderdetail  FROM income_stock_order WHERE orderid = 1001) ;

   GOODSID    INCOUNT PROVIDERID

---------- ---------- ----------

       111        111        111

       222        222        222

       333        333        333

SQL> UPDATE income_stock_order SET orderdetail = detail_array(detail_type(112,121,211),detail_type(822,228,282),detail_type(533,553,343)) WHERE orderid = 1001;

已更新 1 行。

【嵌套表】

SQL> CREATE OR REPLACE TYPE order_detail_type AS OBJECT (goodsid number, incount number, customerid number) NOT FINAL ;

  2  /

类型已创建。

SQL> CREATE OR REPLACE TYPE order_detail_table AS TABLE OF order_detail_type ;

  2  /

类型已创建。

SQL> CREATE TABLE order_tab (oid number not null primary key, orderinfo order_detail_table) NESTED TABLE orderinfo STORE AS order_detail_tab;

表已创建。

SQL> INSERT INTO order_tab VALUES(1001,order_detail_table(order_detail_type(10001,111,9001),order_detail_type(10002,222,9002)));

已创建 1 行。

SQL> UPDATE TABLE (SELECT t.orderinfo FROM order_tab t WHERE t.oid = 1001) f SET f.incount = 888 WHERE f.goodsid = 10001 ;

已更新 1 行。

SQL> SELECT * FROM TABLE(SELECT p.orderinfo FROM order_tab p WHERE p.oid = 1001) ;

   GOODSID    INCOUNT CUSTOMERID

---------- ---------- ----------

     10001        888       9001

     10002        222       9002

SQL> DELETE FROM TABLE(SELECT t.orderinfo FROM order_tab t WHERE t.oid = 1001) p WHERE p.goodsid = 10001 ;

已删除 1 行。

【对象表】

SQL> CREATE TABLE object_table_1 OF order_detail_type ;

表已创建。

SQL> INSERT INTO object_table_1 VALUES(1,111,1111);

已创建 1 行。

SQL> SELECT REF(t) oid, goodsid, incount, customerid FROM object_table_1 t;

REF(T)       ROWID          GOODSID    INCOUNT CUSTOMERID

-------------------------------------------------------------------------------------- ------------------ ---------- ---------- ----------

00002802098704AA06FE584639B73A9DE783CEA4B55AE86FAF762243DEA2D20C0D8CB9A22D0040D5C20000 AAAHboAABAAANXCAAA   1        111       1111

SQL> CREATE OR REPLACE TYPE office_type AS OBJECT (fid number, fname varchar2(20)) ;

  2  /

类型已创建。

SQL> CREATE TABLE office_table OF office_type ;

表已创建。

SQL> INSERT INTO office_table VALUES(101,'研发部');

已创建 1 行。

SQL> CREATE TABLE worker_tab (wid number,wname varchar2(20), office REF office_type  SCOPE IS office_table) ;

表已创建。

SQL> INSERT INTO worker_tab SELECT 7369, 'zhangsan', REF(t) FROM office_table t;

已创建 1 行。

SQL> SELECT w.wid ,w.wname,DEREF(w.office) FROM worker_tab w;

       WID WNAME

---------- --------------------

DEREF(W.OFFICE)(FID, FNAME)

---------------------------------------------------------------

      7369 zhangsan

OFFICE_TYPE(101, '研发部')

SQL> SELECT VALUE(f) FROM office_table f;

VALUE(F)(FID, FNAME)

------------------------------------------

OFFICE_TYPE(101, '研发部')

SQL> CREATE VIEW office_view OF office_type WITH OBJECT oid(fid) AS SELECT * FROM office_table;

视图已建立。

SQL> CREATE OR REPLACE TYPE dept_type AS OBJECT(deptno number, dnam varchar2(20),loc varchar2(20)) ;

  2  /

类型已创建。

SQL> CREATE VIEW dept_view OF dept_type WITH OBJECT OID(deptno) AS SELECT * FROM dept;

视图已建立。

SQL> CREATE VIEW emp_view AS SELECT MAKE_REF(dept_view,deptno) dept_oid ,empno , ename FROM emp ;

视图已建立。

【用户管理】

SQL> DESC user_users;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 USERNAME                                  NOT NULL VARCHAR2(30)

 USER_ID                                   NOT NULL NUMBER

 ACCOUNT_STATUS                            NOT NULL VARCHAR2(32)

 LOCK_DATE                                          DATE

 EXPIRY_DATE                                        DATE

 DEFAULT_TABLESPACE                        NOT NULL VARCHAR2(30)

 TEMPORARY_TABLESPACE                      NOT NULL VARCHAR2(30)

 CREATED                                   NOT NULL DATE

 INITIAL_RSRC_CONSUMER_GROUP                        VARCHAR2(30)

 EXTERNAL_NAME                                      VARCHAR2(4000)

SQL> DESC dba_users;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 USERNAME                                  NOT NULL VARCHAR2(30)

 USER_ID                                   NOT NULL NUMBER

 PASSWORD                                           VARCHAR2(30)

 ACCOUNT_STATUS                            NOT NULL VARCHAR2(32)

 LOCK_DATE                                          DATE

 EXPIRY_DATE                                        DATE

 DEFAULT_TABLESPACE                        NOT NULL VARCHAR2(30)

 TEMPORARY_TABLESPACE                      NOT NULL VARCHAR2(30)

 CREATED                                   NOT NULL DATE

 PROFILE                                   NOT NULL VARCHAR2(30)

 INITIAL_RSRC_CONSUMER_GROUP                        VARCHAR2(30)

 EXTERNAL_NAME                                      VARCHAR2(4000)

SQL> DESC all_users;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 USERNAME                                  NOT NULL VARCHAR2(30)

 USER_ID                                   NOT NULL NUMBER

 CREATED                                   NOT NULL DATE

CREATE|ALTER USER 用户名 IDENTIFIED BY 口令 [EXTERNALLY]

DEFAULT TABLESPACE 表空间名

TEMPORARY TABLESPACE 表空间名

QUOTA 整数 K|M|UNLIMITED ON 表空间名

CREATE|ALTER USER student_user

IDENTIFIED BY student_password

DEFAULT TABLESPACE student_table_space

TEMPORARY TABLESPACE temp_student_tablespace

QUOTA 5M ON student_table_space

QUOTA 10M ON temp_student_tablespace

SQL> CREATE USER student_user

     IDENTIFIED BY student_password

     DEFAULT TABLESPACE users

     TEMPORARY TABLESPACE temp

     QUOTA 5M ON users

     QUOTA 10M ON temp

     ;

用户已创建

SQL> ALTER USER student_user ACCOUNT LOCK;

用户已更改。

SQL> ALTER USER student_user ACCOUNT UNLOCK ;

用户已更改。

SQL> ALTER USER student_user PASSWORD EXPIRE;

用户已更改。

SQL> DROP USER student_user CASCADE;

用户已丢弃

SQL> SHOW PARAMETER;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

O7_DICTIONARY_ACCESSIBILITY          boolean     FALSE

active_instance_count                integer

aq_tm_processes                      integer     1

archive_lag_target                   integer     0

audit_sys_operations                 boolean     FALSE

audit_trail                          string      NONE

background_core_dump                 string      partial

background_dump_dest                 string      D:\oracle\admin\ORCL\bdump

backup_tape_io_slaves                boolean     FALSE

bitmap_merge_area_size               integer     1048576

blank_trimming                       boolean     FALSE

buffer_pool_keep                     string

buffer_pool_recycle                  string

circuits                             integer     170

cluster_database                     boolean     FALSE

cluster_database_instances           integer     1

cluster_interconnects                string

commit_point_strength                integer     1

compatible                           string      9.2.0.0.0

control_file_record_keep_time        integer     7

control_files                        string      D:\oracle\oradata\ORCL\CONTROL

                                                 01.CTL, D:\oracle\oradata\ORCL

                                                 \CONTROL02.CTL, D:\oracle\orad

                                                 ata\ORCL\CONTROL03.CTL

core_dump_dest                       string      D:\oracle\admin\ORCL\cdump

cpu_count                            integer     2

create_bitmap_area_size              integer     8388608

cursor_sharing                       string      EXACT

cursor_space_for_time                boolean     FALSE

db_16k_cache_size                    big integer 0

db_2k_cache_size                     big integer 0

db_32k_cache_size                    big integer 0

db_4k_cache_size                     big integer 0

db_8k_cache_size                     big integer 0

db_block_buffers                     integer     0

db_block_checking                    boolean     FALSE

db_block_checksum                    boolean     TRUE

db_block_size                        integer     8192

db_cache_advice                      string      ON

db_cache_size                        big integer 25165824

db_create_file_dest                  string

db_create_online_log_dest_1          string

db_create_online_log_dest_2          string

db_create_online_log_dest_3          string

db_create_online_log_dest_4          string

db_create_online_log_dest_5          string

db_domain                            string

db_file_multiblock_read_count        integer     16

db_file_name_convert                 string

db_files                             integer     200

db_keep_cache_size                   big integer 0

db_name                              string      ORCL

db_recycle_cache_size                big integer 0

db_writer_processes                  integer     1

dblink_encrypt_login                 boolean     FALSE

dbwr_io_slaves                       integer     0

dg_broker_config_file1               string      %ORACLE_HOME%\DATABASE\DR1%ORA

                                                 CLE_SID%.DAT

dg_broker_config_file2               string      %ORACLE_HOME%\DATABASE\DR2%ORA

                                                 CLE_SID%.DAT

dg_broker_start                      boolean     FALSE

disk_asynch_io                       boolean     TRUE

dispatchers                          string      (PROTOCOL=TCP) (SERVICE=ORCLXD

                                                 B)

distributed_lock_timeout             integer     60

dml_locks                            integer     748

drs_start                            boolean     FALSE

enqueue_resources                    integer     968

event                                string

fal_client                           string

fal_server                           string

fast_start_io_target                 integer     0

fast_start_mttr_target               integer     300

fast_start_parallel_rollback         string      LOW

file_mapping                         boolean     FALSE

filesystemio_options                 string

fixed_date                           string

gc_files_to_locks                    string

global_context_pool_size             string

global_names                         boolean     FALSE

hash_area_size                       integer     1048576

hash_join_enabled                    boolean     TRUE

hi_shared_memory_address             integer     0

hs_autoregister                      boolean     TRUE

ifile                                file

instance_groups                      string

instance_name                        string      ORCL

instance_number                      integer     0

java_max_sessionspace_size           integer     0

java_pool_size                       big integer 33554432

java_soft_sessionspace_limit         integer     0

job_queue_processes                  integer     10

large_pool_size                      big integer 8388608

license_max_sessions                 integer     0

license_max_users                    integer     0

license_sessions_warning             integer     0

local_listener                       string

lock_name_space                      string

lock_sga                             boolean     FALSE

log_archive_dest                     string

log_archive_dest_1                   string

log_archive_dest_10                  string

log_archive_dest_2                   string

log_archive_dest_3                   string

log_archive_dest_4                   string

log_archive_dest_5                   string

log_archive_dest_6                   string

log_archive_dest_7                   string

log_archive_dest_8                   string

log_archive_dest_9                   string

log_archive_dest_state_1             string      enable

log_archive_dest_state_10            string      enable

log_archive_dest_state_2             string      enable

log_archive_dest_state_3             string      enable

log_archive_dest_state_4             string      enable

log_archive_dest_state_5             string      enable

log_archive_dest_state_6             string      enable

log_archive_dest_state_7             string      enable

log_archive_dest_state_8             string      enable

log_archive_dest_state_9             string      enable

log_archive_duplex_dest              string

log_archive_format                   string      ARC%S.%T

log_archive_max_processes            integer     2

log_archive_min_succeed_dest         integer     1

log_archive_start                    boolean     FALSE

log_archive_trace                    integer     0

log_buffer                           integer     524288

log_checkpoint_interval              integer     0

log_checkpoint_timeout               integer     1800

log_checkpoints_to_alert             boolean     FALSE

log_file_name_convert                string

log_parallelism                      integer     1

logmnr_max_persistent_sessions       integer     1

max_commit_propagation_delay         integer     700

max_dispatchers                      integer     5

max_dump_file_size                   string      UNLIMITED

max_enabled_roles                    integer     30

max_rollback_segments                integer     37

max_shared_servers                   integer     20

mts_circuits                         integer     170

mts_dispatchers                      string      (PROTOCOL=TCP) (SERVICE=ORCLXD

                                                 B)

mts_listener_address                 string

mts_max_dispatchers                  integer     5

mts_max_servers                      integer     20

mts_multiple_listeners               boolean     FALSE

mts_servers                          integer     1

mts_service                          string      ORCL

mts_sessions                         integer     165

nls_calendar                         string

nls_comp                             string

nls_currency                         string

nls_date_format                      string

nls_date_language                    string

nls_dual_currency                    string

nls_iso_currency                     string

nls_language                         string      AMERICAN

nls_length_semantics                 string      BYTE

nls_nchar_conv_excp                  string      FALSE

nls_numeric_characters               string

nls_sort                             string

nls_territory                        string      AMERICA

nls_time_format                      string

nls_time_tz_format                   string

nls_timestamp_format                 string

nls_timestamp_tz_format              string

object_cache_max_size_percent        integer     10

object_cache_optimal_size            integer     102400

olap_page_pool_size                  integer     33554432

open_cursors                         integer     300

open_links                           integer     4

open_links_per_instance              integer     4

optimizer_dynamic_sampling           integer     1

optimizer_features_enable            string      9.2.0

optimizer_index_caching              integer     0

optimizer_index_cost_adj             integer     100

optimizer_max_permutations           integer     2000

optimizer_mode                       string      CHOOSE

oracle_trace_collection_name         string

oracle_trace_collection_path         string      %ORACLE_HOME%\OTRACE\ADMIN\CDF

                                                 \

oracle_trace_collection_size         integer     5242880

oracle_trace_enable                  boolean     FALSE

oracle_trace_facility_name           string      oracled

oracle_trace_facility_path           string      %ORACLE_HOME%\OTRACE\ADMIN\FDF

                                                 \

os_authent_prefix                    string      OPS$

os_roles                             boolean     FALSE

parallel_adaptive_multi_user         boolean     FALSE

parallel_automatic_tuning            boolean     FALSE

parallel_execution_message_size      integer     2148

parallel_instance_group              string

parallel_max_servers                 integer     5

parallel_min_percent                 integer     0

parallel_min_servers                 integer     0

parallel_server                      boolean     FALSE

parallel_server_instances            integer     1

parallel_threads_per_cpu             integer     2

partition_view_enabled               boolean     FALSE

pga_aggregate_target                 big integer 25165824

plsql_compiler_flags                 string      INTERPRETED

plsql_native_c_compiler              string

plsql_native_library_dir             string

plsql_native_library_subdir_count    integer     0

plsql_native_linker                  string

plsql_native_make_file_name          string

plsql_native_make_utility            string

plsql_v2_compatibility               boolean     FALSE

pre_page_sga                         boolean     FALSE

processes                            integer     150

query_rewrite_enabled                string      FALSE

query_rewrite_integrity              string      enforced

rdbms_server_dn                      string

read_only_open_delayed               boolean     FALSE

recovery_parallelism                 integer     0

remote_archive_enable                string      true

remote_dependencies_mode             string      TIMESTAMP

remote_listener                      string

remote_login_passwordfile            string      EXCLUSIVE

remote_os_authent                    boolean     FALSE

remote_os_roles                      boolean     FALSE

replication_dependency_tracking      boolean     TRUE

resource_limit                       boolean     FALSE

resource_manager_plan                string

rollback_segments                    string

row_locking                          string      always

serial_reuse                         string      DISABLE

serializable                         boolean     FALSE

service_names                        string      ORCL

session_cached_cursors               integer     0

session_max_open_files               integer     10

sessions                             integer     170

sga_max_size                         big integer 135338868

shadow_core_dump                     string      partial

shared_memory_address                integer     0

shared_pool_reserved_size            big integer 2516582

shared_pool_size                     big integer 50331648

shared_server_sessions               integer     165

shared_servers                       integer     1

sort_area_retained_size              integer     0

sort_area_size                       integer     524288

spfile                               string      %ORACLE_HOME%\DATABASE\SPFILE%

                                                 ORACLE_SID%.ORA

sql92_security                       boolean     FALSE

sql_trace                            boolean     FALSE

sql_version                          string      NATIVE

standby_archive_dest                 string      %ORACLE_HOME%\RDBMS

standby_file_management              string      MANUAL

star_transformation_enabled          string      FALSE

statistics_level                     string      TYPICAL

tape_asynch_io                       boolean     TRUE

thread                               integer     0

timed_os_statistics                  integer     0

timed_statistics                     boolean     TRUE

trace_enabled                        boolean     TRUE

tracefile_identifier                 string

transaction_auditing                 boolean     TRUE

transactions                         integer     187

transactions_per_rollback_segment    integer     5

undo_management                      string      AUTO

undo_retention                       integer     10800

undo_suppress_errors                 boolean     FALSE

undo_tablespace                      string      UNDOTBS1

use_indirect_data_buffers            boolean     FALSE

user_dump_dest                       string      D:\oracle\admin\ORCL\udump

utl_file_dir                         string

workarea_size_policy                 string      AUTO

【权限管理】

SQL> GRANT select,update,insert,delete ON scott.my_emp TO student_user WITH ADMIN OPTION;

授权成功。

SQL> GRANT create table, create view, create sequence TO student_user;

授权成功。

SQL> GRANT create session TO student_user;

授权成功。

SQL> GRANT all ON scott.my_emp TO PUBLIC ;

授权成功。

SQL> REVOKE all ON scott.my_emp FROM PUBLIC ;

撤销成功。

SQL> REVOKE create table FROM student_user;

撤销成功。

SQL> REVOKE insert ON scott.my_emp FROM student_user ;

撤销成功。

SQL> DESC user_sys_privs;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 USERNAME                                           VARCHAR2(30)

 PRIVILEGE                                 NOT NULL VARCHAR2(40)

 ADMIN_OPTION                                       VARCHAR2(3)

 SQL> DESC dba_sys_privs;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ---------------------------

 GRANTEE                                   NOT NULL VARCHAR2(30)

 PRIVILEGE                                 NOT NULL VARCHAR2(40)

 ADMIN_OPTION                                       VARCHAR2(3)

【角色管理】

SQL> CREATE ROLE student_role;

角色已创建

SQL> GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE SEQUENCE, CREATE PROCEDURE TO student_role;

授权成功。

SQL> GRANT student_role TO student_user;

授权成功。

SQL> REVOKE create session FROM student_role;

撤销成功。

SQL> DROP ROLE student_role;

角色已丢弃

【PL/SQL编程】

SQL> SET SERVEROUTPUT ON;

SQL> DECLARE emp_no varchar2(10);

  2     emp_name varchar2(20);

  3     is_exist boolean default false ;

  4     emp_sex constant char := 'M' ;

  5  BEGIN

  6     emp_no := '8888';

  7     emp_name := 'zhangsan';

  8  END;

  9  /

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     e_no     VARCHAR2(10) := '1001';

  3     e_name   VARCHAR2(20) := 'zhangsan';

  4     is_exist BOOLEAN DEFAULT TRUE;

  5     e_info CONSTANT VARCHAR2(30) := 'hello oracle';

  6  BEGIN

  7     e_no := '8888';

  8     dbms_output.put_line('e_no='||e_no||' e_name='||e_name||' e_info='||e_info);

  9  END;

 10  /

e_no=8888 e_name=zhangsan e_info=hello oracle

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     e_no     VARCHAR2(10);

  3     e_name   VARCHAR2(20);

  4     is_exist BOOLEAN DEFAULT TRUE;

  5     e_info CONSTANT VARCHAR2(30) := 'hello oracle';

  6  BEGIN

  7     SELECT empno, ename INTO e_no, e_name FROM emp WHERE empno = 7369;

  8     dbms_output.put_line('e_no=' || e_no || ' e_name=' || e_name ||

  9                                                                                      ' e_info=' || e_info);

 10  END;

 11  /

e_no=7369 e_name=SMITH e_info=hello oracle

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     e_no     VARCHAR2(10);

  3     e_name   VARCHAR2(20);

  4     is_exist BOOLEAN DEFAULT TRUE;

  5     e_info CONSTANT VARCHAR2(30) := 'hello oracle';

  6  BEGIN

  7     SELECT empno INTO e_no FROM emp WHERE empno = 7369;

  8     e_name := 'zhangsan' ;

  9     dbms_output.put_line('e_no=' || e_no || ' e_name=' || e_name ||' e_info=' || e_info);

 10  END;

 11  /

e_no=7369 e_name=zhangsan e_info=hello oracle

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     emp_no   emp.empno %TYPE;

  3     emp_name emp.ename%TYPE;

  4     emp_row  emp%ROWTYPE;

  5  BEGIN

  6     SELECT empno, ename INTO emp_no, emp_name FROM emp WHERE empno = 7369;

  7     SELECT * INTO emp_row FROM emp WHERE empno = 7788;

  8     dbms_output.put_line('empno:' || emp_no || ' ' || 'ename:' || emp_name);

  9  EXCEPTION

 10     WHEN no_data_found THEN

 11             dbms_output.put_line('没有数据');

 12  END;

 13  /

empno:7369 ename:SMITH

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     emp_no   emp.empno %TYPE;

  3     emp_name emp.ename%TYPE;

  4     emp_row  emp%ROWTYPE;

  5  BEGIN

  6     SELECT empno, ename INTO emp_no, emp_name FROM emp WHERE empno = 7369;

  7     SELECT * INTO emp_row FROM emp WHERE empno = 7788;

  8     dbms_output.put_line('empno:' || emp_no || ' ' || 'ename:' || emp_name);

  9     dbms_output.put_line('empno:' || emp_row.empno || ' ' || 'ename:' || emp_row.ename);

 10  EXCEPTION

 11     WHEN no_data_found THEN

 12             dbms_output.put_line('没有数据');

 13  END;

 14  /

empno:7369 ename:SMITH

empno:7788 ename:SCOTT

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     emp_no   emp.empno %TYPE;

  3     emp_name emp.ename%TYPE;

  4     emp_row  emp%ROWTYPE;

  5     today    DATE;

  6  BEGIN

  7     SELECT empno, ename INTO emp_no, emp_name FROM emp WHERE empno = 7369;

  8     SELECT * INTO emp_row FROM emp WHERE empno = 7788;

  9     today := SYSDATE;

 10     IF (today > '12-1月-99')

 11     THEN

 12             dbms_output.put_line('YES!!!');

 13     ELSE

 14             dbms_output.put_line('NO!!!');

 15     END IF;

 16     dbms_output.put_line('empno:' || emp_no || ' ' || 'ename:' || emp_name);

 17     dbms_output.put_line('empno:' || emp_row.empno || ' ' || 'ename:' ||

 18                                                                                      emp_row.ename);

 19  EXCEPTION

 20     WHEN no_data_found THEN

 21             dbms_output.put_line('没有数据');

 22  END;

 23  /

YES!!!

empno:7369 ename:SMITH

empno:7788 ename:SCOTT

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     emp_no   emp.empno %TYPE;

  3     emp_name emp.ename%TYPE;

  4     emp_row  emp%ROWTYPE;

  5     today    DATE;

  6  BEGIN

  7     SELECT empno, ename INTO emp_no, emp_name FROM emp WHERE empno = 7369;

  8     SELECT * INTO emp_row FROM emp WHERE empno = 7788;

  9     today := SYSDATE;

 10     IF today > to_date('1999-01-01', 'YYYY-MM-DD')

 11     THEN

 12             dbms_output.put_line('YES!!!');

 13     ELSE

 14             dbms_output.put_line('NO!!!');

 15     END IF;

 16     dbms_output.put_line('empno:' || emp_no || ' ' || 'ename:' || emp_name);

 17     dbms_output.put_line('empno:' || emp_row.empno || ' ' || 'ename:' ||

 18                                                                                      emp_row.ename);

 19  EXCEPTION

 20     WHEN no_data_found THEN

 21             dbms_output.put_line('没有数据');

 22  END;

 23  /

YES!!!

empno:7369 ename:SMITH

empno:7788 ename:SCOTT

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     icount NUMBER := 0;

  3     isum   NUMBER := 0;

  4  BEGIN

  5     LOOP

  6             icount := icount + 1;

  7             EXIT WHEN icount > 100;

  8             isum := isum + icount;

  9     END LOOP;

 10     dbms_output.put_line('1+2+3...+100=' || to_char(isum));

 11  END;

 12  /

1+2+3...+100=5050

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     icount NUMBER := 0;

  3     isum   NUMBER := 0;

  4  BEGIN

  5     WHILE icount < 100

  6     LOOP

  7             icount := icount + 1;

  8             isum   := isum + icount;

  9     END LOOP;

 10     dbms_output.put_line('1+2+3...+100=' || to_char(isum));

 11  END;

 12  /

1+2+3...+100=5050

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     isum NUMBER := 0;

  3  BEGIN

  4     FOR i IN 1 .. 100

  5     LOOP

  6             isum := isum + i;

  7     END LOOP;

  8     dbms_output.put_line('1+2+3...+100=' || to_char(isum));

  9  END;

 10  /

1+2+3...+100=5050

PL/SQL 过程已成功完成。

SQL> SET SERVEROUTPUT ON;

SQL> DECLARE

  2     emp_no   emp.empno%TYPE;

  3     emp_name emp.ename%TYPE;

  4  BEGIN

  5     emp_no   := 9999;

  6     emp_name := 'zhangsan';

  7     dbms_output.put_line('emp_no = ' || emp_no || ' emp_name = ' || emp_name);

  8     SELECT empno, ename INTO emp_no, emp_name FROM emp WHERE empno = 7788;

  9     dbms_output.put_line('emp_no = ' || emp_no || ' emp_name = ' || emp_name);

 10  END;

 11  /

emp_no = 9999 emp_name = zhangsan

emp_no = 7788 emp_name = SCOTT

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     emp_no   emp.empno%TYPE;

  3     emp_name emp.ename%TYPE;

  4     emp_count number := 0;

  5  BEGIN

  6     emp_no   := 9999;

  7     emp_name := 'zhangsan';

  8     dbms_output.put_line('emp_no = ' || emp_no || ' emp_name = ' || emp_name|| ' emp_count = '||emp_count);

  9     SELECT empno, ename INTO emp_no, emp_name FROM emp WHERE empno = 7788;

 10     dbms_output.put_line('emp_no = ' || emp_no || ' emp_name = ' || emp_name|| ' emp_count = '||emp_count);

 11     SELECT count(1) INTO emp_count FROM emp ;

 12     dbms_output.put_line('emp_no = ' || emp_no || ' emp_name = ' || emp_name|| ' emp_count = '||emp_count);

 13  END;

 14  /

emp_no = 9999 emp_name = zhangsan emp_count = 0

emp_no = 7788 emp_name = SCOTT emp_count = 0

emp_no = 7788 emp_name = SCOTT emp_count = 14

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     emp_no    emp.empno%TYPE;

  3     emp_name  emp.ename%TYPE;

  4     emp_count NUMBER := 0;

  5     flag      BOOLEAN DEFAULT TRUE;

  6  BEGIN

  7     emp_no   := 9999;

  8     emp_name := 'zhangsan';

  9     dbms_output.put_line('emp_no = ' || emp_no || ' emp_name = ' || emp_name || ' emp_count = ' || emp_count);

 10     SELECT empno, ename INTO emp_no, emp_name FROM emp WHERE empno = 7788;

 11     dbms_output.put_line('emp_no = ' || emp_no || ' emp_name = ' || emp_name || ' emp_count = ' || emp_count);

 12     SELECT COUNT(1) INTO emp_count FROM emp;

 13     dbms_output.put_line('emp_no = ' || emp_no || ' emp_name = ' || emp_name || ' emp_count = ' || emp_count);

 14     IF flag

 15     THEN

 16             dbms_output.put_line('TRUE!');

 17     ELSE

 18             dbms_output.put_line('FALSE!');

 19     END IF;

 20  END;

 21  /

emp_no = 9999 emp_name = zhangsan emp_count = 0

emp_no = 7788 emp_name = SCOTT emp_count = 0

emp_no = 7788 emp_name = SCOTT emp_count = 14

TRUE!

PL/SQL 过程已成功完成。            

【PL/SQL异常】

SQL>  DECLARE                                                                               

  2     emp_no   emp.empno %TYPE;                                                           

  3     emp_name emp.ename%TYPE;                                                            

  4     emp_row  emp%ROWTYPE;                                                               

  5     today    DATE;                                                                      

  6  BEGIN                                                                                  

  7     SELECT empno, ename INTO emp_no, emp_name FROM emp WHERE empno = 9999;              

  8     SELECT * INTO emp_row FROM emp WHERE empno = 7788;                                  

  9     today := SYSDATE;                                                                   

 10     IF today > to_date('1999-01-01', 'YYYY-MM-DD')                                      

 11     THEN                                                                                

 12             dbms_output.put_line('YES!!!');                                             

 13     ELSE                                                                                

 14             dbms_output.put_line('NO!!!');                                              

 15     END IF;                                                                             

 16     dbms_output.put_line('empno:' || emp_no || ' ' || 'ename:' || emp_name);            

 17     dbms_output.put_line('empno:' || emp_row.empno || ' ' || 'ename:' || emp_row.ename);

 18  EXCEPTION                                                                              

 19     WHEN no_data_found THEN                                                             

 20             dbms_output.put_line('没有数据');                                           

 21  END;                                                                                   

 22  /                                                                                      

没有数据                                                                                    

PL/SQL 过程已成功完成。                                         

SQL> DECLARE                                                                                                            

  2     emp_no   emp.empno %TYPE;                                                           

  3     emp_name emp.ename%TYPE;                                                            

  4     emp_row  emp%ROWTYPE;                                                               

  5     today    DATE;                                                                      

  6  BEGIN                                                                                  

  7     SELECT empno, ename INTO emp_no, emp_name FROM emp WHERE sal < 5000;                

  8     SELECT * INTO emp_row FROM emp WHERE empno = 7788;                                  

  9     today := SYSDATE;                                                                   

 10     IF today > to_date('1999-01-01', 'YYYY-MM-DD')                                      

 11     THEN                                                                                

 12             dbms_output.put_line('YES!!!');                                             

 13     ELSE                                                                                

 14             dbms_output.put_line('NO!!!');                                              

 15     END IF;                                                                             

 16     dbms_output.put_line('empno:' || emp_no || ' ' || 'ename:' || emp_name);            

 17     dbms_output.put_line('empno:' || emp_row.empno || ' ' || 'ename:' || emp_row.ename);

 18  EXCEPTION                                                                              

 19     WHEN no_data_found THEN                                                             

 20             dbms_output.put_line('没有数据');                                           

 21     WHEN too_many_rows THEN                                                             

 22             dbms_output.put_line('值过多');                                             

 23  END;                                                                                   

 24  /                                                                                      

值过多                                                                                      

PL/SQL 过程已成功完成。                             

SQL> DECLARE                                                                                                                        

  2     emp_no   emp.empno %TYPE;                                                           

  3     emp_name emp.ename%TYPE;                                                            

  4     emp_row  emp%ROWTYPE;                                                               

  5     today    DATE;                                                                      

  6     icount   NUMBER := 5;                                                               

  7  BEGIN                                                                                  

  8     icount := 10 / 0;                                                                   

  9     today  := SYSDATE;                                                                  

 10     SELECT empno, ename INTO emp_no, emp_name FROM emp WHERE sal = 7788;                

 11     SELECT * INTO emp_row FROM emp WHERE empno = 7788;                                  

 12     IF today > to_date('1999-01-01', 'YYYY-MM-DD')                                      

 13     THEN                                                                                

 14             dbms_output.put_line('YES!!!');                                             

 15     ELSE                                                                                

 16             dbms_output.put_line('NO!!!');                                              

 17     END IF;                                                                             

 18     dbms_output.put_line('empno:' || emp_no || ' ' || 'ename:' || emp_name);            

 19     dbms_output.put_line('empno:' || emp_row.empno || ' ' || 'ename:' || emp_row.ename);

 20  EXCEPTION                                                                              

 21     WHEN no_data_found THEN                                                             

 22             dbms_output.put_line('没有数据');                                           

 23     WHEN too_many_rows THEN                                                             

 24             dbms_output.put_line('值过多');                                             

 25     WHEN OTHERS THEN                                                                    

 26             dbms_output.put_line('其他错误');                                           

 27  END;                                                                                   

 28  /                                                                                      

其他错误                                                                                    

PL/SQL 过程已成功完成。                                                                   

SQL> DECLARE                                                                                

  2     emp_no   emp.empno %TYPE;                                                           

  3     emp_name emp.ename%TYPE;                                                            

  4     emp_row  emp%ROWTYPE;                                                               

  5     today    DATE;                                                                      

  6     icount   NUMBER := 5;                                                               

  7  BEGIN                                                                                  

  8     icount := 10 / 0;                                                                   

  9     today  := SYSDATE;                                                                  

 10     SELECT empno, ename INTO emp_no, emp_name FROM emp WHERE sal = 7788;                

 11     SELECT * INTO emp_row FROM emp WHERE empno = 7788;                                  

 12     IF today > to_date('1999-01-01', 'YYYY-MM-DD')                                      

 13     THEN                                                                                

 14             dbms_output.put_line('YES!!!');                                             

 15     ELSE                                                                                

 16             dbms_output.put_line('NO!!!');                                              

 17     END IF;                                                                             

 18     dbms_output.put_line('empno:' || emp_no || ' ' || 'ename:' || emp_name);            

 19     dbms_output.put_line('empno:' || emp_row.empno || ' ' || 'ename:' || emp_row.ename);

 20  EXCEPTION                                                                              

 21     WHEN no_data_found THEN                                                             

 22             dbms_output.put_line('没有数据');                                           

 23     WHEN too_many_rows THEN                                                             

 24             dbms_output.put_line('值过多');                                             

 25     WHEN zero_divide THEN                                                               

 26             dbms_output.put_line('除数为0');                                            

 27     WHEN OTHERS THEN                                                                    

 28             dbms_output.put_line('其他错误');                                           

 29  END;                                                                                   

 30  /                                                                                      

除数为0                                                                                     

PL/SQL 过程已成功完成。      

SQL> CREATE TABLE place (id number not null primary key,name varchar2(20));                                                               

表已创建。

SQL> INSERT INTO place VALUES(1,'HANGZHOU');                                                                 

已创建 1 行。          

SQL> DECLARE                                                                                

  2     dup_value_exception EXCEPTION;                                 

  3     icount NUMBER := 0;                                            

  4  BEGIN                                                             

  5     SELECT COUNT(1) INTO icount FROM place WHERE id = 1;           

  6     IF icount > 0                                                  

  7     THEN                                                           

  8             RAISE dup_value_exception;                             

  9     END IF;                                                        

 10  EXCEPTION                                                         

 11     WHEN dup_value_exception THEN                                  

 12             dbms_output.put_line('place表中已经存在id为1的数据!');

 13  END;                                                              

 14  /                                                                 

place表中已经存在id为1的数据!                                         

PL/SQL 过程已成功完成。                        

SQL> DECLARE

  2     dup_value_exception EXCEPTION;

  3     PRAGMA EXCEPTION_INIT(dup_value_exception, -1);

  4     icount NUMBER := 0;

  5  BEGIN

  6     SELECT COUNT(1) INTO icount FROM place WHERE id = 1;

  7     IF icount > 0

  8     THEN

  9             RAISE dup_value_exception;

 10     END IF;

 11  EXCEPTION

 12     WHEN dup_value_exception THEN

 13             dbms_output.put_line('place表中已经存在id为1的数据!');

 14  END;

 15  /

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     dup_value_exception EXCEPTION;

  3     PRAGMA EXCEPTION_INIT(dup_value_exception, -1);

  4  BEGIN

  5     INSERT INTO place VALUES (1, 'hangzhou');

  6  EXCEPTION

  7     WHEN dup_value_exception THEN

  8             dbms_output.put_line('place表中已经存在id为1的数据!');

  9  END;

 10  /

place表中已经存在id为1的数据!

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     dup_value_exception EXCEPTION;

  3     PRAGMA EXCEPTION_INIT(dup_value_exception, -1);

  4  BEGIN

  5     INSERT INTO place VALUES (1, 'hangzhou');

  6  EXCEPTION

  7     WHEN dup_value_exception THEN

  8             raise_application_error(-20001, 'place表中已经存在id为1的数据!');

  9  END;

 10  /

DECLARE

*

ERROR 位于第 1 行:

ORA-20001: place表中已经存在id为1的数据!

ORA-06512: 在line 8                        

【游标】

SQL> BEGIN

  2     INSERT INTO place VALUES (2, 'hangzhou');

  3     dbms_output.put_line('rowcount = ' || SQL%ROWCOUNT);

  4  END;

  5  /

rowcount = 1

PL/SQL 过程已成功完成。

SQL> BEGIN

  2     INSERT INTO place VALUES (3, 'hangzhou');

  3     dbms_output.put_line('rowcount = ' || SQL%ROWCOUNT);

  4     IF SQL%FOUND

  5     THEN

  6             dbms_output.put_line('found!');

  7     END IF;

  8     IF SQL%NOTFOUND

  9     THEN

 10             dbms_output.put_line('notfound!');

 11     END IF;

 12     IF SQL%ISOPEN

 13     THEN

 14             dbms_output.put_line('isopen!');

 15     ELSE

 16             dbms_output.put_line('notopen!');

 17     END IF;

 18  END;

 19  /

rowcount = 1

found!

notopen!

PL/SQL 过程已成功完成。

SQL> BEGIN

  2     UPDATE place SET NAME = 'beijing';

  3     dbms_output.put_line('rowcount = ' || SQL%ROWCOUNT);

  4     IF SQL%FOUND

  5     THEN

  6             dbms_output.put_line('found!');

  7     END IF;

  8     IF SQL%NOTFOUND

  9     THEN

 10             dbms_output.put_line('notfound!');

 11     END IF;

 12     IF SQL%ISOPEN

 13     THEN

 14             dbms_output.put_line('isopen!');

 15     ELSE

 16             dbms_output.put_line('notopen!');

 17     END IF;

 18  END;

 19  /

rowcount = 6

found!

notopen!

PL/SQL 过程已成功完成。

SQL> set serveroutput on;

SQL> DECLARE

  2     CURSOR emp_cursor IS

  3             SELECT * FROM emp;

  4     emp_row emp%ROWTYPE;

  5  BEGIN

  6     OPEN emp_cursor;

  7     FETCH emp_cursor

  8             INTO emp_row;

  9     dbms_output.put_line('emp_no = ' || emp_row.empno || ' emp_name = ' || emp_row.ename);

 10     CLOSE emp_cursor;

 11  END;

 12  /

emp_no = 7369 emp_name = SMITH

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     CURSOR emp_cursor IS

  3             SELECT * FROM emp;

  4     emp_row emp%ROWTYPE;

  5  BEGIN

  6     OPEN emp_cursor;

  7     LOOP

  8             FETCH emp_cursor

  9                     INTO emp_row;

 10             dbms_output.put_line('emp_no = ' || emp_row.empno || ' emp_name = ' || emp_row.ename);

 11             EXIT WHEN emp_cursor%NOTFOUND;

 12     END LOOP;

 13     CLOSE emp_cursor;

 14  END;

 15  /

emp_no = 7369 emp_name = SMITH

emp_no = 7499 emp_name = ALLEN

emp_no = 7521 emp_name = WARD

emp_no = 7566 emp_name = JONES

emp_no = 7654 emp_name = MARTIN

emp_no = 7698 emp_name = BLAKE

emp_no = 7782 emp_name = CLARK

emp_no = 7788 emp_name = SCOTT

emp_no = 7839 emp_name = KING

emp_no = 7844 emp_name = TURNER

emp_no = 7876 emp_name = ADAMS

emp_no = 7900 emp_name = JAMES

emp_no = 7902 emp_name = FORD

emp_no = 7934 emp_name = MILLER

emp_no = 7934 emp_name = MILLER

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     CURSOR emp_cursor IS

  3             SELECT * FROM emp;

  4     emp_row emp%ROWTYPE;

  5  BEGIN

  6     OPEN emp_cursor;

  7     LOOP

  8             FETCH emp_cursor

  9                     INTO emp_row;

 10             dbms_output.put_line('emp_no = ' || emp_row.empno || ' emp_name = ' || emp_row.ename || ' rowcount =' || emp_cursor%ROWCOUNT);

 11             EXIT WHEN emp_cursor%NOTFOUND;

 12     END LOOP;

 13     CLOSE emp_cursor;

 14  END;

 15  /

emp_no = 7369 emp_name = SMITH rowcount =1

emp_no = 7499 emp_name = ALLEN rowcount =2

emp_no = 7521 emp_name = WARD rowcount =3

emp_no = 7566 emp_name = JONES rowcount =4

emp_no = 7654 emp_name = MARTIN rowcount =5

emp_no = 7698 emp_name = BLAKE rowcount =6

emp_no = 7782 emp_name = CLARK rowcount =7

emp_no = 7788 emp_name = SCOTT rowcount =8

emp_no = 7839 emp_name = KING rowcount =9

emp_no = 7844 emp_name = TURNER rowcount =10

emp_no = 7876 emp_name = ADAMS rowcount =11

emp_no = 7900 emp_name = JAMES rowcount =12

emp_no = 7902 emp_name = FORD rowcount =13

emp_no = 7934 emp_name = MILLER rowcount =14

emp_no = 7934 emp_name = MILLER rowcount =14

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     CURSOR emp_cursor IS

  3             SELECT * FROM emp;

  4     emp_row emp%ROWTYPE;

  5  BEGIN

  6     OPEN emp_cursor;

  7     WHILE emp_cursor%FOUND

  8     LOOP

  9             FETCH emp_cursor

 10                     INTO emp_row;

 11             dbms_output.put_line('emp_no = ' || emp_row.empno || ' emp_name = ' || emp_row.ename || ' rowcount =' || emp_cursor%ROWCOUNT);

 12     END LOOP;

 13     CLOSE emp_cursor;

 14  END;

 15  /

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     CURSOR emp_cursor IS

  3             SELECT * FROM emp;

  4     emp_row emp%ROWTYPE;

  5  BEGIN

  6     OPEN emp_cursor;

  7     FETCH emp_cursor

  8             INTO emp_row;

  9     WHILE emp_cursor%FOUND

 10     LOOP

 11             dbms_output.put_line('emp_no = ' || emp_row.empno || ' emp_name = ' || emp_row.ename || ' rowcount =' || emp_cursor%ROWCOUNT);

 12             FETCH emp_cursor

 13                     INTO emp_row;

 14     END LOOP;

 15     CLOSE emp_cursor;

 16  END;

 17  /

emp_no = 7369 emp_name = SMITH rowcount =1

emp_no = 7499 emp_name = ALLEN rowcount =2

emp_no = 7521 emp_name = WARD rowcount =3

emp_no = 7566 emp_name = JONES rowcount =4

emp_no = 7654 emp_name = MARTIN rowcount =5

emp_no = 7698 emp_name = BLAKE rowcount =6

emp_no = 7782 emp_name = CLARK rowcount =7

emp_no = 7788 emp_name = SCOTT rowcount =8

emp_no = 7839 emp_name = KING rowcount =9

emp_no = 7844 emp_name = TURNER rowcount =10

emp_no = 7876 emp_name = ADAMS rowcount =11

emp_no = 7900 emp_name = JAMES rowcount =12

emp_no = 7902 emp_name = FORD rowcount =13

emp_no = 7934 emp_name = MILLER rowcount =14

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     CURSOR emp_cursor IS

  3             SELECT * FROM emp;

  4  BEGIN

  5     FOR emp_row IN emp_cursor

  6     LOOP

  7             dbms_output.put_line('emp_no = ' || emp_row.empno || ' emp_name = ' || emp_row.ename || ' rowcount =' || emp_cursor%ROWCOUNT);

  8     END LOOP;

  9  END;

 10  /

emp_no = 7369 emp_name = SMITH rowcount =1

emp_no = 7499 emp_name = ALLEN rowcount =2

emp_no = 7521 emp_name = WARD rowcount =3

emp_no = 7566 emp_name = JONES rowcount =4

emp_no = 7654 emp_name = MARTIN rowcount =5

emp_no = 7698 emp_name = BLAKE rowcount =6

emp_no = 7782 emp_name = CLARK rowcount =7

emp_no = 7788 emp_name = SCOTT rowcount =8

emp_no = 7839 emp_name = KING rowcount =9

emp_no = 7844 emp_name = TURNER rowcount =10

emp_no = 7876 emp_name = ADAMS rowcount =11

emp_no = 7900 emp_name = JAMES rowcount =12

emp_no = 7902 emp_name = FORD rowcount =13

emp_no = 7934 emp_name = MILLER rowcount =14

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     CURSOR emp_cursor IS

  3             SELECT * FROM emp WHERE empno = &no;

  4  BEGIN

  5     FOR emp_row IN emp_cursor

  6     LOOP

  7             dbms_output.put_line('emp_no = ' || emp_row.empno || ' emp_name = ' || emp_row.ename || ' rowcount =' || emp_cursor%ROWCOUNT);

  8     END LOOP;

  9  END;

 10  /

输入 no 的值:  7369

原值    3:              SELECT * FROM emp WHERE empno = &no;

新值    3:              SELECT * FROM emp WHERE empno = 7369;

emp_no = 7369 emp_name = SMITH rowcount =1

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     CURSOR emp_cursor IS

  3             SELECT * FROM emp WHERE ename = '&name';

  4  BEGIN

  5     FOR emp_row IN emp_cursor

  6     LOOP

  7             dbms_output.put_line('emp_no = ' || emp_row.empno || ' emp_name = ' || emp_row.ename || ' rowcount =' || emp_cursor%ROWCOUNT);

  8     END LOOP;

  9  END;

 10  /

输入 name 的值:  SMITH

原值    3:              SELECT * FROM emp WHERE ename = '&name';

新值    3:              SELECT * FROM emp WHERE ename = 'SMITH';

emp_no = 7369 emp_name = SMITH rowcount =1

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     CURSOR emp_cursor IS

  3             SELECT * FROM emp WHERE sal > &input_sal;

  4     icount NUMBER;

  5  BEGIN

  6     icount := &input_count;

  7     dbms_output.put_line('icount= ' || icount);

  8     FOR emp_row IN emp_cursor

  9     LOOP

 10             dbms_output.put_line('emp_no = ' || emp_row.empno || ' emp_name = ' || emp_row.ename || ' rowcount =' || emp_cursor%ROWCOUNT);

 11     END LOOP;

 12  END;

 13  /

输入 input_sal 的值:  100

原值    3:              SELECT * FROM emp WHERE sal > &input_sal;

新值    3:              SELECT * FROM emp WHERE sal > 100;

输入 input_count 的值:  999

原值    6:      icount := &input_count;

新值    6:      icount := 999;

icount= 999

emp_no = 7369 emp_name = SMITH rowcount =1

emp_no = 7499 emp_name = ALLEN rowcount =2

emp_no = 7521 emp_name = WARD rowcount =3

emp_no = 7566 emp_name = JONES rowcount =4

emp_no = 7654 emp_name = MARTIN rowcount =5

emp_no = 7698 emp_name = BLAKE rowcount =6

emp_no = 7782 emp_name = CLARK rowcount =7

emp_no = 7788 emp_name = SCOTT rowcount =8

emp_no = 7839 emp_name = KING rowcount =9

emp_no = 7844 emp_name = TURNER rowcount =10

emp_no = 7876 emp_name = ADAMS rowcount =11

emp_no = 7900 emp_name = JAMES rowcount =12

emp_no = 7902 emp_name = FORD rowcount =13

emp_no = 7934 emp_name = MILLER rowcount =14

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     TYPE ref_cursor IS REF CURSOR;

  3     emp_cursor ref_cursor;

  4     emp_row    emp%ROWTYPE;

  5     flag       INT := 0;

  6  BEGIN

  7     flag := &input_flag;

  8     IF flag = 1

  9     THEN

 10             OPEN emp_cursor FOR

 11                     SELECT *

 12                             FROM emp

 13                      WHERE sal > 100

 14                              AND sal < 1000;

 15     ELSIF flag = 2

 16     THEN

 17             OPEN emp_cursor FOR

 18                     SELECT *

 19                             FROM emp

 20                      WHERE sal > 1000

 21                              AND sal < 2000;

 22     ELSIF flag = 3

 23     THEN

 24             OPEN emp_cursor FOR

 25                     SELECT * FROM emp WHERE sal > 3000;

 26     ELSE

 27             OPEN emp_cursor FOR

 28                     SELECT * FROM emp;

 29     END IF;

 30     /**************************ERROR**********************

 31    FOR emp_row IN emp_cursor

 32    LOOP

 33      dbms_output.put_line('ename = '|| emp_row.ename);

 34    END LOOP;

 35    *****************************************************/

 36     LOOP

 37             FETCH emp_cursor

 38                     INTO emp_row;

 39             dbms_output.put_line('ename = ' || emp_row.ename);

 40             EXIT WHEN emp_cursor%NOTFOUND;

 41     END LOOP;

 42  END;

 43  /

输入 input_flag 的值:  2

原值    7:      flag := &input_flag;

新值    7:      flag := 2;

ename = ALLEN

ename = WARD

ename = MARTIN

ename = TURNER

ename = ADAMS

ename = MILLER

ename = MILLER

PL/SQL 过程已成功完成。

【子程序:过程 函数】

SQL> CREATE OR REPLACE PROCEDURE my_procedure AS

  2     i INTEGER;

  3     j INTEGER;

  4  BEGIN

  5     dbms_output.put_line('9*9乘法表');

  6     FOR i IN 1 .. 9

  7     LOOP

  8             FOR j IN 1 .. 9

  9             LOOP

 10                     IF i >= j

 11                     THEN

 12                             dbms_output.put(to_char(i) || '*' || to_char(j) || ' = ' || to_char(i * j) || ' ');

 13                     END IF;

 14             END LOOP;

 15             dbms_output.put_line(' ');

 16     END LOOP;

 17  END;

 18  /

过程已创建。

SQL> execute my_procedure;

9*9乘法表

1*1 = 1

2*1 = 2 2*2 = 4

3*1 = 3 3*2 = 6 3*3 = 9

4*1 = 4 4*2 = 8 4*3 = 12 4*4 = 16

5*1 = 5 5*2 = 10 5*3 = 15 5*4 = 20 5*5 = 25

6*1 = 6 6*2 = 12 6*3 = 18 6*4 = 24 6*5 = 30 6*6 = 36

7*1 = 7 7*2 = 14 7*3 = 21 7*4 = 28 7*5 = 35 7*6 = 42 7*7 = 49

8*1 = 8 8*2 = 16 8*3 = 24 8*4 = 32 8*5 = 40 8*6 = 48 8*7 = 56 8*8 = 64

9*1 = 9 9*2 = 18 9*3 = 27 9*4 = 36 9*5 = 45 9*6 = 54 9*7 = 63 9*8 = 72 9*9 = 81

PL/SQL 过程已成功完成。

SQL> BEGIN

  2     my_procedure;

  3  END;

  4  /

9*9乘法表

1*1 = 1

2*1 = 2 2*2 = 4

3*1 = 3 3*2 = 6 3*3 = 9

4*1 = 4 4*2 = 8 4*3 = 12 4*4 = 16

5*1 = 5 5*2 = 10 5*3 = 15 5*4 = 20 5*5 = 25

6*1 = 6 6*2 = 12 6*3 = 18 6*4 = 24 6*5 = 30 6*6 = 36

7*1 = 7 7*2 = 14 7*3 = 21 7*4 = 28 7*5 = 35 7*6 = 42 7*7 = 49

8*1 = 8 8*2 = 16 8*3 = 24 8*4 = 32 8*5 = 40 8*6 = 48 8*7 = 56 8*8 = 64

9*1 = 9 9*2 = 18 9*3 = 27 9*4 = 36 9*5 = 45 9*6 = 54 9*7 = 63 9*8 = 72 9*9 = 81

PL/SQL 过程已成功完成。

SQL> CREATE OR REPLACE PROCEDURE query_procedure(find_no emp.empno%TYPE) AS

  2     e_name emp.ename%TYPE;

  3     e_job  emp.job%TYPE;

  4  BEGIN

  5     SELECT ename, job INTO e_name, e_job FROM emp WHERE empno = find_no;

  6     dbms_output.put_line('empno:' || find_no || ' ename:' || e_name || ' job:' || e_job);

  7  EXCEPTION

  8     WHEN no_data_found THEN

  9             dbms_output.put_line('未找到数据!');

 10     WHEN too_many_rows THEN

 11             dbms_output.put_line('返回记录过多!');

 12     WHEN OTHERS THEN

 13             dbms_output.put_line('其他错误!');

 14  END;

 15  /

过程已创建。

SQL> execute query_procedure(7369);

empno:7369 ename:SMITH job:CLERK

PL/SQL 过程已成功完成。

SQL> BEGIN

  2     query_procedure(7369);

  3  END;

  4  /

empno:7369 ename:SMITH job:CLERK

PL/SQL 过程已成功完成。

SQL> desc user_source;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 NAME                                               VARCHAR2(30)

 TYPE                                               VARCHAR2(12)

 LINE                                               NUMBER

 TEXT                                               VARCHAR2(4000)

SQL> select * from user_source where name = 'QUERY_PROCEDURE';

NAME                           TYPE               LINE

------------------------------ ------------ ----------

TEXT

--------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------

QUERY_PROCEDURE                PROCEDURE             1

PROCEDURE query_procedure(find_no emp.empno%TYPE) AS

QUERY_PROCEDURE                PROCEDURE             2

        e_name emp.ename%TYPE;

QUERY_PROCEDURE                PROCEDURE             3

        e_job  emp.job%TYPE;

QUERY_PROCEDURE                PROCEDURE             4

BEGIN

QUERY_PROCEDURE                PROCEDURE             5

        SELECT ename, job INTO e_name, e_job FROM emp WHERE empno = find_no;

QUERY_PROCEDURE                PROCEDURE             6

        dbms_output.put_line('empno:' || find_no || ' ename:' || e_name || ' job:' ||

QUERY_PROCEDURE                PROCEDURE             7

EXCEPTION

QUERY_PROCEDURE                PROCEDURE             8

        WHEN no_data_found THEN

QUERY_PROCEDURE                PROCEDURE             9

                dbms_output.put_line('未找到数据!');

QUERY_PROCEDURE                PROCEDURE            10

        WHEN too_many_rows THEN

QUERY_PROCEDURE                PROCEDURE            11

                dbms_output.put_line('返回记录过多!');

QUERY_PROCEDURE                PROCEDURE            12

        WHEN OTHERS THEN

QUERY_PROCEDURE                PROCEDURE            13

                dbms_output.put_line('其他错误!');

QUERY_PROCEDURE                PROCEDURE            14

END;

已选择14行。

SQL> CREATE OR REPLACE PROCEDURE run_by_parameter_pro

  2  (

  3     in_name IN emp.ename%TYPE,

  4     out_job OUT VARCHAR,

  5     out_sal OUT NUMBER

  6  ) AS

  7     icount NUMBER;

  8  BEGIN

  9     SELECT COUNT(1) INTO icount FROM emp WHERE ename = in_name;

 10     IF icount = 1

 11     THEN

 12             SELECT job, sal INTO out_job, out_sal FROM emp WHERE ename = in_name;

 13             out_job := '姓名为:' || in_name || '的员工工资为:' || to_char(out_sal);

 14             out_sal := out_sal;

 15     ELSE

 16             out_job := 'job_没有找到姓名为的记录!';

 17             out_sal := 0;

 18     END IF;

 19  EXCEPTION

 20     WHEN too_many_rows THEN

 21             dbms_output.put_line('返回记录过多!');

 22     WHEN OTHERS THEN

 23             dbms_output.put_line('意外错误!');

 24  END;

 25  /

过程已创建。

SQL> DECLARE

  2     i_name VARCHAR(20);

  3     o_job  VARCHAR2(20);

  4     o_sal  NUMBER;

  5  BEGIN

  6     i_name := 'SMITH';

  7     run_by_parameter_pro(i_name, o_job, o_sal);

  8     dbms_output.put_line('i_name = ' || i_name || ' o_job = ' || o_job || ' o_sal = ' || o_sal);

  9  END;

 10  /

意外错误!

i_name = SMITH o_job = CLERK o_sal = 800

PL/SQL 过程已成功完成。

SQL> DROP PROCEDURE my_procedure;

过程已丢弃。

SQL> CREATE OR REPLACE FUNCTION get_name(input_no NUMBER) RETURN VARCHAR IS

  2     out_name VARCHAR(20);

  3  BEGIN

  4     SELECT ename INTO out_name FROM emp WHERE empno = input_no;

  5     RETURN out_name;

  6  EXCEPTION

  7     WHEN too_many_rows THEN

  8             dbms_output.put_line('返回记录过多!');

  9     WHEN OTHERS THEN

 10             dbms_output.put_line('意外错误!');

 11  END;

 12  /

函数已创建。

SQL> DECLARE

  2     o_name VARCHAR(20);

  3  BEGIN

  4     o_name := get_name(7369);

  5     dbms_output.put_line('o_name = ' || o_name);

  6     o_name := get_name(7788);

  7     dbms_output.put_line('o_name = ' || o_name);

  8  END;

  9  /

o_name = SMITH

o_name = SCOTT

PL/SQL 过程已成功完成。

SQL> SELECT * FROM emp WHERE ename = get_name(7369);

     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO

---------- ---------- --------- ---------- ---------- ---------- ---------- ----------

      7369 SMITH      CLERK           7902 17-12月-80        800                    20

SQL> SELECT * FROM user_source WHERE name = 'GET_NAME';

NAME                           TYPE               LINE

------------------------------ ------------ ----------

TEXT

-----------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------

GET_NAME                       FUNCTION              1

FUNCTION get_name(input_no NUMBER) RETURN VARCHAR IS

GET_NAME                       FUNCTION              2

        out_name VARCHAR(20);

GET_NAME                       FUNCTION              3

BEGIN

GET_NAME                       FUNCTION              4

        SELECT ename INTO out_name FROM emp WHERE empno = input_no;

GET_NAME                       FUNCTION              5

        RETURN out_name;

GET_NAME                       FUNCTION              6

EXCEPTION

GET_NAME                       FUNCTION              7

        WHEN too_many_rows THEN

GET_NAME                       FUNCTION              8

                dbms_output.put_line('返回记录过多!');

GET_NAME                       FUNCTION              9

        WHEN OTHERS THEN

GET_NAME                       FUNCTION             10

                dbms_output.put_line('意外错误!');

GET_NAME                       FUNCTION             11

END;

已选择11行。

SQL> desc user_errors;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 NAME                                      NOT NULL VARCHAR2(30)

 TYPE                                               VARCHAR2(12)

 SEQUENCE                                  NOT NULL NUMBER

 LINE                                      NOT NULL NUMBER

 POSITION                                  NOT NULL NUMBER

 TEXT                                      NOT NULL VARCHAR2(4000)

SQL> select * from user_errors;

NAME                           TYPE           SEQUENCE       LINE   POSITION

------------------------------ ------------ ---------- ---------- ----------

TEXT

--------------------------------------------------------------------------------

STUDENTTYPE                    TYPE                  1          8          1

PLS-00103: 出现符号 ")"在需要下列之一时:

 return

STUDENT_TYPE                   TYPE                  1          8          1

PLS-00103: 出现符号 ")"在需要下列之一时:

 return

SQL> CREATE OR REPLACE PROCEDURE paramter_procedure

  2  (

  3     isal  IN emp.sal%TYPE,

  4     sname OUT VARCHAR,

  5     sjob  IN OUT VARCHAR

  6  ) AS

  7     icount NUMBER;

  8  BEGIN

  9     SELECT COUNT(*)

 10             INTO icount

 11             FROM emp

 12      WHERE sal > isal

 13              AND job = sjob;

 14     IF icount = 1

 15     THEN

 16             SELECT ename

 17                     INTO sname

 18                     FROM emp

 19              WHERE sal > isal

 20                      AND job = sjob;

 21             sname := '名字为:' || sname;

 22             sjob  := '工作为:' || sjob;

 23     ELSE

 24             sname := '没找到名字!';

 25             sjob  := '没找到工作!';

 26     END IF;

 27  EXCEPTION

 28     WHEN too_many_rows THEN

 29             dbms_output.put_line('返回记录过多!');

 30     WHEN OTHERS THEN

 31             dbms_output.put_line('其他错误!');

 32  END;

 33  /

过程已创建。

SQL> DECLARE

  2     p_name VARCHAR(20);

  3     p_job  VARCHAR(20);

  4     p_sal  NUMBER;

  5  BEGIN

  6     p_sal  := 2900;

  7     p_name := '';

  8     p_job  := 'MANAGER';

  9     paramter_procedure(p_sal, p_name, p_job);

 10     dbms_output.put_line('姓名:' || p_name);

 11  END;

 12  /

姓名:名字为:JONES

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     p_name VARCHAR(20);

  3     p_job  VARCHAR(20);

  4     p_sal  NUMBER;

  5  BEGIN

  6     p_sal  := 2900;

  7     p_name := '';

  8     p_job  := 'MANAGER';

  9     paramter_procedure(p_sal, p_name, p_job);

 10     dbms_output.put_line('姓名:' || p_name);

 11     p_sal  := 2900;

 12     p_name := '';

 13     p_job  := 'MANAGER';

 14     paramter_procedure(sjob => p_job, sname => p_name, isal => p_sal);

 15     dbms_output.put_line('姓名:' || p_name);

 16  END;

 17  /

姓名:名字为:JONES

姓名:名字为:JONES

PL/SQL 过程已成功完成。

SQL> CREATE OR REPLACE PROCEDURE pro_1 AS

  2  BEGIN

  3     INSERT INTO my_dept VALUES (90, 'development', 'hangzhou');

  4  END;

  5  /

过程已创建。

SQL> CREATE OR REPLACE PROCEDURE pro_2 AS

  2  BEGIN

  3     UPDATE my_dept SET loc = 'shanghai' WHERE deptno = 10;

  4     pro_1;

  5  END;

  6  /

过程已创建。

SQL> execute pro_2;

PL/SQL 过程已成功完成。

SQL> SELECT * FROM my_dept;

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     shanghai

        20 RESEARCH       DALLAS

        30 SALES          CHICAGO

        40 OPERATIONS     BOSTON

        90 development    hangzhou

SQL> CREATE OR REPLACE PROCEDURE pro_1 AS

  2  BEGIN

  3     INSERT INTO my_dept VALUES (90, 'development', 'hangzhou');

  4     ROLLBACK;

  5  END;

  6  /

过程已创建。

SQL> CREATE OR REPLACE PROCEDURE pro_2 AS

  2  BEGIN

  3     UPDATE my_dept SET loc = 'shanghai' WHERE deptno = 10;

  4     pro_1;

  5  END;

  6  /

过程已创建。

SQL> execute pro_2;

PL/SQL 过程已成功完成。

SQL> SELECT * FROM my_dept;

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     NEW YORK

        20 RESEARCH       DALLAS

        30 SALES          CHICAGO

        40 OPERATIONS     BOSTON

SQL> CREATE OR REPLACE PROCEDURE p1 AS

  2     PRAGMA AUTONOMOUS_TRANSACTION;

  3  BEGIN

  4     INSERT INTO my_dept VALUES (66, 'javateam', 'zhejiang');

  5     ROLLBACK;

  6  END;

  7  /

过程已创建。

SQL> CREATE OR REPLACE PROCEDURE p2 AS

  2  BEGIN

  3     UPDATE my_dept SET loc = 'wuhan' WHERE deptno = 10;

  4     p1;

  5  END;

  6  /

过程已创建。

SQL> execute p2;

PL/SQL 过程已成功完成。

SQL> select * from my_dept;

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     wuhan

        20 RESEARCH       DALLAS

        30 SALES          CHICAGO

        40 OPERATIONS     BOSTON

        90 development    hangzhou

【程序包】

SQL> CREATE OR REPLACE PACKAGE student_package IS

  2     TYPE cur_ref_student IS REF CURSOR RETURN student%ROWTYPE;

  3     PROCEDURE select_student(find_id IN student.id%TYPE);

  4     PROCEDURE insert_student(new_student IN student%ROWTYPE);

  5     PROCEDURE update_student(new_student IN student%ROWTYPE);

  6     PROCEDURE delete_student(del_id IN student.id%TYPE);

  7     PROCEDURE return_student(in_out_student IN OUT cur_ref_student);

  8     FUNCTION return_record_count RETURN NUMBER;

  9  END student_package;

 10  /

程序包已创建。

SQL> CREATE OR REPLACE PACKAGE BODY student_package AS

  2

  3     /*select_student*/

  4     PROCEDURE select_student(find_id IN student.id%TYPE) AS

  5             CURSOR find_cursor IS

  6                     SELECT * FROM student WHERE id = find_id;

  7     BEGIN

  8             FOR s IN find_cursor

  9             LOOP

 10                     dbms_output.put_line('student id : ' || s.id || ' name: ' || s.name || ' score : ' || s.score);

 11             END LOOP;

 12     EXCEPTION

 13             WHEN no_data_found THEN

 14                     dbms_output.put_line('没有找到id为' || find_id || '的学生数据!');

 15             WHEN OTHERS THEN

 16                     dbms_output.put_line('意外错误!');

 17     END select_student;

 18

 19     /*insert_student*/

 20     PROCEDURE insert_student(new_student IN student%ROWTYPE) AS

 21             i_recorder INTEGER;

 22             not_exists_student EXCEPTION;

 23     BEGIN

 24             SELECT COUNT(*) INTO i_recorder FROM student WHERE id = new_student.id;

 25             IF i_recorder > 0

 26             THEN

 27                     RAISE not_exists_student;

 28             ELSE

 29                     INSERT INTO student VALUES (new_student.id, new_student.name, new_student.score, new_student.subid);

 30                     COMMIT;

 31             END IF;

 32     EXCEPTION

 33             WHEN not_exists_student THEN

 34                     dbms_output.put_line('要插入编号为:' || new_student.id || '的学生记录已经存在!');

 35             WHEN OTHERS THEN

 36                     dbms_output.put_line('意外插入错误!');

 37     END insert_student;

 38

 39     /*update_student*/

 40     PROCEDURE update_student(new_student IN student%ROWTYPE) AS

 41             i_record INTEGER;

 42     BEGIN

 43             SELECT COUNT(*) INTO i_record FROM student WHERE id = new_student.id;

 44             IF i_record = 0

 45             THEN

 46                     dbms_output.put_line('编号为:' || new_student.id || '的学生记录不存在!');

 47             ELSE

 48                     UPDATE student SET NAME = new_student.name WHERE id = new_student.id;

 49                     COMMIT;

 50                     dbms_output.put_line('修改学生记录成功!');

 51             END IF;

 52     EXCEPTION

 53             WHEN OTHERS THEN

 54                     dbms_output.put_line('意外更新错误!');

 55     END update_student;

 56

 57     /*delete_student*/

 58     PROCEDURE delete_student(del_id IN student.id%TYPE) AS

 59             i_rec INTEGER;

 60     BEGIN

 61             SELECT COUNT(*) INTO i_rec FROM student WHERE id = del_id;

 62             IF i_rec = 0

 63             THEN

 64                     dbms_output.put_line('编号为:' || del_id || '的学生记录不存在!');

 65             ELSE

 66                     DELETE FROM student WHERE id = del_id;

 67                     COMMIT;

 68                     dbms_output.put_line('删除编号为:' || del_id || '的学生记录成功!');

 69             END IF;

 70     EXCEPTION

 71             WHEN OTHERS THEN

 72                     dbms_output.put_line('删除时意外错误!');

 73     END delete_student;

 74

 75     /*return_student*/

 76     PROCEDURE return_student(in_out_student IN OUT cur_ref_student) AS

 77     BEGIN

 78             OPEN in_out_student FOR

 79                     SELECT * FROM student;

 80     END return_student;

 81

 82     /*return_record_student*/

 83     FUNCTION return_record_count RETURN NUMBER AS

 84             record_count NUMBER(10);

 85     BEGIN

 86             SELECT COUNT(*) INTO record_count FROM student;

 87             RETURN record_count;

 88     EXCEPTION

 89             WHEN OTHERS THEN

 90                     dbms_output.put_line('意外查询错误!');

 91     END return_record_count;

 92

 93  END student_package;

 94  /

程序包主体已创建。

SQL> DECLARE

  2     new_stu student%ROWTYPE;

  3  BEGIN

  4     new_stu.id    := 17;

  5     new_stu.name  := 'zhangsan';

  6     new_stu.score := 88;

  7     new_stu.subid := 2;

  8     student_package.insert_student(new_stu);

  9  END;

 10  /

要插入编号为:12的学生记录已经存在!

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     new_stu student%ROWTYPE;

  3  BEGIN

  4     new_stu.id    := 17;

  5     new_stu.name  := 'zhangsan';

  6     new_stu.score := 88;

  7     new_stu.subid := 2;

  8     student_package.insert_student(new_stu);

  9  END;

 10  /

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     new_stu student%ROWTYPE;

  3  BEGIN

  4     new_stu.id    := 3;

  5     new_stu.name  := 'wangwu';

  6     new_stu.score := 55;

  7     new_stu.subid := 1;

  8     student_package.update_student(new_stu);

  9  EXCEPTION

 10     WHEN dup_val_on_index THEN

 11             dbms_output.put_line('违反唯一约束!');

 12     WHEN OTHERS THEN

 13             dbms_output.put_line('更新时意外错误!');

 14  END;

 15  /

修改学生记录成功!

PL/SQL 过程已成功完成。

SQL> BEGIN

  2     student_package.delete_student(9);

  3  END;

  4  /

删除编号为:9的学生记录成功!

PL/SQL 过程已成功完成。

SQL> BEGIN

  2     dbms_output.put_line(student_package.return_record_count);

  3  END;

  4  /

12

PL/SQL 过程已成功完成。

SQL> CREATE OR REPLACE PACKAGE restrict_package IS

  2     PROCEDURE update_my_dept(d_no NUMBER);

  3     PRAGMA RESTRICT_REFERENCES(update_my_dept, WNDS);

  4  END;

  5  /

程序包已创建。

SQL> CREATE OR REPLACE PACKAGE BODY restrict_package IS

  2     PROCEDURE update_my_dept(d_no NUMBER) IS

  3     BEGIN

  4             UPDATE my_dept SET loc = 'zhongguo' WHERE deptno = d_no;

  5     END;

  6  END;

  7  /

警告: 创建的包体带有编译错误。

SQL> show errors;

PACKAGE BODY RESTRICT_PACKAGE 出现错误:

LINE/COL ERROR

-------- -----------------------------------------------------------------

2/2      PLS-00452: 子程序 'UPDATE_MY_DEPT' 违反了它的相关编译指示

SQL> DROP PACKAGE restrict_package;

程序包已丢弃。

SQL> DROP PACKAGE BODY restrict_package;

SQL> set autoprint on ;

SQL> variable temp_cursor refcursor;

SQL> execute student_package.return_student(:temp_cursor);

PL/SQL 过程已成功完成。

        ID NAME                      SCORE      SUBID

---------- -------------------- ---------- ----------

         1 student_1                    11

         2 student_2                    12

         3 wangwu                       13

         4 student_4                    14

         5 student_5                    15

         6 student_6                    16

         7 student_7                    17

         8 student_8                    18

        10 student_10                   20

        11 student_11                   21

        12 student_12                   22

        ID NAME                      SCORE      SUBID

---------- -------------------- ---------- ----------

        13 student_13                   23

        17 zhangsan                     88          2

已选择13行。

【触发器】

SQL> CREATE OR REPLACE TRIGGER insert_student_trigger

  2     BEFORE INSERT ON student

  3  BEGIN

  4     dbms_output.put_line('触发器被触发...');

  5  END;

  6  /

触发器已创建

SQL> drop trigger insert_student_trigger;

触发器已丢弃

SQL> CREATE OR REPLACE TRIGGER update_student_trigger

  2     AFTER UPDATE ON student

  3  BEGIN

  4     dbms_output.put_line('触发器被触发...');

  5  END;

  6  /

触发器已创建

SQL> CREATE OR REPLACE TRIGGER update_student_trigger

  2     AFTER UPDATE ON student

  3     FOR EACH ROW

  4  BEGIN

  5     dbms_output.put_line('触发器被触发...');

  6  END;

  7  /

触发器已创建

SQL> update student set subid = 1;

触发器被触发...

触发器被触发...

触发器被触发...

触发器被触发...

触发器被触发...

触发器被触发...

触发器被触发...

触发器被触发...

触发器被触发...

触发器被触发...

触发器被触发...

触发器被触发...

触发器被触发...

SQL> CREATE OR REPLACE TRIGGER insert_my_dept_trigger

  2     AFTER INSERT ON my_dept

  3     FOR EACH ROW

  4  BEGIN

  5     dbms_output.put_line('触发器被触发...');

  6  END;

  7  /

触发器已创建

SQL> insert into my_dept values(60,'job','zhejiang');

触发器被触发...

SQL> CREATE OR REPLACE TRIGGER insert_student_trigger

  2     BEFORE INSERT ON student

  3     FOR EACH ROW

  4  BEGIN

  5     dbms_output.put_line('触发器被触发...');

  6     dbms_output.put_line('new ==> stuid =' || :new.stuid || ' name = ' || :new.name || ' score = ' || :new.score || ' subid = ' || :new.subid);

  7  END;

  8  /

触发器已创建

SQL> INSERT INTO student VALUES(1,'zhangsan',88.8,2);

触发器被触发...

new ==> stuid =1 name = zhangsan score = 88.8 subid = 2

已创建 1 行。

SQL> INSERT INTO student VALUES(2,'lisi',79,1);

触发器被触发...

new ==> stuid =2 name = lisi score = 79 subid = 1

已创建 1 行。

SQL> CREATE OR REPLACE TRIGGER delete_student_trigger

  2     BEFORE DELETE ON student

  3     FOR EACH ROW

  4  BEGIN

  5     dbms_output.put_line('触发器被触发...');

  6     dbms_output.put_line('old: stuid = ' || :old.stuid || ' name = ' || :old.name || ' score = ' || :old.score || ' subid = ' || :old.subid);

  7  END;

  8  /

触发器已创建

SQL> DELETE FROM student ;

触发器被触发...

old: stuid = 1 name = zhangsan score = 88.8 subid = 2

触发器被触发...

old: stuid = 2 name = lisi score = 79 subid = 1

已删除2行。

SQL> CREATE OR REPLACE TRIGGER update_student_trigger

  2     BEFORE UPDATE ON student

  3     FOR EACH ROW

  4  BEGIN

  5     dbms_output.put_line('触发器被触发...');

  6     dbms_output.put_line('old: stuid = ' || :old.stuid || ' name = ' || :old.name || ' score = ' || :old.score || ' subid = ' || :old.subid);

  7     dbms_output.put_line('new: stuid = ' || :new.stuid || ' name = ' || :new.name || ' score = ' || :new.score || ' subid = ' || :new.subid);

  8  END;

  9  /

触发器已创建

SQL> UPDATE student SET name = 'zhangsan', score = 76, subid = 1;

触发器被触发...

old: stuid = 1 name = AA score = 88 subid = 2

new: stuid = 1 name = zhangsan score = 76 subid = 1

已更新 1 行。

SQL> CREATE OR REPLACE TRIGGER delete_student_trigger

  2     AFTER DELETE ON student

  3     FOR EACH ROW

  4     WHEN (old.subid = 1)

  5  BEGIN

  6     dbms_output.put_line('触发器被触发...');

  7     dbms_output.put_line('old: stuid = ' || :old.stuid || ' name = ' || :old.name || ' score = ' || :old.score || ' subid = ' || :old.subid);

  8  END;

  9  /

触发器已创建

SQL> DELETE FROM student;

触发器被触发...

old: stuid = 1 name = zhangsan score = 76 subid = 1

已删除 1 行。

SQL> CREATE TABLE student_log AS SELECT * FROM student;

表已创建。

SQL> CREATE OR REPLACE TRIGGER student_trigger

  2     BEFORE INSERT OR UPDATE OR DELETE ON student

  3     FOR EACH ROW

  4  BEGIN

  5     IF inserting

  6     THEN

  7             INSERT INTO student_log VALUES (:new.stuid, :new.name, :new.score, :new.subid);

  8     END IF;

  9     IF deleting

 10     THEN

 11             INSERT INTO student_log VALUES (:old.stuid, :old.name, :old.score, :old.subid);

 12     END IF;

 13  EXCEPTION

 14     WHEN OTHERS THEN

 15             dbms_output.put_line('触发器意外错误!' || SQLCODE || ' ==> ' || SQLERRM);

 16  END;

 17  /

触发器已创建

SQL> insert into student values(2,'lisi',77,1);

触发器被触发...

new ==> stuid =2 name = lisi score = 77 subid = 1

已创建 1 行。

SQL> select * from student_log;

     STUID NAME                      SCORE      SUBID

---------- -------------------- ---------- ----------

         2 lisi                         77          1

SQL> CREATE TABLE worker_job (workid number,workname varchar2(20),salary number,job varchar2(20));

表已创建。

SQL> CREATE TABLE goods_store (goods_no int primary key,goods_count number);

表已创建。

SQL> create table goods_store_out(goods_no int,goods_count number,goods_out_date date default sysdate);

表已创建。

SQL> CREATE OR REPLACE TRIGGER goods_out_trigger

  2     AFTER INSERT ON goods_store_out

  3     FOR EACH ROW

  4  BEGIN

  5     UPDATE goods_store SET goods_count = goods_count - :new.goods_count WHERE goods_no = :new.goods_no;

  6     dbms_output.put_line('出库商品编号为:' || :new.goods_no || '数量为:' || :new.goods_count);

  7  END;

  8  /

触发器已创建

SQL> insert into goods_store_out values(101,62,sysdate);

出库商品编号为:101数量为:62

SQL> select * from goods_store;

  GOODS_NO GOODS_COUNT

---------- -----------

       101          38

       102         200

       103         300

SQL> CREATE OR REPLACE VIEW student_subject_view

  2    AS SELECT s.stuid, s.name, s.score, s.subid,b.subname FROM student s, subject b WHERE s.subid = b.subid;

视图已建立。

SQL> CREATE OR REPLACE TRIGGER student_subject_trigger

  2     INSTEAD OF INSERT ON student_subject_view

  3     REFERENCING NEW n

  4     FOR EACH ROW

  5  DECLARE

  6     icount INT;

  7  BEGIN

  8

  9     SELECT COUNT(*) INTO icount FROM student WHERE stuid = :n.stuid;

 10     IF icount = 0

 11     THEN

 12             INSERT INTO student (stuid, NAME, score, subid) VALUES (:n.stuid, :n.name, :n.score, :n.subid);

 13     ELSE

 14             UPDATE student SET NAME = :n.name, score = :n.score, subid = :n.subid WHERE stuid = :n.stuid;

 15     END IF;

 16

 17     SELECT COUNT(*) INTO icount FROM subject WHERE subid = :n.subid;

 18     IF icount = 0

 19     THEN

 20             INSERT INTO subject VALUES (:n.subid, :n.subname);

 21     ELSE

 22             UPDATE subject SET subname = :n.subname WHERE subid = :n.subid;

 23     END IF;

 24

 25  END;

 26  /

触发器已创建

SQL> select * from student;

     STUID NAME                      SCORE      SUBID

---------- -------------------- ---------- ----------

         2 lisi                         77          1

         1 zhangsan                     92          2

         3 wangwu                       88          3

         4 zhaoliu                      68          4

SQL> select * from subject;

     SUBID SUBNAME

---------- --------------------

         1 java

         2 c/c++

         3 php

         4 c#

         5 javascript

SQL> select *  from student_subject_view;

     STUID NAME                      SCORE      SUBID SUBNAME

---------- -------------------- ---------- ---------- --------------------

         2 lisi                         77          1 java

         1 zhangsan                     92          2 c/c++

         3 wangwu                       88          3 php

         4 zhaoliu                      68          4 c#

SQL> insert into student_subject_view values(5,'sunqi',79,6,'html');

触发器被触发...

new ==> stuid =5 name = sunqi score = 79 subid = 6

已创建 1 行。

SQL> select * from subject;

     SUBID SUBNAME

---------- --------------------

         1 java

         2 c/c++

         3 php

         4 c#

         5 javascript

         6 html

已选择6行。

SQL> select * from subject;

     SUBID SUBNAME

---------- --------------------

         1 java

         2 c/c++

         3 php

         4 c#

         5 javascript

         6 html

已选择6行。

SQL> select *  from student_subject_view;

     STUID NAME                      SCORE      SUBID SUBNAME

---------- -------------------- ---------- ---------- --------------------

         2 lisi                         77          1 java

         1 zhangsan                     92          2 c/c++

         3 wangwu                       88          3 php

         4 zhaoliu                      68          4 c#

         5 sunqi                        79          6 html

SQL> CREATE TABLE emp_tab AS SELECT * FROM emp;

表已创建。

SQL> CREATE OR REPLACE TRIGGER emp_trigger

  2     AFTER DELETE ON emp_tab

  3     FOR EACH ROW

  4  DECLARE

  5     n INTEGER;

  6  BEGIN

  7     SELECT COUNT(*) INTO n FROM emp_tab;

  8     dbms_output.put_line('数量:' || n);

  9  END;

 10  /

触发器已创建

SQL> delete from emp_tab;

delete from emp_tab

            *

ERROR 位于第 1 行:

ORA-04091: 表 SCOTT.EMP_TAB 发生了变化,触发器/函数不能读

ORA-06512: 在"SCOTT.EMP_TRIGGER", line 4

ORA-04088: 触发器 'SCOTT.EMP_TRIGGER' 执行过程中出错

SQL> ALTER TRIGGER emp_trigger ENABLE;

触发器已更改

SQL> ALTER TRIGGER emp_trigger DISABLE;

触发器已更改

SQL> DESC user_triggers;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 TRIGGER_NAME                                       VARCHAR2(30)

 TRIGGER_TYPE                                       VARCHAR2(16)

 TRIGGERING_EVENT                                   VARCHAR2(227)

 TABLE_OWNER                                        VARCHAR2(30)

 BASE_OBJECT_TYPE                                   VARCHAR2(16)

 TABLE_NAME                                         VARCHAR2(30)

 COLUMN_NAME                                        VARCHAR2(4000)

 REFERENCING_NAMES                                  VARCHAR2(128)

 WHEN_CLAUSE                                        VARCHAR2(4000)

 STATUS                                             VARCHAR2(8)

 DESCRIPTION                                        VARCHAR2(4000)

 ACTION_TYPE                                        VARCHAR2(11)

 TRIGGER_BODY                                       LONG

SQL> desc dba_triggers;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 OWNER                                              VARCHAR2(30)

 TRIGGER_NAME                                       VARCHAR2(30)

 TRIGGER_TYPE                                       VARCHAR2(16)

 TRIGGERING_EVENT                                   VARCHAR2(227)

 TABLE_OWNER                                        VARCHAR2(30)

 BASE_OBJECT_TYPE                                   VARCHAR2(16)

 TABLE_NAME                                         VARCHAR2(30)

 COLUMN_NAME                                        VARCHAR2(4000)

 REFERENCING_NAMES                                  VARCHAR2(128)

 WHEN_CLAUSE                                        VARCHAR2(4000)

 STATUS                                             VARCHAR2(8)

 DESCRIPTION                                        VARCHAR2(4000)

 ACTION_TYPE                                        VARCHAR2(11)

 TRIGGER_BODY                                       LONG

SQL> desc all_triggers;

 名称                                      是否为空? 类型

 ----------------------------------------- -------- ----------------------------

 OWNER                                              VARCHAR2(30)

 TRIGGER_NAME                                       VARCHAR2(30)

 TRIGGER_TYPE                                       VARCHAR2(16)

 TRIGGERING_EVENT                                   VARCHAR2(227)

 TABLE_OWNER                                        VARCHAR2(30)

 BASE_OBJECT_TYPE                                   VARCHAR2(16)

 TABLE_NAME                                         VARCHAR2(30)

 COLUMN_NAME                                        VARCHAR2(4000)

 REFERENCING_NAMES                                  VARCHAR2(128)

 WHEN_CLAUSE                                        VARCHAR2(4000)

 STATUS                                             VARCHAR2(8)

 DESCRIPTION                                        VARCHAR2(4000)

 ACTION_TYPE                                        VARCHAR2(11)

 TRIGGER_BODY                                       LONG

【内置程序包】

DBMS_STANDARD

DBMS_ALERT

DBMS_APPLICATION_INFO

DBMS_AQ & DBMS_AQADM

DBMS_DEFER

DBMS_DEFER_SYS

DBMS_DEFER_QUERY

DBMS_DDL

CALENDAR

DBMS_DESCIRIBE

DBMS_LOB

DBMS_JOB

DBMS_LOCK

DBMS_OUTPUT

... ...

SQL> set serveroutput on;

SQL> set serveroutput on size 1500;

SP2-0547: size选项1500超出范围(自2000至1000000)

SQL> set serveroutput on size 5000;

SQL> DECLARE

  2     str VARCHAR2(20) := 'Hello Oracle';

  3  BEGIN

  4     dbms_output.put(str);

  5     dbms_output.put_line('Oracle内置包DBMS_OUTPUT显示');

  6  END;

  7  /

Hello OracleOracle内置包DBMS_OUTPUT显示

PL/SQL 过程已成功完成。

SQL> CREATE  TABLE down_file_list (id number not null primary key,name varchar2(50) not null, file_location bfile,file_description clob);

表已创建。

SQL> CREATE OR REPLACE DIRECTORY file_dir AS 'D:\DOWN_LOAD_LIST';

目录已创建。

SQL> INSERT INTO down_file_list VALUES(1001,'oracle plsql book',bfilename(upper('file_dir'),'java.zip'),'this is clob description ...');

已创建 1 行。

SQL> INSERT INTO down_file_list VALUES(1002,'java study',bfilename(upper('file_dir'),'java.txt'),'this is clob description about java study...');

已创建 1 行。

SQL> select * from down_file_list;

SP2-0678: 列或属性类型无法通过 SQL*Plus 显示

SQL> select id,name,file_description from down_file_list;

        ID NAME

---------- --------------------------------------------------

FILE_DESCRIPTION

---------------------------------------------------------------

      1001 oracle plsql book

this is clob description ...

SQL> update down_file_list set file_location = bfilename(upper('file_dir'),'oracle.gif') where id = 1001;

已更新 1 行。

SQL> DECLARE

  2     temp_desc    CLOB;

  3     i_read_count INT;

  4     i_start      INT;

  5     out_put_desc VARCHAR2(100);

  6  BEGIN

  7     i_read_count := 10;

  8     i_start      := 1;

  9     SELECT file_description INTO temp_desc FROM down_file_list WHERE id = 1002;

 10     dbms_lob.read(temp_desc, i_read_count, i_start, out_put_desc);

 11     dbms_output.put_line('前10个字符是:' || out_put_desc);

 12  END;

 13  /

前10个字符是:this is cl

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     temp_clob CLOB;

  3     i_len     INT;

  4  BEGIN

  5     SELECT file_description INTO temp_clob FROM down_file_list WHERE id = 1002;

  6     i_len := dbms_lob.getlength(temp_clob);

  7     dbms_output.put_line('长度为:' || i_len);

  8  EXCEPTION

  9     WHEN OTHERS THEN

 10             dbms_output.put_line('其他错误!');

 11  END;

 12  /

长度为:44

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     temp_desc CLOB;

  3     i_count   INT;

  4     i_start   INT;

  5     new_var   VARCHAR2(60);

  6  BEGIN

  7     i_count := 2;

  8     i_start := 1;

  9     new_var := ' 这事一本好书,介绍一下。。。';

 10     SELECT file_description INTO temp_desc FROM down_file_list WHERE id = 1002 FOR UPDATE;

 11     dbms_output.put_line('修改前:' || temp_desc);

 12     dbms_output.put_line('从 ' || i_start || '开始的' || i_count || '个字符被改成' || new_var);

 13     COMMIT;

 14  END;

 15  /

修改前:this is clob description about java study...

从 1开始的2个字符被改成 这事一本好书,介绍一下。。。

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     dest_desc CLOB;

  3     src_desc  CLOB;

  4  BEGIN

  5     SELECT file_description INTO dest_desc FROM down_file_list WHERE id = 1002 FOR UPDATE;

  6     SELECT file_description INTO src_desc FROM down_file_list WHERE id = 1001;

  7     dbms_lob.append(dest_desc, src_desc);

  8     COMMIT;

  9  END;

 10  /

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     temp_desc CLOB;

  3     i_count   INT;

  4     i_start   INT;

  5  BEGIN

  6     i_count := 3;

  7     i_start := 1;

  8     SELECT file_description INTO temp_desc FROM down_file_list WHERE id = 1002 FOR UPDATE;

  9     dbms_lob.erase(temp_desc, i_count, i_start);

 10     COMMIT;

 11  END;

 12  /

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     dest_desc    CLOB;

  3     src_desc     CLOB;

  4     i_count      INT;

  5     i_dest_start INT;

  6     i_src_start  INT;

  7  BEGIN

  8     i_count      := 10;

  9     i_dest_start := 10;

 10     i_src_start  := 1;

 11     SELECT file_description INTO dest_desc FROM down_file_list WHERE id = 1002;

 12     SELECT file_description INTO src_desc FROM down_file_list WHERE id = 1002;

 13     dbms_output.put_line('复制前:' || dest_desc || '长度:' || dbms_lob.getlength(dest_desc));

 14     dbms_output.put_line('要复制的内容:' || dbms_lob.substr(src_desc, i_count, i_src_start));

 15     dbms_lob.copy(dest_desc, src_desc, i_count, i_dest_start, i_src_start);

 16     COMMIT;

 17  END;

 18  /

 SQL> set serveroutput on linesize 260;

SQL> create or replace directory filepath as 'D:\WINORACLE\';

目录已创建。

SQL> DESC dba_directories;

 名称

 ------------------------------------------------------------------

 OWNER

 DIRECTORY_NAME

 DIRECTORY_PATH

SQL> select * from dba_directories where directory_name = upper('filepath');

OWNER                          DIRECTORY_NAME

------------------------------ ------------------------------

DIRECTORY_PATH

----------------------------------------------------------------------------------

SYS                            FILEPATH

D:\WINORACLE\

SQL> INSERT INTO down_file_list VALUES (1003, '安装日志测试...', bfilename('FILEPATH', 'setup_log.txt'), '记录安装操作过程测试...');

已创建 1 行。

SQL> INSERT INTO down_file_list VALUES (1004, '发生的皇室典范', bfilename('FILEPATH', 'log.tt'), '和法国队...');

已创建 1 行。

SQL> SELECT id, NAME, file_description, dbms_lob.fileexists(file_location) FROM down_file_list;

        ID NAME                                               FILE_DESCRIPTION                                                         DBMS_LOB.FILEEXISTS(FILE_LOCATION)

---------- -------------------------------------------------- -------------------------------------------------------------------------------- ----------------------------------

      1001 oracle plsql book                                  this is clob description ...                                                                              1

      1002 java study                                            s is clob description about java study...this is clob description ...                                          1

      1003 安装日志测试...                                    记录安装操作过程测试...                                                                                   0

      1004 发生的皇室典范                                     和法国队...                                                                                               0

SQL> DECLARE

  2     temp_file          BFILE;

  3     i_file_exists_flag INT;

  4     i_file_open_flag   INT;

  5     i_out_put_count    NUMBER;

  6     i_start            INT;

  7     i_dir_alias        VARCHAR(20);

  8     file_name          VARCHAR(20);

  9     out_put_var        LONG;

 10  BEGIN

 11     SELECT file_location INTO temp_file FROM down_file_list WHERE id = 1004;

 12     dbms_lob.filegetname(file_loc => temp_file, dir_alias => i_dir_alias, filename => file_name);

 13     i_file_exists_flag := dbms_lob.fileexists(temp_file);

 14     IF i_file_exists_flag = 1

 15     THEN

 16             dbms_output.put_line(i_dir_alias || '\' || file_name || '存在!');

 17     ELSE

 18             dbms_output.put_line('文件不存在!');

 19             GOTO endblock;

 20     END IF;

 21

 22     i_file_open_flag := dbms_lob.fileisopen(temp_file);

 23     IF i_file_open_flag = 1

 24     THEN

 25             dbms_output.put_line('文件已经打开!');

 26             GOTO endblock;

 27     ELSE

 28             dbms_output.put_line('正在打开文件...');

 29             dbms_lob.fileopen(temp_file);

 30     END IF;

 31     i_out_put_count := 100;

 32     i_start         := 1;

 33     dbms_lob.read(temp_file, i_out_put_count, i_start, out_put_var);

 34     dbms_output.put_line('文件内容的从' || i_start || '开始的' || i_out_put_count || '内容是:');

 35     dbms_output.put_line(out_put_var);

 36     dbms_output.put_line('正在关闭文件...' || file_name);

 37     dbms_lob.fileclose(temp_file);

 38     dbms_output.put_line('完成输出操作!');

 39     <<endblock>>

 40     NULL;

 41  EXCEPTION

 42     WHEN no_data_found THEN

 43             dbms_output.put_line('没有找到相应的记录!');

 44     WHEN OTHERS THEN

 45             dbms_output.put_line('其他错误!');

 46  END;

 47  /

文件不存在!

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     temp_file          BFILE;

  3     i_file_exists_flag INT;

  4     i_file_open_flag   INT;

  5     i_out_put_count    NUMBER;

  6     i_start            INT;

  7     i_dir_alias        VARCHAR(20);

  8     file_name          VARCHAR(20);

  9     out_put_var        LONG;

 10  BEGIN

 11     SELECT file_location INTO temp_file FROM down_file_list WHERE id = 1004;

 12     dbms_lob.filegetname(file_loc => temp_file, dir_alias => i_dir_alias, filename => file_name);

 13     i_file_exists_flag := dbms_lob.fileexists(temp_file);

 14     IF i_file_exists_flag = 1

 15     THEN

 16             dbms_output.put_line(i_dir_alias || '\' || file_name || '存在!');

 17     ELSE

 18             dbms_output.put_line('文件不存在!');

 19             GOTO endblock;

 20     END IF;

 21

 22     i_file_open_flag := dbms_lob.fileisopen(temp_file);

 23     IF i_file_open_flag = 1

 24     THEN

 25             dbms_output.put_line('文件已经打开!');

 26             GOTO endblock;

 27     ELSE

 28             dbms_output.put_line('正在打开文件...');

 29             dbms_lob.fileopen(temp_file);

 30     END IF;

 31     i_out_put_count := 100;

 32     i_start         := 1;

 33     dbms_lob.read(temp_file, i_out_put_count, i_start, out_put_var);

 34     dbms_output.put_line('文件内容的从' || i_start || '开始的' || i_out_put_count || '内容是:');

 35     dbms_output.put_line(out_put_var);

 36     dbms_output.put_line('正在关闭文件...' || file_name);

 37     dbms_lob.fileclose(temp_file);

 38     dbms_output.put_line('完成输出操作!');

 39     <<endblock>>

 40     NULL;

 41  EXCEPTION

 42     WHEN no_data_found THEN

 43             dbms_output.put_line('没有找到相应的记录!');

 44     WHEN OTHERS THEN

 45             dbms_output.put_line('其他错误!');

 46  END;

 47  /

FILEPATH\log.tt存在!

正在打开文件...

文件内容的从1开始的100内容是:

C8F6B4F2B7A2CABFB4F3B7F2C8F6B5A9B7A8B6BCCAC7B7A2B7C5CAB1B4FAB4F3CFC3B7B4B6D4C8F6B7B6B5C2C8F8B7A2B5DAC8FDB7BDB5C4C8F8B7D2B4F2CBE3766473667662647366687364666720C9CFB5C4B7E7B8F1B6BCCAC7B7A8B9FAB7A2B4EFB9

正在关闭文件...log.tt

完成输出操作!

PL/SQL 过程已成功完成。

【PLSQL表】

SQL> DECLARE

  2     TYPE table_type IS TABLE OF VARCHAR(20) INDEX BY BINARY_INTEGER;

  3     tp table_type;

  4  BEGIN

  5     tp(1) := 'tomcat';

  6     tp(2) := 'jack';

  7     dbms_output.put_line('第一个元素是:' || tp(1));

  8     dbms_output.put_line('第二个元素是:' || tp(2));

  9  END;

 10  /

第一个元素是:tomcat

第二个元素是:jack

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     TYPE table_type IS TABLE OF VARCHAR(20) INDEX BY BINARY_INTEGER;

  3     tp table_type;

  4  BEGIN

  5     FOR i IN 1 .. 10

  6     LOOP

  7             tp(i) := 'table_type_test_' || i;

  8     END LOOP;

  9     FOR i IN 1 .. 10

 10     LOOP

 11             dbms_output.put_line('第' || i || '个元素是:' || tp(i));

 12     END LOOP;

 13  END;

 14  /

第1个元素是:table_type_test_1

第2个元素是:table_type_test_2

第3个元素是:table_type_test_3

第4个元素是:table_type_test_4

第5个元素是:table_type_test_5

第6个元素是:table_type_test_6

第7个元素是:table_type_test_7

第8个元素是:table_type_test_8

第9个元素是:table_type_test_9

第10个元素是:table_type_test_10

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     TYPE table_type IS TABLE OF VARCHAR(20) INDEX BY BINARY_INTEGER;

  3     tp table_type;

  4  BEGIN

  5     FOR i IN 1 .. 10

  6     LOOP

  7             tp(i) := 'table_type_test_' || i;

  8     END LOOP;

  9     tp.delete(7);

 10     FOR i IN 1 .. 10

 11     LOOP

 12             dbms_output.put_line('第' || i || '个元素是:' || tp(i));

 13     END LOOP;

 14  END;

 15  /

第1个元素是:table_type_test_1

第2个元素是:table_type_test_2

第3个元素是:table_type_test_3

第4个元素是:table_type_test_4

第5个元素是:table_type_test_5

第6个元素是:table_type_test_6

DECLARE

*

ERROR 位于第 1 行:

ORA-01403: 未找到数据

ORA-06512: 在line 12

SQL> DECLARE

  2     TYPE table_type IS TABLE OF VARCHAR(20) INDEX BY BINARY_INTEGER;

  3     tp table_type;

  4  BEGIN

  5     FOR i IN 2 .. 10

  6     LOOP

  7             tp(i) := 'table_type_test_' || i;

  8     END LOOP;

  9

 10     FOR i IN 1 .. 10

 11     LOOP

 12             dbms_output.put_line('第' || i || '个元素是:' || tp(i));

 13     END LOOP;

 14  END;

 15  /

DECLARE

*

ERROR 位于第 1 行:

ORA-01403: 未找到数据

ORA-06512: 在line 12

SQL> DECLARE

  2     TYPE stu_record_type IS RECORD(

  3             t_id    student.stuid%TYPE,

  4             t_name  student.name%TYPE,

  5             t_score student.score%TYPE,

  6             t_subid student.subid%TYPE);

  7     stu_rec stu_record_type;

  8  BEGIN

  9     SELECT s.stuid, s.name, s.score, s.subid INTO stu_rec FROM student s WHERE s.stuid = 2;

 10     dbms_output.put_line(stu_rec.t_id || ' - ' || stu_rec.t_name || ' - ' || stu_rec.t_score || ' - ' || stu_rec.t_subid);

 11  EXCEPTION

 12     WHEN no_data_found THEN

 13             dbms_output.put_line('没有数据!');

 14  END;

 15  /

2 - lisi - 77 - 1

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     TYPE stu_record_type IS RECORD(

  3             t_id   student.stuid%TYPE,

  4             t_name student.name%TYPE,

  5             t_dept my_dept%ROWTYPE);

  6     stu_rec stu_record_type;

  7  BEGIN

  8     stu_rec.t_id          := 111;

  9     stu_rec.t_name        := 'yangguo';

 10     stu_rec.t_dept.deptno := 10;

 11     stu_rec.t_dept.dname  := 'sales';

 12     stu_rec.t_dept.loc    := 'hangzhou';

 13     dbms_output.put_line(stu_rec.t_id || ' - ' || stu_rec.t_name || ' - ' || stu_rec.t_dept.deptno || ' - ' || stu_rec.t_dept.dname || ' - ' ||

 14                                                                                      stu_rec.t_dept.loc);

 15  EXCEPTION

 16     WHEN no_data_found THEN

 17             dbms_output.put_line('没有数据!');

 18  END;

 19  /

111 - yangguo - 10 - sales - hangzhou

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     TYPE student_tab_type IS TABLE OF student%ROWTYPE INDEX BY BINARY_INTEGER;

  3     stu_tp student_tab_type;

  4  BEGIN

  5     SELECT s.stuid, s.name, s.score, s.subid BULK COLLECT INTO stu_tp FROM student s;

  6     dbms_output.put_line('记录为:' || stu_tp.count);

  7     dbms_output.put_line(' student :' || stu_tp(1).stuid || ' ' || stu_tp(1).name || ' - ' || stu_tp(1).score || ' - ' || stu_tp(1).subid);

  8  END;

  9  /

记录为:5

student :2 lisi - 77 - 1

PL/SQL 过程已成功完成。

【成员函数和过程】

SQL> CREATE OR REPLACE TYPE per_type AS OBJECT

  2  (

  3     pid   NUMBER,

  4     pname VARCHAR2(20),

  5     MEMBER FUNCTION getid RETURN INT,

  6     MEMBER PROCEDURE setid(p_id INT),

  7     MEMBER FUNCTION getname RETURN VARCHAR,

  8     MEMBER PROCEDURE setname(p_name VARCHAR)

  9  )

 10  NOT FINAL;

 11  /

类型已创建。

SQL> CREATE OR REPLACE TYPE BODY per_type AS

  2     MEMBER FUNCTION getid RETURN INT IS

  3     BEGIN

  4             RETURN pid;

  5     END getid;

  6     MEMBER PROCEDURE setid(p_id INT) AS

  7     BEGIN

  8             pid := p_id;

  9     END setid;

 10     MEMBER FUNCTION getname RETURN VARCHAR IS

 11     BEGIN

 12             RETURN pname;

 13     END getname;

 14     MEMBER PROCEDURE setname(p_name VARCHAR) IS

 15     BEGIN

 16             pname := p_name;

 17     END setname;

 18  END;

 19  /

类型主体已创建。

SQL> DECLARE

  2     p per_type;

  3  BEGIN

  4     p := per_type(1001, 'tom');

  5     dbms_output.put_line(p.pid || '  ' || p.pname);

  6     dbms_output.put_line(p.getid || '  ' || p.getname);

  7  END;

  8  /

1001  tom

1001  tom

PL/SQL 过程已成功完成。

SQL> DECLARE

  2     p per_type;

  3  BEGIN

  4     p := per_type(1001, 'tom');

  5     dbms_output.put_line(p.pid || '  ' || p.pname);

  6     dbms_output.put_line(p.getid || '  ' || p.getname);

  7     p.setid(2001);

  8     p.setname('jack');

  9     dbms_output.put_line(p.pid || '  ' || p.pname);

 10     dbms_output.put_line(p.getid || '  ' || p.getname);

 11  END;

 12  /

1001  tom

1001  tom

2001  jack

2001  jack

PL/SQL 过程已成功完成。

SQL> CREATE TABLE person_table OF per_type;

表已创建。

SQL> INSERT INTO person_table VALUES(1101,'jettry');

已创建 1 行。

SQL> INSERT INTO person_table VALUES(per_type(1102,'edsion'));

已创建 1 行。

SQL> select ref(o) oid from person_table o;

OID

--------------------------------------------------------------------------------

0000280209379FE0E0DA3D48AA9A0D2DF5655A15E223B52098BADC4E62BAAE04E32A10BAD20040D6

520000

0000280209DFE0E67D6E8A4C5686C5CF58DE4915D723B52098BADC4E62BAAE04E32A10BAD20040D6

520001

SQL> select value(o) obj from person_table o;

OBJ(PID, PNAME)

--------------------------------------------------------------------------------

PER_TYPE(1101, 'jettry')

PER_TYPE(1102, 'edsion')

SQL> select p.getid() id, p.getname() name from person_table p where p.pid = 1102;

        ID

----------

NAME

--------------------------------------------------------------------------------

      1102

edsion

猜你喜欢

转载自yanguz123.iteye.com/blog/1547205