首页 > 精品范文库 > 14号文库
Oracle异常总结5篇
编辑:夜幕降临 识别码:23-340617 14号文库 发布时间: 2023-04-07 09:35:01 来源:网络

第一篇:Oracle异常总结

Oracle异常总结

Oracle异常处理异常处理是考验一个应用程序健壮性的最好方式,开发人员必须考虑程序中可能出现的各种错误,并进行相应的处理。

Oracle中异常分为预定义异常,非预定义异常和自定义异常三种。

一预定义异常预定义异常是指由PL/SQL所提供的系统异常。当PL/SQL应用程序违反了Oracle规则或出现其它系统限制的情况时,将会隐含地触发一个内部异常。

以下是PL/SQL为我们预定义的异常(经常更新中): CURSOR_ALREADY_OPEN该异常触发ORA-06511错误。

当程序中的一个游标已经执行了打开操作,如果开发人员试图再一次打开这个已经打开的游标时,将触发该异常。

示例: DECLARE CURSOR test_cursor IS SELECT SYSDATE FROM dual;BEGIN OPEN test_cursor;FOR test_cursor2 IN test_cursor LOOP dbms_output.put_line(test_cursor2.SYSDATE);END LOOP;EXCEPTION WHEN cursor_already_open THEN dbms_output.put_line('游标已经打开,不能再次对游标执行打开操作。');END;/ 2 INCALID_CURSOR该异常触发ORA-01001错误。

当试图对一个尚未打开的游标执行任何操作,如打开该非法的游标执行赋值操作,或者关闭未打开的游标时,将触发该异常。

示例: DECLARE CURSOR test_cursor IS SELECT SYSDATE FROM dual;test_time DATE;BEGIN--OPEN test_cursor;FETCH test_cursor INTO test_time;dbms_output.put_line('当前时间为: ' || test_time);CLOSE test_cursor;EXCEPTION WHEN invalid_cursor THEN dbms_output.put_line('请检查游标是否已经打开.');END;/ 3 NO_DATA_FOUND该异常触发ORA-01403错误。

当读取一个游标进行赋值操作(SELECT INTO操作)时,如果未返回任何行,将触发该异常。

示例: DECLARE test_owner DATE;BEGIN SELECT t.owner INTO test_owner FROM all_tables t WHERE t.table_name = 'test';dbms_output.put_line(test_owner);EXCEPTION WHEN NO_DATA_FOUND THEN dbms_output.put_line('No value.');END;/ 4 TOO_MANY_ROWS该异常触发ORA-01422错误。

上面是没有返回记录,这里是返回对条记录的时候会触发该异常。示例: DECLARE test_records dba_tables%ROWTYPE;BEGIN select * INTO test_records from dba_tables where owner='APPS' AND ROWNUM < 3;dbms_output.put_line(test_records.table_name);EXCEPTION WHEN too_many_rows THEN dbms_output.put_line('Too many values.');END;/ 5 VALUE_ERROR该异常触发ORA-06502错误。

当在PL/SQL程序中执行赋值操作时,如果右边值的长度大于左边变量的长度,将触发该异常。

示例: DECLARE v_test VARCHAR2(1);BEGIN SELECT 'WHAT' INTO v_test FROM dual;dbms_output.put_line(v_test);EXCEPTION WHEN value_error THEN dbms_output.put_line('变量的长度不够.');END;/ 6 DUP_VAL_ON_INDEX该异常触发ORA-00001错误。

若表的每一列声明为主键,或具有惟一性,如果对该列插入重复的值时将触发该异常。示例:

CREATE TABLE test_table(v_id NUMBER PRIMARY KEY, v_name VARCHAR2(20))INSERT INTO test_table VALUES(1,'test1');INSERT INTO test_table VALUES(2,'test2');SELECT * FROM test_table;BEGIN UPDATE test_table SET v_name = new_name WHERE v_id = &input_id;EXCEPTION WHEN dup_val_on_index THEN dbms_output.put_line('在deptno列上不能出现重复值.');END;/ 7 CASE_NOT_FOUND该异常触发ORA-06592错误。

在CASE语句中,如果CASE语句的条件在WHEN子句中没有找到对应的条件分支,且该CASE语句不包含ELSE分支,将触发该异常。示例: DECLARE v_test NUMBER;BEGIN SELECT val INTO v_test FROM dual;CASE WHEN v_test = 1 THEN dbms_output.put_line(v_test);WHEN v_test = 2 THEN dbms_output.put_line(v_test);WHEN v_test = 3 THEN dbms_output.put_line(v_test);--ELSE

--dbms_output.put_line(v_test);END CASE;EXCEPTION WHEN case_not_found THEN dbms_output.put_line('在CASE语句中没有与' || v_test || '相关的条件.');END;/ 8 ZERO_DIVIDE该异常触发ORA-01476错误。当在程序中使用0作为除数进行运算时,将触发该异常。示例: DECLARE v_test1 NUMBER := 100;v_test2 NUMBER := 0;v_test3 NUMBER := 0;BEGIN v_test3 := v_test1 / v_test2;dbms_output.put_line(v_test3);EXCEPTION WHEN zero_pide THEN dbms_output.put_line('0不能作为除数.');END;/ 9 INVALID_NUMBER该异常触发ORA-01722错误。数字或值错误,或字符到数值的转换错误。示例: BEGIN UPDATE emp SET sal = sal + '1oo';--1oo EXCEPTION WHEN invalid_number THEN dbms_output.put_line('输入的数字不正确.');END;/ DECLARE v_test NUMBER;v_test2 NUMBER;BEGIN v_test := '100';v_test2 := '1a';dbms_output.put_line(v_test);EXCEPTION WHEN INVALID_NUMBER THEN DBMS_OUTPUT.PUT_LINE('输入的数字不正确.');END;/ 10 ACCESS_INTO_NULL该异常触发ORA-06530错误。

