oracle - 如何在 pl/sql 过程中使用游标返回多行多列?
问题描述
我正在尝试为在特定日期之间注册课程的返回用户编写一个过程(在 PL/SQL 中)。将有 2 个输入(date1、date2)和 3 个输出(enrollno、error_code 和enroll_date)。我希望它显示在 date1 和 date2 之间注册的多行用户的信息。这是我第一次编写程序,我能够以一种可以返回一行的方式编写它。但由于在这些日期之间可能有很多用户注册,我想显示很多行。我看到我可以使用 sys_refcursor 但我做不到。互联网上的示例主要用于一个输出程序,因此我无法将它们改编为我的。
例如,我在这里查看了示例https://oracle-base.com/articles/misc/using-ref-cursors-to-return-recordsets但我对声明语句感到困惑。
编辑:我打算从 Java 代码中调用此过程并将返回的结果分配给某些东西,并且我不允许将新表添加到数据库中。
这是我的程序:
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;
解决方案
您可以使用单个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 中使用来获取记录,如以下链接所示:
推荐阅读
- python - django上多个应用程序项目的静态文件夹问题
- python - Django 在创建时自动将数据加载到数据库表中
- f# - 在 F# 中,当字符串具有一些轻量级降价属性时,如何按块拆分字符串列表?
- javascript - 将带有 jquery 的 html 模板转换为 React js
- eslint - 苗条与漂亮/eslint
- javascript - NodeJS require() 无法访问模块并且不返回任何函数
- vba - VBA 舍入函数,存储其值以供以后使用,收到“溢出”错误消息
- python - 从条目中获取值以在框架内
- python-3.x - 如何在 sklearn 中执行 train_test_split 但根据列的某个成员限制/指定输出?关闭
- javascript - vue + 复选框 + 更改事件 - 页面和控制台上的不同结果