祝我成功吧!

作者北漂近一个月求职不顺,反思在石家庄小公司时重复 coding 工作,自我感觉良好,荒废了自己。感谢原公司和经理领自己入行,但意识到是自身不思进取。庆幸能及时认识不足,鼓励自己努力充实,也劝同行踏实前行,客观评价自己。

来到北京后也已经快一个月了,总也找不到合适的工作。不是人家对咱要求的太高,就是咱看不上人家的公司!总归一句话,真正的出来了才会体会到自己的不足。回想在石家庄的两年,怎么说啊。用“井底之蛙”来形容我真的不是很过分!呆在一个小公司里。每天做着重复的coding 工作!竟然还扬扬自得!自己为自己是高手了。(当然,这也和我很少和网上的朋友接触有关!)其实是将自己荒废了。当然说到这也不是说原来的公司就一无是处。说真的,我挺感谢那个公司,和我们的纪经理的。是他将我从什么都不会带入了这一行。实际上都是自己的原因。自己感觉稍微稳定了就不思进取了。考了一个“软件设计师”证书就真的认为自己是“设计师”似的。一副不知天高地厚的姿态。来到北京,说实话,吃了不少苦头也长了不少见识。感觉以前的自己真的是太幼稚了,同时又挺庆幸自己能尽快的认识到这一点。从这一点上说,我走出那家公司,走出石家庄真的是一步对棋。目前吃点苦就吃点苦吧! 关键是更加努力的充实自己。我感觉我得基础还是不错的,经过努力一定会有所小成的。今天又有一个复试。呵呵 就让我和能看到我得这个帖子的兄弟们祝我成功吧!!

     同时,我想向同样在程序这条路上前进的兄弟们说一句。不要满足,不要沾沾自喜。踏踏实实的走下去,客观的评价自己的实力,给自己以信心!只要我们用心的去付出,收获一定不远的!

<think>我们正在解决一个PL/SQL自定义异常声明的问题。用户需要补全代码,使得当除数为0时,能够触发自定义异常并输出错误信息。 根据引用[3]中的示例,自定义异常声明的格式为: DECLARE 异常名字 EXCEPTION; PRAGMA EXCEPTION_INIT(异常名字, 错误编码); 但是,在除数为0的情况下,Oracle会抛出预定义的异常ZERO_DIVIDE,其错误编码是ORA-01476(即-1476)。然而,题目要求使用自定义异常来处理,而不是直接使用预定义异常ZERO_DIVIDE。 注意:用户练习要求自定义异常,所以我们需要声明一个自定义异常,然后将其与除数为0的错误编码关联起来。这样,当发生除数为0的错误时,我们捕获的是自定义异常。 然而,在引用[3]中处理非预定义异常时,使用了PRAGMA EXCEPTION_INIT将自定义异常名称与一个Oracle错误编码关联。对于除数为0,Oracle已经有预定义错误编码(-1476),我们可以使用这个错误编码来关联自定义异常。 因此,我们可以在DECLARE部分声明一个自定义异常(比如叫做e_div_by_zero),然后使用PRAGMA EXCEPTION_INIT将其与错误代码-1476关联。 另一种方法是,我们可以不关联错误编码,而是在程序中手动检查除数是否为0,如果是0则用RAISE语句抛出自定义异常。但根据题目要求,我们需要在异常处理部分通过WHEN来捕获自定义异常,并且题目中已经有一个除0操作(vv:=100/0;),所以我们需要在异常处理部分捕获这个除0错误,但以自定义异常的形式。 但是,请注意:当执行100/0时,Oracle会自动抛出内部异常ZERO_DIVIDE(错误码-1476)。如果我们想用自定义异常捕获它,我们需要将这个自定义异常与-1476关联。 因此,补全的代码应该包括: DECLARE e_div_by_zero EXCEPTION; -- 自定义异常的名字 PRAGMA EXCEPTION_INIT(e_div_by_zero, -1476); -- 将自定义异常与错误代码-1476关联 然后在EXCEPTION部分,使用WHEN e_div_by_zero来捕获。 但是,我们也可以选择不使用错误编码关联,而是手动触发自定义异常。例如,在执行除法之前,先判断除数是否为0,如果是0则用RAISE语句触发自定义异常。但是,题目中的代码直接执行了vv:=100/0;,所以我们无法避免系统自动抛出ZERO_DIVIDE异常。因此,我们需要将自定义异常与-1476关联,这样当系统抛出ZERO_DIVIDE异常时,就会被当作我们自定义的异常来捕获。 所以,完整的代码应该是: ```sql DECLARE e_div_by_zero EXCEPTION; -- 自定义异常声明 PRAGMA EXCEPTION_INIT(e_div_by_zero, -1476); -- 关联错误代码 vv number(10); BEGIN vv:=100/0; EXCEPTION WHEN e_div_by_zero THEN -- 捕获自定义异常(实际上对应除数为0的系统错误) dbms_output.put_line('自定义错误,除数不能是0!'); END; ``` 但是,需要注意的是,错误代码-1476在Oracle中是一个负数,所以这里写-1476。 另外,根据引用[4]可知,任何Oracle错误(ORA-xxxxx)都可以被异常处理捕获。这里我们将自定义异常与ORA-01476关联起来。 因此,我们按照上述方式补全代码即可。 但是,我们也可以不使用关联,而是直接使用Oracle预定义的ZERO_DIVIDE异常?但题目要求使用自定义异常,所以我们必须自己定义一个异常。 所以,答案就是按照上述方式声明自定义异常并关联错误代码。 现在,我们按照题目要求补全代码: ```sql DECLARE e_div_by_zero EXCEPTION; -- 补全代码:声明自定义异常 PRAGMA EXCEPTION_INIT(e_div_by_zero, -1476); -- 补全代码:关联错误编码-1476 vv number(10); BEGIN vv:=100/0; EXCEPTION WHEN e_div_by_zero THEN -- 补全代码:这里填写自定义异常的名字 dbms_output.put_line('自定义错误,除数不能是0!'); END; ``` 这样,当执行100/0时,系统会抛出错误编码为-1476的异常,由于我们已将自定义异常e_div_by_zero与-1476关联,因此这个异常会被WHEN e_div_by_zero捕获,然后输出自定义错误信息。 注意:错误代码-1476对应的Oracle错误是ORA-01476: divisor is equal to zero。 因此,我们实现了用自定义异常处理除数为0的情况。 但是,我们还可以考虑另一种方式:不使用PRAGMA EXCEPTION_INIT,而是在执行除法之前检查除数是否为0,如果是0则用RAISE语句抛出我们声明的自定义异常。这样就不需要关联错误编码了。但是,题目中给出的代码是直接进行除法运算(vv:=100/0;),所以如果我们不改变这个除法运算,那么就必须关联错误编码。如果题目允许我们改变BEGIN部分的代码,那么我们可以这样: ```sql DECLARE e_div_by_zero EXCEPTION; vv number(10); divisor NUMBER := 0; -- 假设除数为0 BEGIN IF divisor = 0 THEN RAISE e_div_by_zero; ELSE vv := 100 / divisor; END IF; EXCEPTION WHEN e_div_by_zero THEN dbms_output.put_line('自定义错误,除数不能是0!'); END; ``` 但是,题目中并没有提到可以改变BEGIN部分的代码,而且题目已经给出了除法运算(vv:=100/0;),所以我们不能改变这个除法运算。因此,我们只能采用关联错误编码的方式。 所以,最终的补全代码就是声明自定义异常并关联错误编码-1476。 但是,我们还需要注意:在DECLARE部分,我们声明了两个东西:自定义异常和pragma。同时,也要声明变量vv。题目中已经有一行“;”和“vv number(10);”,所以我们需要将自定义异常的声明放在前面,然后接着写变量声明。 题目中DECLARE后面是一个分号,这可能是笔误,我们应该去掉这个分号,然后按照正常顺序声明。 根据题目原来的代码: DECLARE ; --补全代码用户自定义异常 vv number(10); 这里有一个分号,可能是多余的,我们需要在补全代码时去掉。所以,我们补全为: DECLARE e_div_by_zero EXCEPTION; -- 声明自定义异常 PRAGMA EXCEPTION_INIT(e_div_by_zero, -1476); -- 关联错误编码 vv number(10); 这样就是正确的。 因此,我们按照这个方式补全。 最后,补充一点:在异常处理部分,题目中已经给出了WHEN后面的空格,我们需要填写自定义异常的名称(即e_div_by_zero)。 所以,完整的代码为: ```sql DECLARE e_div_by_zero EXCEPTION; -- 补全:自定义异常 PRAGMA EXCEPTION_INIT(e_div_by_zero, -1476); -- 补全:关联错误编码 vv number(10); BEGIN vv:=100/0; EXCEPTION WHEN e_div_by_zero THEN -- 补全:填写自定义异常名称 dbms_output.put_line('自定义错误,除数不能是0!'); END; ``` 这样,当运行这段代码时,就会输出“自定义错误,除数不能是0!”。 注意:在PL/SQL中,错误代码是负数,所以-1476是正确的。 但是,我们也可以使用Oracle预定义的异常ZERO_DIVIDE,但是题目要求自定义异常,所以我们不使用预定义异常名称。 因此,我们通过关联系统错误码的方式,将系统错误转化为自定义异常。 这就是最终的解决方案。 </think>针对您的问题,我将完整解释如何在PL/SQL中声明自定义异常来处理除数为0的情况,并修复代码中的异常声明错误。 ### 解决方案:PL/SQL自定义异常处理除数为0 根据Oracle PL/SQL异常处理机制[^1][^2][^3],自定义异常需要完成两个关键步骤: 1. 声明异常名称 2. 使用`PRAGMA EXCEPTION_INIT`关联Oracle错误编码 对于除数为0的情况,Oracle预定义错误编码为`-1476`(对应ORA-01476)。以下是修复后的完整代码: ```sql DECLARE -- 声明自定义异常名称 e_div_by_zero EXCEPTION; -- 关联自定义异常与Oracle错误编码(-1476对应除数为0) PRAGMA EXCEPTION_INIT(e_div_by_zero, -1476); vv number(10); BEGIN vv := 100/0; -- 触发除数为0的操作 EXCEPTION WHEN e_div_by_zero THEN -- 捕获自定义异常 dbms_output.put_line('自定义错误,除数不能是0!'); END; ``` ### 关键点说明: 1. **异常声明**:`e_div_by_zero EXCEPTION`定义异常名称 2. **错误码关联**:`PRAGMA EXCEPTION_INIT`将自定义异常与Oracle标准错误码-1476绑定[^3] 3. **错误码范围**:Oracle自定义异常应使用-20000到-20999范围,但系统预定义错误如除数为0已有固定编码[^5] 4. **执行流程**: - 当执行`100/0`时,Oracle自动抛出ORA-01476错误 - 异常处理机制将其映射到自定义异常`e_div_by_zero` - 执行自定义错误消息输出 ### 测试建议: 1. 在PL/SQL Developer中执行时,需启用DBMS输出(View > DBMS Output) 2. 预期结果:显示"自定义错误,除数不能是0!" 3. 可将除数改为非零值(如`vv := 100/2`)验证正常执行 > **注意**:如果希望完全自定义异常(非绑定系统错误),应在除法前添加显式检查: > ```sql > IF divisor = 0 THEN > RAISE e_div_by_zero; -- 手动触发自定义异常 > END IF; > ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值