Oracle PL/SQL游标循环日期校验代码DBMS_OUTPUT无输出问题
PL/SQL资产日期校验代码无输出问题修复
存在的问题
- 未赋值的row_two变量导致判断永远不触发
你声明的row_two jaherna42.ci_inventory%rowtype全程没有做赋值操作,变量值为NULL,Oracle中任意日期和NULL做比较的结果都是未知,不会进入IF判断分支,因此没有任何输出。 - 行类型声明与游标返回结构不匹配
你定义的task_five游标返回的是两张表关联后的3个字段,和你声明的jaherna42.employee_ci%rowtype结构并不一致,且FOR循环中的row_one是Oracle隐式生成的局部变量,会覆盖你外层声明的同名变量,你提前声明的两个行类型变量全程没有实际作用。 - 可选前置检查:未开启DBMS_OUTPUT输出
如果修复逻辑问题后仍无输出,需要先执行SET SERVEROUTPUT ON;开启输出权限,否则DBMS_OUTPUT的内容不会打印到控制台。
修复后代码
-- 执行前先开启输出 SET SERVEROUTPUT ON; DECLARE CURSOR task_five IS SELECT a.date_assigned, a.ci_inv_id, b.ci_acquired_date FROM jaherna42.employee_ci a JOIN jaherna42.ci_inventory b ON a.ci_inv_id = b.ci_inv_id WHERE a.user_or_support = 'USER'; -- 直接使用游标%rowtype定义变量,完全匹配返回结果结构 v_task_row task_five%ROWTYPE; BEGIN FOR v_task_row IN task_five LOOP -- 直接用游标返回的两个日期字段做判断,不需要额外声明无关行变量 IF v_task_row.date_assigned < v_task_row.ci_acquired_date THEN DBMS_OUTPUT.PUT_LINE('异常资产ID:' || v_task_row.ci_inv_id); DBMS_OUTPUT.PUT_LINE('资产分配日期:' || TO_CHAR(v_task_row.date_assigned,'YYYY-MM-DD')); DBMS_OUTPUT.PUT_LINE('资产采购日期:' || TO_CHAR(v_task_row.ci_acquired_date,'YYYY-MM-DD')); DBMS_OUTPUT.PUT_LINE('-----------------------------------'); END IF; END LOOP; END; /
内容的提问来源于stack exchange,提问作者kielp2
相关产品推荐
相关产品推荐

