我的 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_assigned
与 null
进行比较时,比较结果将始终为 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 别名为 a
和 b
就像使用单字符变量名一样——不太可能帮助阅读代码的人理解它在做什么。使用一些一致的命名约定几乎肯定会更有用,例如,employee_ci
总是别名为 emp
而 ci_inventory
总是别名为 inv
.
我正在尝试编写一个 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_assigned
与 null
进行比较时,比较结果将始终为 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 别名为 a
和 b
就像使用单字符变量名一样——不太可能帮助阅读代码的人理解它在做什么。使用一些一致的命名约定几乎肯定会更有用,例如,employee_ci
总是别名为 emp
而 ci_inventory
总是别名为 inv
.