当程序中的对象还没有先进行对象初始化的操作,就直接为对象的属性赋值,将触发该异常。

示例: DECLARE v_test test_type;BEGIN v_test.v_name := 'test';EXCEPTION WHEN access_into_null THEN dbms_output.put_line('首先初始化对象v_test');END;/ 11 COLLECTION IS NULL该异常触发ORA-06531错误。

在给集合元素赋值前,必须先初始化该集合元素,否则触发该异常。示例: DECLARE TYPE emp_ssn_array IS TABLE OF NUMBER/* INDEX BY BINARY_INTEGER*/;best_employees emp_ssn_array;BEGIN best_employees(0):= '123456';dbms_output.put_line('best_employees(0): ' || best_employees(0));EXCEPTION WHEN collection_is_null THEN dbms_output.put_line('必须初始化集合元素.');END;/ 12 SUBSCRIPT_BEYOND_COUNT该异常触发ORA-06533错误。当使用复合数据类型时,如果下标越界触发该异常。示例: DECLARE TYPE test_array IS VARRAY(20)OF NUMBER;v_test test_array;BEGIN v_test := test_array(123456);dbms_output.put_line('v_test(1): ' || v_test(2));EXCEPTION WHEN subscript_beyond_count THEN dbms_output.put_line('下标越界.');END;/ 13 SUBSCRIPT_OUTSIDE_LIMIT该异常触发ORA-06532错误,当使用复合数据类型时,如果下标为负值时触发该异常。

示例: DECLARE TYPE test_array IS VARRAY(20)OF NUMBER;v_test test_array;BEGIN v_test := test_array(123456);dbms_output.put_line('v_test(-1): ' || v_test(-1));EXCEPTION WHEN subscript_outside_limit THEN dbms_output.put_line('下标不能是负数.');END;/ 14 LONIN_DENIED该异常触发ORA_01017错误。当PL/SQL连接数据库时,如果密码错误,将触发该异常。15 NOT_LOGGED_ON该异常触发ORA-01012错误。如果PL/SQL没有连接数据库,程序运行将触发该异常。16 PROGRAM_ERROR该异常触发ORA-06501错误。

如果出现该异常,则表示PL/SQL的内部问题。用户可能需要重新安装数据字典和PL/SQL系统包。ROWTYPE MISMATCH该异常触发ORA-06504错误。

在赋值时,如果宿主游标变量和PL/SQL游标变量的返回类型不兼容,将触发该异常。18 SELF_IF_NULL该异常触发ORA-30625错误。

在使用对象类型时,如果在NULL示例上调用成员方法将触发该异常。19 STORAGE_ERROR该异常触发ORA-06500错误。

当PL/SQL块运行时,如果走出内在空间或内在被损坏则触发该异常。20 SYS_INVALID_ROWID该异常触发ORA-01410错误。当将字符串转变为ROWID时,如果使用了无效的字符串则触发该异常。21 TIMEOUT_ON_RESOURCE该异常触发ORA-00051错误。Oracle在等待资源时出现超时错误时将触发该异常。ORA-04021Oracle在等待资源时出现超时错误,该资源可能被其它session锁住,此时将触发该异常。ORA-01791 不是Selected表达式SELECT DISTINCT goodsid, barcode, depotid, goodsname FROM sa_sale WHERE depotid = '11' ORDER BY selldate 这句话执行的时候就有错误,但把排序换成 order by Goodsid 或其它

Barcode,DepotId,GoodsName的时候均没有错误,这是因为 selldate不在查询结果字段中,而且这个语句是distinct语句。所以会出现这个错误

下边给出正确的解决办法: SELECT goodsid, barcode, depotid, goodsname FROM(SELECT DISTINCT goodsid, barcode, depotid, goodsname, selldate FROM sa_sale WHERE depotid = '11')ORDER BY selldate 24 ORA-01002: fetch out of sequence当游标中数据集已经取完,然后再一次进行FETCH操作时将触发该异常。PLS-00382: expression is of wrong type表达式类型错误。即在代码中赋予操作的左右两边的类型不等。

二非预定义异常使用非预定义异常的步骤如下: 定义异常->关联异常和错误->引用例外

当定义Oracle错误和例外之间的关联关系时,要使用伪过程EXCEPTION_INTI。下面以处理ORA-02291错误为例说明: DECLARE e_integrity EXCEPTION;PRAGMA EXCEPTION_INIT(e_integrity,-2291);BEGIN UPDATE emp SET deptno = dno WHERE empno = &eno;EXCEPTION WHEN e_integrity THEN dbms_output.put_line('该部门不存在.');END;/ 三自定义异常使用预定义异常和非预定义异常,程序可以捕获Oracle错误,并且在出现Oracle错误时自动触发对应的异常。但是在实际应用中,可能还会遇到其它错误,这时,可以为特定的情况自定义异常,不过需要显示触发该异常:通过定义异常,然后关联异常和错误,显示触发异常,最后在EXCEPTION 中处理该异常。

示例: DECLARE l_error_message VARCHAR2(200);e_user_exception EXCEPTION;BEGIN ** ** ** ** **;IF '出现错误' THEN l_error_message := '定义错误信息';RAISE e_user_exception;END IF;EXCEPTION WHEN e_user_exception THEN raise_application_error(-20001, l_error_message);END;/ 四例外函数1 SQLCODE,SQLERRM在PL/SQL块中出现Oracle错误时,通过使用例外函数可以取得错误号以及相关的错误消息。

