📄 新建 文本文档.txt
字号:
BEGIN
select * into i,s1 from aabb1;
EXCEPTION
WHEN NO_DATA_FOUND THEN
Dbms_Output.Put_Line('No Data Found.');
END;
================================================================================================
异常处理::::::
一、PLSQL异常处理
异常是由ORACLE错误或显式的抛出一个错误产生的。
如何处理:
用一个处理程序来捕获它;
将它传递给CALLING ENVIRONMENT
二、异常的类型:
ORACLE SERVER 预定义错误
非ORACLE SERVER 预定义错误,但也是ORACLE SERVER 的标准错误
用户自定义异常
三、捕捉异常的要点:
WHEN OTHERS clause 要放在所有捕捉条件的后面。
错误处理最多有一个 WHEN OTHERS clause.
异常段是以 EXCEPTION.关键字开头的。
我们可以定义不同的EXCEPTION的句柄,来捕捉异常。
处理异常时,只有一条语句能够被处理。
EXCEPTION
WHEN exception1 [OR exception2 . . .] THEN
statement1;
四、常用错误或异常:
NO_DATA_FOUND ORA-01403
TOO_MANY_ROWS ORA-01422
INVALID_CURSOR ORA-01001
ZERO_DIVIDE ORA-01476
DUP_VAL_ON_INDEX ORA-00001
五、实例
PROCEDURE elim_inventory
(v_product_id IN s_product.id%TYPE) IS
v_id s_product.id%TYPE;
BEGIN
SELECT id
INTO v_id
FROM s_product
WHERE id = v_product_id;
DELETE FROM s_inventory
WHERE product_id = v_product_id;
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
ROLLBACK;
TEXT_IO.PUT_LINE(TO_CHAR(v_product_id)||
’ is invalid.’);
WHEN TOO_MANY_ROWS THEN
ROLLBACK;
TEXT_IO.PUT_LINE(’Data corruption in S_PRODUCT.’);
WHEN OTHERS THEN
ROLLBACK;
TEXT_IO.PUT_LINE(’Other error occurred.’);
END elim_inventory;
以下摘自oracle plsql guide
DECLARE
err_num NUMBER;
err_msg VARCHAR2(100);
BEGIN
...
EXCEPTION
...
WHEN OTHERS THEN
err_num := SQLCODE;
err_msg := SUBSTR(SQLERRM, 1, 100);
INSERT INTO errors VALUES (err_num, err_msg);
END;
在SCOTT环境中使用要稍加改动
========================================================================================
FORM中,Exception(例外)都有哪些,如何书写?
软件环境:
1、服务器端:Windows NT4.0+ORACLE 8.0.4
ORACLE安装路径为:C:\ORANT
2、客户端:Windows 98、Developer/2000客户端安装(版本2.1)
实现方法:
BEGIN
《PL/SQL块》;
Exception
when no_data_found then --没有找到数据
《响应命令》;
when too_many_rows then --返回多行,隐式光标每次只能检索一行数据
《响应命令》;
when invalid_number then --字符向数字转换失败
《响应命令》;
when zero_divide then --被零除
《响应命令》;
when dup_val_on_index then --向唯一索引中插入重复数据
《响应命令》;
when invalid_cursor then --非法游标操作
《响应命令》;
when value_error then --数字的,数据转换,截字符串或强制性的错误
《响应命令》;
when others then --发生其它任何错误
null; --选择一:什么也不做,就当错误没发生
raise form_trigger_failure; --选择二:挂起当前程序
END;
========================================================================================
Decode()函数使用技巧
含义解释:
DECODE(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)
该函数的含义如下:
IF 条件=值1 THEN
RETURN(翻译值1)
ELSIF 条件=值2 THEN
RETURN(翻译值2)
......
ELSIF 条件=值n THEN
RETURN(翻译值n)
ELSE
RETURN(缺省值)
END IF
========================================================================================
杀用户进程
select * from v$session where lower(TERMINAL) = 'wangliang';
alter system kill session 'SID, SERIAL#';
应该是
alter system kill session 'sid,serial#'
或者用TOAD,pl/sql developer等工具。
另外,
select vp.spid
from v$session vs,v$process vp
where vs.paddr = vp.addr --记不太清了
and vs.machine = 'your machine name'
and 其他条件
spid 就是unix下的进程号,kill 掉即可。
========================================================================================
这样可以只复制表结构,不复制数据。
create table dup_table as
(select * from org_table
where 1=0);
=========================================================================================
表复制:
用copy from
用法: COPY FROM <db> TO <db> <opt> <table> {(<cols> )} USING <sel>
<db> : 数据库字符串, 例如: scott/tiger@d: chicago-mktg
<opt> : 下列关键字之一: APPEND, CREATE, INSERT 或 REPLACE
<table>: 目标表名称
<cols> : 用逗号分隔的目标列别名列表
<sel> : 任何有效的 SQL SELECT 语句
缺少的 FROM 或 TO 子句使用当前的 SQL*Plus 连接
=========================================================================================
查看数据库字符集:
可以在sqlplus中输入select userenv('language') from dual;
=========================================================================================
update table1 set (c,b)=(select d,e from table2 where table1.c=table2.f and rownum=1)
=========================================================================================
与oracle中的DECODE函数相似的SQL函数是什么
select decode(a1,'0', 'easy', '1', 'normal', '2', 'hard') level from a;
轉成SQL Server為:
select
(case a1 when '0' then 'easy'
when '1' then 'normal'
when '2' then 'hard' end) level
from a;
=========================================================================================
select * from v$open_cursor
select * from v$parameter
v$sqltext
=========================================================================================
查看服务器支持的字符集
select value from V$NLS_VALID_VALUES where parameter='CHARACTERSET' order by value;
=========================================================================================
DMP文件第二第三字节是字符集,比如001F
select nls_charset_name(to_number('001f')) from dual;
WE8ISO8859P1
要改成ZHS16GBK
select to_char(nls_charset_id('ZHS16GBK')) from dual;
0354
改吧
不过不是任意两个字符集之间都能改的,要注意。不过好在我们常用的
US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK都可以。
=========================================================================================
[Oracle初始口令]
internal/oracle
sys/change_on_install
system/manager
scott/tiger
=========================================================================================
Ora-06550/06553
1. (可能)有可以是因为空值引起的。sum()函数会返回NULL,而count()则不会。一般用nvl()可以解决
2. 程序结构不是很好,例如:
open cursor for
select * from a
union
select * from b => 这样就有可能引起这错误,
解决:
open cursor for
select x.* from
(select * from a
union
select * from b) x => 这样就有可能引起这错误,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -