Oracle常用命令10(oracle例外处理)

本文探讨了在PL/SQL块中处理预定义和自定义异常的方法,包括如何利用预定义例外来捕获并响应SQL相关错误,如no_data_found、too_many_rows等。同时介绍了如何创建自定义异常以应对非预定义的Oracle错误情况。文章还展示了通过更新员工工资并处理不存在的员工ID异常的实践示例。

【例外传递】
如果不处理例外我们看看会出现什么情况:
案例,编写一个过程,可接收雇员的编号,并显示该雇员的姓名。
问题是,如果输入的雇员编号不存在,怎样去处理呢?

--例外案例
declare
 --定义
 v_ename emp.ename%type;
begin
 --执行
 select ename into v_ename from emp where empno=&gno;
 dbms_output.put_line('名字:'||v_ename);
 --no_data_found是预定义的例外,它认为这些例外很常见
 when no_data_found then
 dbms_output.put_line('编号没有!');
end;
/

【处理预定义例外】
预定义例外是由pl/sql所提供的系统例外。当pl/sql应用程序违反了oracle规定的
限制时,则会隐含的触发一个内部例外。pl/sql为开发人员提供了20多个预定义例外。

【预定义例外 case_not_found】
在开发pl/sql块中编写case语句时,如果在wehn子句中没有包含必须的条件分支,就会
触发case_not_found的例外:
create or replace procedure sp_pro6(spno number) is
 v_sal emp.sal%type;
begin
 select sal into v_sal from emp where empno=spno;
 case
 when v_sal<1000 then
  update emp set sal=sal+100 where empno=spno;
 when v_sal<2000 then
  update emp set sal=sal+200 where empno=spno;
 end case;
exception
 when case_not_found then
 dbms_output.put_line('case语句没有与'||v_sal||'相匹配的条件');
end;
/

【预定义例外 cursor already_open】【貌似没有效果啊】
当重新打开已经打开的游标时,会隐含的触发例外cursor_already_open
declare
 cursor emp_cursor is select ename,sal from emp;
begin
 open emp_cursor;
 for emp_record1 in emp_cursor loop
  dbms_output.put_line(emp_record1.ename);
 end loop;
exception
 when cursor_already_open then
 dbms_output.put_line('游标已经打开');
end;
/

【预定义例外 invalid_cursor】
当试图在不合法的游标上执行操作时,会触发该例外
例如:试图从没有打开的游标提取数据,或是关闭没有打开的游标。则会触发该例外
declare
 cursor emp_cursor is select ename,sal from emp;
 emp_record emp_cursor%rowtype;
begin
 --open emp_cursor;--打开游标
 fetch emp_cursor into emp_record;
 dbms_output.put_line(emp_record.ename);
 close emp_cursor;
exception
 when invalid_cursor then
 dbms_output.put_line('请检测游标是否打开');
end;
/

【预定义例外 invlide_number】
当输入的数据有误时,会触发该例外
比如:数字100写成了1oo就会触发该例外
begin
 update emp set sal=sal+'1oo';
exception
 when invalid_number then
 dbms_output.put_line('输入的数字不正确');
end;
/

【预定义例外 no_data_found】
下面是一个pl/sql块,当执行select into 没有返回行,就会触发该例外
declare
 v_sal emp.sal%type;
begin
 select sal into v_sal from emp where ename='&name';
exception
 when no_data_found then
 dbms_output.put_line('不存在该员工');
end;

【预定义例外 too_many_rows】
当执行select into 语句时,如果返回超过了一行,则会触发该例外。
declare
 v_ename emp.ename%type;
begin
 select ename into v_ename from emp;
exception
 when too_many_rows then
 dbms_output.put_line('返回了多行');
end;

【预定义例外 zero_divide】
当执行 2/0 语句时,则会触发该例外。

【预定义例外 value_error】
当在执行赋值操作时,如果变量的长度不足以容纳实际数据,则会触发该例外value_error,
比如:
declare
 v_ename varchar2(5);
begin
 select ename into v_ename from emp where empno=&no1;
 dbms_output.put_line(v_ename);
exception
 when value_error then
 dbms_output.put_line('变量尺寸不足');
end;

【其他预定义例外】
①login_denide
 当用户非法登录时,会触发该例外
②not_logged_on
 如果用户没有登录就执行dml操作,就会触发该例外
③storage_error
 如果超出了内存空间或是内存被损坏,就触发该例外
④timeout_on_resource
 如果oracle在等待资源时,出现了超时就触发该例外

【非预定义例外】
非预定义例外用于处理与预定义例外无关的oracle错误。使用预定义例外
只能处理21个oracle错误,而当使用pl/sql开发应用程序时,可能会遇到
其他一些oracle错误。比如在pl/sql块中执行dml语句时,违反了约束规定等
等,在这样的情况下,也可以处理oracle的各种例外,因为非预定义例外用
的不多,这里就不举例了

【处理自定义例外】【oracle不认为是错误的,用户可以自己将其定义为错误的】
预定义例外和自定义例外都是与oracle错误相关的,并且出现的oracle错误
会隐含的触发相应的例外;而自定义例外与oracle错误没有任何关联,他是由
开发人员为特定情况所定义的例外。
?请编写一个pl/sql块,接收一个雇员的编号,并给该雇员工资增加1000元,
如果该雇员不存在,请提示。
create or replace procedure ex_test(spNo number)
is
begin
 --更新用户sal
 update emp set sal=sal+1000 where empno=spNo;
end;
/

@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 改进版 @@@@@@@@@@@@@@@@@@@@@@@@@@@@

create or replace procedure ex_test(spNo number)
is
 --定义一个例外
 myex exception;