SQLCODE 返回Oracle错误号。SQLERRM 返回错误号对应的错误消息。示例: DECLARE v_ename emp.ename%TYPE;BEGIN SELECT ename INTO v_ename FROM emp WHERE sal = &v_sal;dbms_output.put_line('雇员名:' || v_ename);EXCEPTION WHEN NO_DATA_FOUND THEN dbms_output.put_line('不存在工资为' || v_sal || '雇员');WHEN OTHERS THEN dbms_output.put_line('错误号' || SQLCODE);dbms_output.put_line(SQLERRM);END;/ 2 RAISE_APPLICATION_ERROR在存储过程,函数和包中使用RAISE_APPLICATION_ERROR可以自定义错误号和消息。

raise_application_error:用于自定义错误消息(用于程序段中)语法: raise_application_error(error_number,message[,{TRUE | FALSE}]);error_number : 错误号,范围是:-20000 ~-20999之间的负整数;message : 错误消息,长度不能超过2048字节;第三个可靠选参数,如果TRUE,该错误会被放在先前错误堆栈中;如果FALSE(默认),则替换先前所有错误.示例:

CREATE OR REPLACE PROCEDURE raise_comm(eno NUMBER, commission NUMBER)IS v_comm emp.comm%TYPE;BEGIN SELECT comm INTO v_comm FROM emp WHERE emp = eno;IF v_comm IS NULL THEN raise_application_error(-20001, '该员工无补助.');END IF;EXCEPTION WHEN NO_DATA_FOUND THEN dbms_output.put_line('该雇员不存在.');END;/

第二篇:Oracle数据库总结范文

创建表及命名规则?

表名和列名:

必须以字母开头 必须在1–30个字符之间

必须只能包含A–Z, a–z, 0–9, _, $, 和# 必须不能和用户定义的其他对象重名 必须不能是Oracle 的保留字 Oracle默认存储是都存为大写

增删改查语法?

增加: 例如:使用INSERT语句往customers表中插入数据,指定相关列和值 INSERT INTO customers(customer_id, first_name, last_name, dob, phone)VALUES(6, 'Fred', 'Brown', '01-1月-1970', '800-555-1215');

如果为表所有列都指定值,那么可以忽略列清单

INSERT INTO customersVALUES(6, 'Fred', 'Brown', '01-1月-1970', '800-555-1215');

可以使用NULL为某些列指定空值

INSERT INTO customersVALUES(8, 'Sophie', 'White', NULL, NULL);

查询:select * fromcustomers;或者select字段 fromcustomerswhere条件 删除:deletefromcustomerswhere条件

更改:update customersset name = 'xiaoming',age = ‘16’(更改多个字段时候用逗号隔开)where 条件

对查询结果进行排序?

语句:select * fromcustomersorderby字段 desc;

(asc(升序),desc(降序)如果不写,默认升序)

NULL值了解么?

NULL值表示未知的值。它是一个特殊的值,但并不是空字符串,NULL值表示该列是未知的。当某些查询语句在输出结果列上看不到值的时候,可能就是NULL值

NVL()和NVL2():

NULL值被查询出来的时候没有显示信息,如何告知用户这是空字符串还是NULL,这可以通过NVL()函数来进行处理

NVL(x,value)是有value显示本身,null显示为替换的value NVL2(x,value1,value2)是如果x不为NULL值,返回value1,否则返回value2 例程:

select name,nvl2(email,'已知','未知')from student;【代码含义:代表如果email字段中有值,则显示已知,null则显示未知,如果想显示本来的查询结果select name,nvl(email,'未知')from student;】 update student set name = replace(name,'小','大');【代码含义:代表将STUDENT表中NAME 字段中如果含有小字,那么就将小字替换为大字(操作的不是显示结果,而是将表中数据进行更改)】

Oracle中的简单函数?

字符串函数

 concat:将x和y拼接起来,并返回新字符串

例程:

select concat(first_name,'-'||last_name)姓名 from customers; Instr字符查找,从1开始。

select instr('asdbcrdbewqrbmde','b')from dual;select instr('asdbcrdbewqrbmde','b',5,2)from dual;【代表从第5个字符开始,第二个b所在的位置】

 Ltrim : LTRIM(x,[trim_string])从x字符串左侧去除所有的trim_string字符串,如果没有指定trim_string字符串,则默认为去除左侧空白字符

 Rtrim RTRIM(x,[trim_string])从x字符串右侧去除所有的trim_string字符串,如果没有指定trim_string字符串,则默认为去除右侧空白字符  Trim TRIM(trim_string FROM x)从x字符串两侧去除trim_string字符串

 Replace REPLACE(x, search_string, replace_string)从字符串x中搜索search_string字符串,并使用replace_string字符串替换。用select执行并不会修改数据库中原始值,但是用update执行可以修改。

 Substr SUBSTR(x, start,[length])返回字符串中的指定的字符,这些字符从字符串的第start个位置开始,长度为length个字符;如果start是负数,则从x字符串的末尾开始算起;如果length省略,则将返回一直到字符串末尾的所有字符

例程:

select substr('abcd月fg',4,2)from dual;(结果:d月)select substr('abcdefg',-2)from dual;(结果:fq)

日期函数

 Sysdate 例程:

Selectsysdatefromdual;

Select to_char(sysdate, 'yyyy-mm-dd-hh-mm-ss')from dual;

 Add_months(d1,n1) last_day():

转换函数

 To_char TO_CHAR(x,[ format])将x转化为字符串。format为转换的格式,可以为数字格式或日期格式

select to_char(sysdate,'yyyy-mm-dd')from dual;【一般在查询时候使用,使返回的值成为指定格式】

 to_date TO_DATE(x,[format])将x字符串转换为日期

insert into student values(seq_stu.nextval,'小明',to_date('1992-2-18','yyyy-mm-dd'),default,'北京',null);【一般在添加使用】 返回所查询的值中最后一个日期数据。

聚合函数

 Avg:平均数  Sum:求和  Max:最大值  Min:最小值  Count:返回统计的行数  Round:四舍五入

例程:

select round(avg(bid),1)from bug;分组了解么?

有时需要对表中的行进行分组,然后统计每组的信息,可以使用GROUP BY进行分组,然后再对每组进行统计。

(1)可以使用GROUP BY对多个列进行分组

例:

SELECT product_id, avg(customer_id)FROM purchases GROUP BY product_id;

(2)可以对分组后的行使用聚集函数,聚集函数会统计每组中的值,对于每组分别统计后返回一个值 例:

SELECT

product_type_id,BY

COUNT(ROWID)FROM

BY

productsGROUP product_type_id;注意:

product_type_idORDER a)如果查询中使用了聚集函数,被查询的列未使用聚集函数处理,那么这些列必须出现在GROUP BY子句后,否则,会提示ORA-00937错误

b)不能使用聚集函数作为WHERE子句的筛选条件,否则,会提示ORA-00934错误

c)可以使用HAVING子句过滤分组后的行

SELECT...FROM...WHERE GROUP BY...HAVING...ORDER BY...;(GROUP BY使用时可以不使用HAVING,但是使用HAVING时必须有GROUP BY才有意义)

(3)同时使用WHERE, GROUP BY和HAVING

a)首先,执行WHERE筛选掉不符合条件的行 b)然后,将符合条件的行使用GROUP BY进行分组 c)最后,使用HAVING对分组统计的结果进行再次筛选 例:

SELECT product_type_id, AVG(price)FROM products

WHERE price < 15

GROUP BY product_type_id HAVING AVG(price)> 13 ORDER BY product_type_id;

表的约束条件?

目的:

确保表中数据的完整性。

常用的约束类型: 主键约束(PRIMARY KEY):要求主键列数据唯一,并且不允许为空 非空约束(NOT NULL):指定的列的值不允许为空

唯一键约束(UNIQUE):要求该列唯一,允许为空,但只能出现一个空

检查约束(CHECK):指定表中一列或多列可以接受的数据值格式 默认约束(DEFAULT):指定某列的默认值

外键约束(FOREIGN KEY):用于建立和加强两个表数据之间连接的一

列或多列。通过将表中的主键列添加到另一个表中。可以创建两个表之间的连接。这个主键的列就称为第二个表的外键。外键约束就可以确保添加到外键表中的任何行都在主表中都存在相应的行

多表查询?

不同的数据存储在不同的表中,通常要查询多张表才能找到需要的数据

例程: SELECT products.name, product_types.name FROM products, product_types WHERE

products.product_type_id

= product_types.product_type_id AND products.product_id = 3;

products表和product_types表相关字段会用在SELECT语句及WHERE子句上,可以给表起别名,提高代码可读性、降低书写难度 例程:

SELECT p.name, pt.name FROM products p, product_types pt WHERE p.product_type_id = pt.product_type_id AND p.product_id = 3 注意:

如果查询两张表,并且没有定义连接条件,那么查询的结果集是两表相乘的结果,这样的情况称之为笛卡尔乘积。总结:多表查询WHERE时,连接次数=查询时连接表的数量-1

常见的三种连接类型:

内连接:

内连接返回的行只有满足连接条件才会返回。如果连接条件的列中有NULL值,那么该行则不会返回 外连接:

外连接返回的行满足连接条件,也包括在连接条件的列包含空值的行

自连接:

连接的表为同一张表

子查询?

子查询是嵌入到另一个SELECT语句中的一个SELECT语句。通过使用子查询,可以使用简单的语句组成强大的语句。当需要从表中选择行,而选择条件却取决于该表自身中的数据时,子查询非常有用。

单行子查询:(1)可以将另外一个查询作为WHERE子句的子查询

例:查询尾名是‘Brown’的首名和尾名

SELECT first_name, last_name FROM customers

WHERE customer_id =

(SELECT customer_id FROM customers WHERE last_name = 'Brown');(2)在单行子查询还可以使用其他比较运算符,如<>、<、>、<=和>= 例:查询价格大于平均价格的商品编号、名称及价格

WHERE子句中使用>,以及子查询中使用AVG()聚集函数

SELECT product_id, name, price FROM products WHERE price >(SELECT AVG(price)FROM products);(3)在HAVING子句中使用子查询

HAVING是在分组统计后用于过滤行,同样在HAVING子句后面可以跟子查询。单行子查询将返回结果用于HAVING子句过滤分组统计的行

例如:查询平均价格小于最大平均值的商品编号及平均值

SELECT product_type_id, AVG(price)FROM products GROUP BY product_type_id HAVING AVG(price)<(SELECT MAX(AVG(price))FROM products GROUP BY product_type_id)ORDER BY product_type_id;

分页查询?

可以通过ROWNUM来实现。

序列?

序列是一个数据库对象,用于生成一系列的整数。

索引?

索引是与表关联的可选结构。可以创建索引以加快对表执行SQL语句的速度。就像书的索引可以帮助我们更快速的查找信息一样,Oracle中的索引也提供了一种更快地访问表数据的途径。

视图?

视图是基于一张表或多张表或另外一个视图的逻辑表。视图不同于表,视图本身不包含任何数据。表是实际独立存在的实体,是用于存储数据的基本结构。而视图只是一种定义,对应一个查询语句。视图的数据都来自于某些表,这些表被称为基表。数据库中只在数据字典中存储对视图的定义。

第三篇:oracle视图总结

oracle视图总结(转)

视图简介: 视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改。视图基于的表称为基表。视图是存储在数据字典里的一条select语句。通过创建视图可以提取数据的逻辑上的集合或组合。

视图的优点:

1.对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。2.用户通过简单的查询可以从复杂查询中得到结果。3.维护数据的独立性,试图可从多个表检索数据。4.对于相同的数据可产生不同的视图。

视图的分类:

视图分为简单视图和复杂视图。

两者区别如下:

1.简单视图只从单表里获取数据,复杂视图从多表获取数据; 2.简单视图不包含函数和数据组,复杂视图包含; 3.简单视图可以实现DML操作,复杂视图不可以。

视图的创建:

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name [(alias[, alias]...)] AS subquery [WITH CHECK OPTION [CONSTRAINT constraint]] [WITH READ ONLY] 其中:

OR REPLACE:若所创建的试图已经存在,ORACLE自动重建该视图; FORCE:不管基表是否存在ORACLE都会自动创建该视图; NOFORCE:只有基表都存在ORACLE才会创建该视图: alias:为视图产生的列定义的别名;

subquery:一条完整的SELECT语句,可以在该语句中定义别名;

WITH CHECK OPTION : 插入或修改的数据行必须满足视图定义的约束; WITH READ ONLY : 该视图上不能进行任何DML操作。

例如: Sql代码

1.CREATE OR

REPLACE

VIEW dept_sum_vw

2.(name,minsal,maxsal,avgsal)

3.AS SELECT d.dname,min(e.sal),max(e.sal),avg(e.sal)

4.FROM

emp e,dept d

5.WHERE e.deptno=d.deptno

6.GROUP BY d.dname;

视图的定义原则:

1.视图的查询可以使用复杂的SELECT语法,包括连接/分组查询和子查询; 2.在没有WITH CHECK OPTION和 READ ONLY 的情况下,查询中不能使用 ORDER BY 子句;

3.如果没有为CHECK OPTION约束命名,系统会自动为之命名,形式为SYS_Cn;4.OR REPLACE选项可以不删除原视图便可更改其定义并重建,或重新授予对象权限。

查询视图:

视图创建成功后,可以从视图中检索数据,这点和从表中检索数据一样。示例:

SQL>SELECT * FROM dept_sum_vw;

修改视图:

通过OR REPLACE 重新创建同名视图即可。

删除视图:

DROP VIEW VIEW_NAME语句删除视图。删除视图的定义不影响基表中的数据。

只有视图所有者和具备DROP VIEW权限的用户可以删除视图。视图被删除后,基于被删除视图的其他视图或应用将无效。

查询视图定义:

SELECT view_name,text from user_views;其中text显示的内容为视图定义的SELECT语句,可通过DESC USER_VIEWS 得到相关信息。

视图上的DML 操作: DML操作应遵循的原则:

1.简单视图可以执行DML操作; 2.在视图包含GROUP 函数,GROUP BY子句,DISTINCT关键字时不能删除数据行; 3.在视图不出现下列情况时可通过视图修改基表数据或插入数据:

a.视图中包含GROUP 函数,GROUP BY子句,DISTINCT关键字; b.使用表达式定义的列; c.ROWNUM伪列。

d.基表中未在视图中选择的其他列定义为非空且无默认值。WITH CHECK OPTION 子句

通过视图执行的INSERTS和UPDATES操作不能创建该视图检索不到的数据行,因为它会对插入或修改的数据行执行完整性约束和数据有效性检查。(也就是说在执行INSERTS、UPDATES时,WHERE条件中除需要INSERT、UPDATE本身的限制条件之外,还需要加上视图创建时的WHERE条件。)

例如:

CREATE OR REPLACE VIEW vw_emp20 AS SELECT * FROM emp WHERE deptno=20 WITH CHECK OPTION constraint vw_emp20_ck;视图 已建立。

查询结果:

SELECT empno,ename,job FROM vw_emp20;EMPNO

ENAME

JOB---------------------

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

-------------7369

SMITH

CLERK 7566

JONES

MANAGER 7902

FORD

ANALYST 修改:

UPDATE vw_emp20 SET

deptno=20 WHERE empno=7902;将产生错误:

UPDATE vw_emp20 * ERROR 位于第一行:

ORA-01402:视图WITH CHECK OPTION 违反WHERE 子句

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1,Oracle是可以通过视图来修改Base table的。所谓base table就是用来构建视图的表,也就是视图的数据来源表。但是这种修改是有条件的。比如: create view v_emp as select empno,ename,job,deptno from emp where deptno=10 with check option constraint emp_cnst;如果有这个限制,那么通过视图v_emp 插入数据的deptno字段的值必须是10,否则就会报“ORA-01402: 视图 WITH CHECK OPTIDN 违反 where 子句”的异常。

2,联结视图:

create view dept1_staff as select e.ename, e.empno, e.job, d.deptno, d.dname from emp e,dept d where e.deptno in(10,30)and e.deptno = d.deptno; 将两个表的数据联结起来,看起来应该是一个内联结(Inner joint)。

对于联结视图(Joint view)的修改规则稍显复杂,设计到所谓key_preserved table的概念。通过联结视图来修改基表,只有那些key_preserved 的表才能被修改。上述创建视图语句中emp和dept通过deptno进行联结构成视图时,emp就是key_preserved 表,而dept不是。为什么?因为在dept1_staff 中empno的值唯一的而deptno不是唯一的。所以emp是key_preserved 而dept不是。因此只能通过该视图来修改emp,而不能修改dept的数据。

3,Oracle视图非常强大的功能之一在于其可以创建一个带有错误的视图。比如说视图里的字段在基表里不存在,该视图仍然可以创建成功,但是非法的且无法执行。当基表里加入了该字段,或者说某个字段修改成视图里的该字段名称,那么视图马上就可以成为合法的。这个功能很有意思。例子:

创建基表: create table v_test(name varchar2(32),age number(12));创建带错误的视图:

create force view view_test as select name,age,address from v_test;(注意加上force选项)

由于address字段在v_test里不存在,所以会报warning: View created with compilation errors的警告,而且执行select * from view_test;时会报“ORA-04063: view “SCOTT.VIEW_TEST” 有错误”的异常。但是如果在v_test里加上address字段,那么视图就会合法。对基表进行修改:

