⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 新建 文本文档.txt

📁 oracle问题集
💻 TXT
📖 第 1 页 / 共 2 页
字号:
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 + -