begin
 --更新用户sal
 update emp set sal=sal+1000 where empno=spNo;
 --sql%notfound这是表示没有update
 --raise myex; 触发myex例外
 if sql%notfound then
  raise myex;
 end if;
exception
 when myex then
 dbms_output.put_line('没有更新任何用户');
end;
/

【视图】
视图时一个虚拟表,其内容有查询定义。同真实的表一样,视图包含一系列带有
名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。
行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。

【视图与表的区别】
①表需要占用磁盘空间,视图不需要
②视图不能添加索引
③使用视图可以简化复杂查询
 比如:学生选课系统
④使用视图利于提高安全性
 比如:不同用户查看不同视图

<think>好的,用户之前问过关于Oracle 10g中OC4J_DBConsole目录生成机制和配置的问题,现在他又问在10g中使用set oracle_sid=X和emctl start dbconsole启动DB Console,那么在21c中对应的命令是什么。我需要先理解这两个版本之间的差异。 首先,Oracle 10g和21c在企业管理工具上有很大的变化。在10g时代,DB Control(Database Control)是常用的基于Web的管理工具,它依赖于OC4J容器,所以用户需要配置OC4J_DBConsole目录,并使用emctl命令来管理。但在11g之后,Oracle逐渐转向了Enterprise Manager Cloud Control(EMCC),而单实例的DB Control在12c以后可能已经不再推荐使用,甚至被移除了。特别是到了21c,很可能不再支持DB Console,而是推荐使用EMCC或者其他工具,比如SQL Developer。 所以用户的问题核心在于如何在21c中实现类似的功能。首先需要确认21c是否还有DB Console组件。根据我的知识,可能在12c之后,Oracle已经弃用了DB Control,转而使用EM Express(Enterprise Manager Database Express),这是一个轻量级的替代方案,但功能可能有限。而到了21c,可能更倾向于使用EMCC或者完全不同的工具。 接下来,用户提到的命令set oracle_sid=X和emctl start dbconsole,在10g中是设置环境变量并启动DB Console服务。但在21c中,如果DB Console不存在了,可能需要使用其他方法。例如,EM Express在12c中引入,使用不同的端口(比如5500),并且配置方式也不同,可能不需要emctl命令,而是通过初始化参数启用。 另外,如果用户仍然需要类似的功能,可能需要安装并配置EMCC,但这通常适用于集中管理多个数据库的情况,对于单实例可能过于复杂。此时,可能建议用户使用SQL Developer或者其他图形工具。 还需要考虑到用户可能不熟悉版本之间的变化,所以在回答时需要解释清楚版本差异,说明旧命令不再适用,并提供新版本的对应方法,同时给出替代方案和建议。 最后,确保回答结构清晰,分步骤说明21c中的对应方法,包括检查是否安装相关组件、使用EM Express的步骤,以及替代工具推荐。同时指出需要注意的地方,比如端口变化、如何启用EM Express等,帮助用户顺利过渡到新版本的操作方式。</think>以下是对Oracle 10g与21c中 **DB Console管理命令** 的版本差异解析及21c的对应操作说明: --- ### 一、命令对比与版本演进 | Oracle版本 | 功能定位 | 核心变化 | |------------|-------------------|--------------------------------------------------------------------------| | **10g** | DB Control | 基于OC4J容器,使用`emctl`命令管理 | | **21c** | EM Express | 弃用DB Control,内置轻量级Web管理(需手动启用),默认使用`https://host:5500/em` | | | EM Cloud Control | 集中式监控管理(需单独安装部署) | --- ### 二、Oracle 21c中的 **对应操作** #### ▶ 场景1:使用内置EM Express 1. **启用EM Express** ```sql -- 检查是否已启用 SELECT dbms_xdb_config.gethttpsport() FROM dual; -- 若返回0则表示未启用,需设置端口(例如5500) EXEC dbms_xdb_config.sethttpsport(5500); COMMIT; ``` > *注:EM Express无需`emctl`命令,直接通过数据库内置服务提供* 2. **访问方式** - 浏览器输入: `https://<hostname>:5500/em` 使用`sys`用户登录,需选择**SYSDBA**角色 #### ▶ 场景2:使用传统DB Control(不推荐) > *Oracle 21c默认不安装DB Control,需强制手动部署(存在兼容性问题)* ```bash # 1. 创建资料库(需安装旧版本组件) emca -silent -createDatabase -sid <SID> -sysPassword <sys_pwd> # 2. 启动服务(可能报错) emctl start dbconsole ``` --- ### 三、替代方案推荐 | 工具 | 特点 | 适用场景 | |---------------------|----------------------------------------------------------------------|------------------------------| | **SQL Developer** | 免费图形化工具,支持全功能管理 | 开发/日常运维 | | **EM Cloud Control**| 集中式企业级监控,需单独安装OMS(Oracle Management Server) | 多数据库集群管理 | | **REST API** | 通过`ORDS`(Oracle REST Data Services)提供自动化接口 | 集成到第三方系统 | --- ### 四、关键注意事项 1. **端口冲突** - EM Express默认使用**5500**端口(若被占用需调整) ```sql EXEC dbms_xdb_config.sethttpsport(5501); ``` 2. **HTTPS访问限制** - 21c强制使用HTTPS,若证书问题导致无法访问,可临时添加浏览器例外(生产环境需配置合法证书) 3. **兼容性警告** - 尝试在21c中运行`emctl`会提示: ```bash EM Configuration issue. /u01/app/oracle/product/21c/dbhome_1/not_configured ``` --- > **迁移建议**:优先使用SQL Developer Web版(通过`/ords/sql-developer`访问)或升级到EM Cloud Control 13c,以获得更好的兼容性和功能支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值