alter table v_test add(address varchar2(128));

现在再执行select * from view_test;就会执行成功了。

from:http://www.blogjava.net/jinhualee/archive/2006/07/14/58115.html

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

其他问题总结:

1、视图上是否可以创建索引?

一般视图上不用建立索引,对视图的操作最终会转化为对表的操作。一个讨论:http://www.itpub.net/viewthread.php?tid=150019&extra=&page=1

第四篇:oracle日期格式总结

select to_char(sysdate,'yyyy')||'年'||to_char(sysdate,'mm')||'月'||to_char(sysdate,'dd')||'日'||to_char(sysdate,'hh24')||'时'||to_char(sysdate,'mi')||'分'||to_char(sysdate,'ss')||'秒’from dual 在oracle中处理日期大全 TO_DATE格式 Day: dd number 12 dy abbreviated fri day spelled out friday ddspth spelled out, ordinal twelfth Month: mm number 03 mon abbreviated mar month spelled out march Year: yy two digits 98 yyyy four digits 1998 24小时格式下时间范围为: 0:00:0012:59:59....1.日期和字符转换函数用法(to_date,to_char)2.select to_char(to_date(222,'J'),'Jsp')from dual 显示Two Hundred Twenty-Two 3.求某天是星期几和设置语言格式

select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day')from dual;星期一 select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American')from dual;monday 设置日期语言

ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';也可以这样

TO_DATE('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American')4.两个日期间的天数

