我的 Oracle SQL 代码正在编译我的代码块,该代码块使用两个表中的游标进行循环,但 dbms 输出行未显示结果

My Oracle SQL Code is compiling my block of code that uses a cursor for a loop from two tables but the dbms output line is not showing the results

我正在尝试编写一个 SQL 代码块来比较来自两个 table 的两个日期。一个 table 显示获得物品的时间 (ci_acquired_date)。另一个 table 显示项目何时分配给员工 (date_acquired)。我的目购买)并使用 DBMS 显示它是哪个项目 ID 以及获得和分配的日期。

这是我的代码:

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';

row_one jaherna42.employee_ci%rowtype;
row_two jaherna42.ci_inventory%rowtype;
begin
    for row_one in task_five 
    loop
    
        if(row_one.date_assigned < row_two.ci_acquired_date)
    then 
    dbms_output.put_line('The error is: ' || row_one.ci_inv_id);
    dbms_output.put_line('The date assigned is: ' || row_one.date_assigned);
    dbms_output.put_line('The date acquired is: ' || row_two.ci_acquired_date);
    end if;
end loop;
end;

当我运行它时,脚本输出框会显示

PL/SQL procedure successfully completed.

但我的 dbms 输出框中不会显示任何内容。错误是什么?

row_two 是声明的局部变量,但从未为其赋值。因此,记录中的每个字段总是 null。当您将值 row_one.date_assignednull 进行比较时,比较结果将始终为 false。因此,您的 if 语句始终是 false,并且不会打印任何内容。

我有点惊讶你发布的代码编译。 row_one 声明为 jaherna42.employee_ci%rowtype,但您定义的查询并未出现在 return 来自 employee_ci 的所有列中。也许您很幸运,table 中列的顺序和类型与查询中的顺序和类型相匹配,即使该查询从多个 table 中提取数据也是如此。但那是一个幸运的意外。

如果您想将光标保留在声明部分,您几乎肯定希望针对 光标的 %rowtype 而不是 table的。所以像这样的东西可能是你真正想要的。

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';

  row task_five%rowtype;
begin
  for row in task_five 
  loop
    if(row.date_assigned < row.ci_acquired_date)
    then 
      dbms_output.put_line('The error is: ' || row.ci_inv_id);
      dbms_output.put_line('The date assigned is: ' || row.date_assigned);
      dbms_output.put_line('The date acquired is: ' || row.ci_acquired_date);
    end if;
  end loop;
end;

不过,除非它是您的作业的要求,否则完全避免声明并在代码中使用隐式游标可能是有意义的。并在 SQL 而不是 PL/SQL

中进行比较
begin
  for row in (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'
                 and a.date_assigned < b.ci_acquired_date)
  loop
    dbms_output.put_line('The error is: ' || row.ci_inv_id);
    dbms_output.put_line('The date assigned is: ' || row.date_assigned);
    dbms_output.put_line('The date acquired is: ' || row.ci_acquired_date);
  end loop;
end;

我通常还建议您在查询中使用有意义的别名。将 tables 别名为 ab 就像使用单字符变量名一样——不太可能帮助阅读代码的人理解它在做什么。使用一些一致的命名约定几乎肯定会更有用,例如,employee_ci 总是别名为 empci_inventory 总是别名为 inv.