如何在 pl/sql 过程中使用游标 return 多行多列?
How to return multiple rows with multiple columns using cursor in pl/sql procedure?
我正在尝试为 returning 用户编写一个程序(在 PL/SQL 中),这些用户在特定日期之间注册了课程。将有 2 个输入(date1、date2)和 3 个输出(enrollno、error_code 和 enroll_date)。我希望它显示在 date1 和 date2 之间注册的多行用户的信息。这是我第一次编写程序,我能够以 return 一行的方式编写它。但是因为在这些日期之间可能有很多用户注册,所以我想显示很多行。我看到我可以使用 sys_refcursor 但我做不到。 Internet 上的示例主要针对一种输出程序,因此我无法对它们进行调整。
例如,我查看了此处的示例 https://oracle-base.com/articles/misc/using-ref-cursors-to-return-recordsets,但我对 declare 语句感到困惑。
编辑:我计划从 Java 代码调用此过程并将 returned 结果分配给某些东西,我不允许将新的 table 添加到数据库中.
这是我的程序:
create or replace procedure display_users(pi_date1 in date,
pi_date2 in date,
po_enrollno out number,
po_error_code out varchar2,
po_enroll_date out date) is
cursor user_display is
select u.enrollno, u.error_code, u.enroll_date,
from user_table u
where u.enroll_date between pi_date1 and pi_date2;
begin
open user_display;
loop
fetch user_display
into po_enrollno, po_error_code, po_enroll_date;
EXIT WHEN user_display%notfound;
end loop;
close user_display;
end;
如果您只是想将它输出到屏幕上,您可以在循环的每次迭代中使用 dbms_output.put_line,并确保当 运行 代码。如果您愿意,您也可以将它们连接成每行一行输出。
dbms_output.put_line('Enrolled No: ' || to_char(po_enrollno));
dbms_output.put_line('Error Code: ' || po_error_code);
dbms_output.put_line('Enrolled Date: ' || to_char(po_enroll_date));
如果您想收集数据供以后使用,那么您需要将记录插入到您创建的新 table 中。我们将其称为临时 table,并且您需要确保在开始之前删除其中的所有记录。
insert into my_temp_table values( po_enrollno, po_error_code, po_enroll_date);
您可以使用单个 REFCURSOR
输出参数而不是多个输出参数。
CREATE OR REPLACE PROCEDURE display_users (
pi_date1 IN DATE,
pi_date2 IN DATE,
po_userdisp_cur OUT SYS_REFCURSOR
)
IS
BEGIN
OPEN po_userdisp_cur FOR SELECT u.enrollno,
u.error_code,
u.enroll_date
FROM user_table u
WHERE u.enroll_date BETWEEN pi_date1 AND pi_date2;
END;
这可以在 java 中轻松使用以获取记录,如 link:
所示
我正在尝试为 returning 用户编写一个程序(在 PL/SQL 中),这些用户在特定日期之间注册了课程。将有 2 个输入(date1、date2)和 3 个输出(enrollno、error_code 和 enroll_date)。我希望它显示在 date1 和 date2 之间注册的多行用户的信息。这是我第一次编写程序,我能够以 return 一行的方式编写它。但是因为在这些日期之间可能有很多用户注册,所以我想显示很多行。我看到我可以使用 sys_refcursor 但我做不到。 Internet 上的示例主要针对一种输出程序,因此我无法对它们进行调整。
例如,我查看了此处的示例 https://oracle-base.com/articles/misc/using-ref-cursors-to-return-recordsets,但我对 declare 语句感到困惑。
编辑:我计划从 Java 代码调用此过程并将 returned 结果分配给某些东西,我不允许将新的 table 添加到数据库中.
这是我的程序:
create or replace procedure display_users(pi_date1 in date,
pi_date2 in date,
po_enrollno out number,
po_error_code out varchar2,
po_enroll_date out date) is
cursor user_display is
select u.enrollno, u.error_code, u.enroll_date,
from user_table u
where u.enroll_date between pi_date1 and pi_date2;
begin
open user_display;
loop
fetch user_display
into po_enrollno, po_error_code, po_enroll_date;
EXIT WHEN user_display%notfound;
end loop;
close user_display;
end;
如果您只是想将它输出到屏幕上,您可以在循环的每次迭代中使用 dbms_output.put_line,并确保当 运行 代码。如果您愿意,您也可以将它们连接成每行一行输出。
dbms_output.put_line('Enrolled No: ' || to_char(po_enrollno));
dbms_output.put_line('Error Code: ' || po_error_code);
dbms_output.put_line('Enrolled Date: ' || to_char(po_enroll_date));
如果您想收集数据供以后使用,那么您需要将记录插入到您创建的新 table 中。我们将其称为临时 table,并且您需要确保在开始之前删除其中的所有记录。
insert into my_temp_table values( po_enrollno, po_error_code, po_enroll_date);
您可以使用单个 REFCURSOR
输出参数而不是多个输出参数。
CREATE OR REPLACE PROCEDURE display_users (
pi_date1 IN DATE,
pi_date2 IN DATE,
po_userdisp_cur OUT SYS_REFCURSOR
)
IS
BEGIN
OPEN po_userdisp_cur FOR SELECT u.enrollno,
u.error_code,
u.enroll_date
FROM user_table u
WHERE u.enroll_date BETWEEN pi_date1 AND pi_date2;
END;
这可以在 java 中轻松使用以获取记录,如 link:
所示