select floor(sysdateto_date('2002-02-01','yyyy-mm-dd')+1)where to_char(to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D')not in('1', '7')在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100秒, 而不是毫秒).9.select months_between(to_date('01-31-1999','MM-DD-YYYY'), to_date('12-31-1998','MM-DD-YYYY'))“MONTHS” FROM DUAL;1 select months_between(to_date('02-01-1999','MM-DD-YYYY'), to_date('12-31-1998','MM-DD-YYYY'))“MONTHS” FROM DUAL;1.03225806451613 10.Next_day的用法 Next_day(date, day)Monday-Sunday, for format code DAY Mon-Sun, for format code DY 1-7, for format code D 11 select to_char(sysdate,'hh:mi:ss')TIME from all_objects 注意:第一条记录的TIME 与最后一行是一样的 可以建立一个函数来处理这个问题 create or replace function sys_date return date is begin return sysdate;end;select to_char(sys_date,'hh:mi:ss')from all_objects;12.获得小时数

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40')from offer SQL> select sysdate ,to_char(sysdate,'hh')from dual;SYSDATE TO_CHAR(SYSDATE,'HH')-----------------------------------------2003-10-13 19:35:21 07 select sysdate ,to_char(sysdate,'hh24')from dual;SYSDATE TO_CHAR(SYSDATE,'HH24')-------------------------------------------2003-10-13 19:35:21 19 获取年月日与此类似 13.年月日的处理

select older_date, newer_date, years, months, abs(trunc(newer_date-add_months(older_date,years*12+months)))days from(select trunc(months_between(newer_date, older_date)/12)YEARS, mod(trunc(months_between(newer_date, older_date)), 12)MONTHS, newer_date, older_date from(select hiredate older_date,add_months(hiredate,rownum)+rownum newer_date from emp))14.处理月份天数不定的办法

select to_char(add_months(last_day(sysdate)+1,-2), 'yyyymmdd'),last_day(sysdate)from dual 16.找出今年的天数

select add_months(trunc(sysdate,'year'), 12)60*TRUNC(A*24))Minutes, TRUNC(A*24*60*60100*TRUNC(A*24*60*60))mSeconds from(select trunc(sysdate)Days, sysdate6 first_day from(select substr('2004-33', 1, 4)yy, to_number(substr('2004-33', 6))ww

from dual)

select trunc(to_date(substr('2003-01',1,5)||to_char((to_number(substr('2003-01',6)))*7),'yyyy-ddd'),'d')last_day from dual

select max(v_date)from(select(to_date('200408','yyyymm')+ rownum)v_date from all_tables where rownum < 370)where to_char(v_date,'yyyy-iw')= '2004-33'

3.查询某周的日期

select min_date, to_char(min_date,'day')day from(select to_date(substr('2004-33',1,4)||'001'+rownum-1,'yyyyddd')min_date

from all_tables where rownum <= decode(mod(to_number(substr('2004-33',1,4)),4),0,366,365)union

select to_date(substr('2004-33',1,4)-1||

decode(mod(to_number(substr('2004-33',1,4))-1,4),0,359,358)+rownum,'yyyyddd')min_date

from all_tables

where rownum <= 7 union select to_date(substr('2004-33',1,4)+1||'001'+rownum-1,'yyyyddd')min_date

from all_tables

where rownum <= 7)where to_char(min_date,'yyyy-iw')='2004-33'

oracle中时间运算

论坛中常常看到有对oracle中时间运算提问的问题,今天有时间,看了看以前各位兄弟的贴子,整理了一下,并作了个示例,希望会对大家有帮助。

首先感谢ern、eric.li及各版主还有热心的兄弟们

内容如下:

1、oracle支持对日期进行运算

2、日期运算时是以天为单位进行的

3、当需要以分秒等更小的单位算值时,按时间进制进行转换即可

4、进行时间进制转换时注意加括号(见示例中红色括号),否则会出问题

SQL> alter session set nls_date_format='yyyy-mm-dd hh:mi:ss';

会话已更改。

SQL> set serverout on SQL> declare 2 DateValue date;3 begin 4 select sysdate into DateValue from dual;5 dbms_output.put_line('源时间:'||to_char(DateValue));6 dbms_output.put_line('源时间减1天:'||to_char(DateValue-1));7 dbms_output.put_line('源时间减1天1小时:'||to_char(DateValue-1-1/24));8 dbms_output.put_line('源时间减1天1小时1分:'||to_char(DateValue-1-1/24-1/(24*60)));9 dbms_output.put_line('源时间减1天1小时1分1秒:'||to_char(DateValue-1-1/24-1/(24*60)-1/(24*60*6 0)));10 end;11 / 源时间:2003-12-29 11:53:41 源时间减1天:2003-12-28 11:53:41 源时间减1天1小时:2003-12-28 10:53:41 源时间减1天1小时1分:2003-12-28 10:52:41 源时间减1天1小时1分1秒:2003-12-28 10:52:40

第五篇:ORACLE培训总结

篇一:oracle培训班总结(听课笔记)oracle北京培训

第一章 oracle10g的安装与基本设置

一、数据库基础部分。

oracle数据库应用系统结构与产品。

sql语言:操作数据库,同时用于数据库管理。(通用部分)sql*plus语言:对sql的扩充,主要增加一些报表。pl/sql语言:过程化语言。数据库分区存储技术。

1、oracle数据库应用系统结构与产品

oracle数据字典有4.2万个。数据字典只记录标识。

结构方面:sql与oracle完成不同,sql可建多个库,结构与oracle明显不同。i:代表internet.c语言结构性最好,计算能力最强。指纹识别系统只能用c.2、pl:procedural language:过程化语言,条件、判断、循环。sql属非过程化语言,只关心结果,不关心过程。

3、数据库分区存储技术(一个表存到多个表空间上)数据库存储数据的最小单位:表。

逻辑空间——>表空间(在物理上与磁盘对应)1 ——>多个磁盘。

一个表可以存在多个磁盘上,但不能存到多个表空间上。集中式存储:安全性不好,i/o不平衡。

数据库的分区存储技术:range、list(oracle 11自动增加)range:可以比大小。

list:不能比大小,例如:人口住址等。

4、数据库存取权限控制。

5、oracle 10g flashback:数据闪回。恢复前提:归档和备份。(1)基于时间的恢复:从5楼到4楼。必须从5楼下到一楼,再从1楼到4楼。逻辑备份: 物理备份:常说的备份点。

不完全恢复:向回倒,不可逆转,日志自动清0,有的数据要丢失。exp、import.(1)基于时间的恢复(2)基于中止(撤消)的恢复。(3)基于事务的恢复。完全恢复。

delete from,rollback能100%恢复。drop,flashback不一定能恢复。

二、程序设计

pl/sql程序设计。存储过程(procedure),函数(function),包(package),数据库触发器(data triggers(枪栓))。

三、系统管理(dba)

1、oracle核心软件安装与产品升级。sun solaris hp ux 国税 aix 银行 tru64 电力 数据库的排序:在临时表空间中进行。8i和9i排序完不释放。10g可自动释放。640万人无人居住,不发生电费。

命令行模式运行速度快,容易发现问题的存在。

oracle占用可用内在的55-57%,所以不要建两个以上的库,oracle按表空间划分用户,sql可建多个库,结构与oracle明显不同。

2、创建主要的数据库存储结构。

划分磁盘空间。

3、数据库权限与角色管理。角色:权限的组合。

4、监视与控制用户对于数据库的操作。

5、数据库的启动与关闭。

6、数据库性能优化与调整。

7、数据库的备份与恢复。

四、基于web应用开发(会话进程)。

会话数(在线数)< 用户数< 进程数在(windows称为服务)< 操作系统核心参数 如何查看修改连接数,进程数及用户数,三者之间有什么关系? show parameter session;最大session数 show parameter process;最大进程数

select count(1)from all_users;查看已安装数据库的用户数 select * from all_users;oracle自带的用户数如何查。

默认的情况下系统中的最大session = min(session ,process * 1.1 + 5)

1、我们把它称为一次对话,或者叫会话。同样,在我们用电脑工作时,打开的一个窗口或一个web页面,我们也可以把它叫做一个“会话”,扩展到一个局域网里面,所有用户要通过防火墙上网,要打开很多个窗口或web页面(即会话),那么,这个防火墙,所能处理的最大会话数量,就是“并发连接数”。

(1)查看oracle 10g数据库会话数 select * from v$session;当前总会话数:select count(*)from v$session;可用总会话数:在sqlplus里查询,show parameter session

2、查看已安装数据库的用户数:select count(1)from all_users;sql>select * from all_users;

3、查看进程数

使用sys,以sysdba权限登录:sql> show parameter processes;

4、$ps –ef | grep oracle 进程,在windows称为服务。实例包括一个内存和进程(在windows中为服务)

按我的理解来说session就等价与一个客户端,它是用户经过用户进程到oracle事例的特定连接.它从用户连接开始一直持续到用户断开连接或退出数据库为止.进程,笼统地认为一个程序有若干进程组成,从os角度讲程序是静态的,而进程是动态的罢了.进程可以分为user process和oracle process.说穿了,进程就是用来执行程序的时候产生的,是一个动态过程.第二章 oracle安装

一、asm(automatic storage management)自动存储管理。oracle10g 新内容。镜像:oracle 10g以后才支持。磁盘组:diskmap 逻辑设备

裸设备:只做分区,不做格式化。看不到文件,在磁盘管理器中才能看到设备,u盘拷贝不了。只能用逻辑手段拷贝:exp rman.二、oltp_数据仓库_全局数据库名_(nts适配器错误_在windows中清理oracle)

1、t----->oltp(on line transaction processing)在线事务处理。网上数据传输量比较大,数据库数据改动大,数据库负荷重,oracle 会设比较大的回退段(rollback segments)和空闲率(pctfree 10%)oracle的块为:8k.它使用了所有的所谓数据的操作 crud(创建、读取、更新、删除)。当数据存储达到一定量的时候,规模就会几乎保持不变,因为可以从存储中删除过期数据。

2、数据仓库

数据仓库改动少,主要为查询速度快服务,用于存历史数据,用来构造决策支持系统。他的回退段和空闲率留的比较少。

数据仓库就完全是一种不同种类的应用程序。它并不是用来运行当前的操作,例如发送邮件。它是用来分析数据并且从现有数据中发现新的价值,主要是用来预测未来的情况。数据仓库并不是解决所有问题的通用结构。它必须集中于某一问题领域,例如航空服务、顾客收益等。数据仓库也有有趣的一面,那就是本身是稳定增长的。数据没有被删除,也不发生变更。我们不需要将冗余数据置于数据库之外(因为加入仓库中的数据经过了数据净化的过程,该过程检查了数据的正确性)来减少复杂性同时增强读取操作的性能。

为了能够对数据仓库中的数据进行分析,数据存储于一个多维结构中,叫做星型模式。如果将星型模式扩展,就会得到雪花模式。

3、全局数据库名:以字母打头,不超过8个。

数据库名不能重名,否则复制数据和同步数据时会出麻烦,数据库安装完后,数据库名不能更改,起名时要慎重。

4、oracle字符集。zh16gbk.5、nts适配器错误。

d:oracleproduct10.2.0db_1networkadminsqlnet.ora 把sqlnet.ora文件中的(nts)改为none,再重新启动oracleconfigudration and mirdatabase config.6、在windows中清理oracle。(1)删除注册表:

regedit-> local machine--> software-->oracle(2)删除oracle服务

regedit-> local machine-->system?currentcontrolset?services?ora*(3)删除oracle事件日志

(4)删除windows安装磁盘中program filesoracle目录。(5)删除oracle菜单。(6)删除oracle环境变量。

控制面板—>系统——>高级——>环境变量。总共删除2项。(7)重新启动操作系统

(8)删除oracle磁盘文件。篇二:oracle数据库学习总结 oracle数据库学习总结 时间过的还真快,不知不觉中就在这里呆了半个月了。这段时间里都在学习oracle数据库的编程,毕竟这是家软件外包公司。像我们这样的新员工也就只能接触到些curd的操作。废话不多说,赶紧来梳理下这半月来学习的知识点.在来公司之前一直都是使用sql server数据库,用sql server也开发了3个小型项目。所以对sql语句以及在数据库中扮演重要作用的存储过程,触发器,视图,主键/外键约束都很熟。但oracle是一个全新的环境,记得刚装上oracle的时候,我都不知道在哪查看自己已经建立好的表格。还好有师傅的帮忙,要不然我还真没这么快就能入门oracle。

学习东西就要学习些能改变自己思维的东西,只有这样才能让自己的眼光比别人更独到,思维比别人更深邃,oracle就是这样的东西。当然做这样的事是要很大的驱动力的呀,如果公司不是都采用oracle来写程序的话,我估计也就懒得学啦。

对于一位程序员来说并不需要完全掌握oracle的所有知识,毕竟自己不是dba。在日常开发中也用不到那些命令和工具,但是有些知识点我们还是必须得熟练的掌握它们。比如:一些基本的ddl和dml语句,存储过程,函数,视图,触发器,序列,游标,自定义类型和包。下面我就把这段时间里学习oracle获得的知识点罗列出来,一是为了方便以后查阅,二是为了和搭档交流学习经验。要适应的一些细节

从sql server转到oracle进行数据库编程,第一道门槛就是语法问题。很多很多的问题都是因为语法而产生的,现将它们统统集合起来并将它们一网打尽之。pl结构。在sql server中,采用的是批处理执行任务的方式,所以可以将多条sql语句选中批量执行,而不用顾忌要在专门的地方声明变量,在专门的地方进行逻辑编码。在oracle中采用的是pl编程方式,必须在专门的地方声明变

循环结构,要达到循环在oracle中有3种方式,各有各的好处,你懂的。它们分别如下: pl结构中的错误处理

就像c#中的try{} catch{}语句块 能捕获错误。写几个例子: helloworld级别的错误抛出例子record类型

oracle中的record类型类似于c语言中的结构体,主要用来接收select语句或游标中返回的数据,下面写个例子:ddl语句

这里的ddl语言主要是指能完成如下工作的ddl语言:创建表,创建表的主/外 键及级联效果,dml语句

select语句。oracle中的select语句的使用方法与sql server差不多,但还是有些不同之处。

篇三:oracle培训心得 oracle培训心得

2010年x月x日至x月x日,我有幸参加了工业和信息化部软件与集成电路促进中心主办的“oracle数据库高级实战培训班”学习交流。首先感谢学校领导给予了我这次学习机会。通过短暂的几天培训,我不仅对oracle知识有了部分的了解,也接受了很多最新的信息。在这次培训中,上课的老师有非常丰富dba经验,他结合他自身的dba工作经历,从oracle体系结构与网络配置、访问控制、事务处理与日志、闪回特性、数据库的备份与恢复和数据库性能监测与调整优化等几个方面对oracle进行了讲解。对课程讲解十分的详细。通过案例示范以及演示,指导我们一步步操作。

oracle主要以操作命令行为主,在学习的过程中,对老师的每一步操作都做好了记录。课堂上按照老师的要求一步步操作,课后按记录的操作步骤和命令反复多次的练习。以此到达了对oracle反复学习,熟悉掌握老师所传授的知识。

短短5天的高强度集中学习,我通过“xxxx”考试,取得了“xxxx”的认证。但是我知道依靠这几天的培训对oracle学习是不行的,还必须在实践中不断地努力,提升自身的专业技术能力。只有在不断的实践练习,才能够深刻了解它的原理和方法。在以后的工作中,我仍会继续学习各种关于oracle数据库的知识、持之以恒,在今后的工作中不断实践、总结、深入学习,全面掌握oracle知识。

Oracle异常总结5篇
TOP