plsql - 如何从 PL/SQL 包中返回集合
问题描述
我目前正在尝试想出一种从 PL/SQL 包返回数据集合的方法。以下代表了包中指定的内容以及我正在尝试做的事情:
这是包装规格:
TYPE MYRECORD IS RECORD
(
ID NUMBER,
SOME_TEXT1 VARCHAR2(50),
SOME_TEXT2 VARCHAR2(50),
SOME_TEXT3 VARCHAR2(50),
SOME_TEXT4 VARCHAR2(255),
);
TYPE VTABLE is table of MYRECORD;
FUNCTION lookup_values (
ANUMBER IN VARCHAR2,
SOMETEXT1 IN VARCHAR2,
SOMETIME IN VARCHAR2,
) RETURN VTABLE
当我在函数中引用 VTABLE 的实例时,我的问题就出现了:
这是在包体中:
FUNCTION Lookup_Values(
ANUMBER IN VARCHAR2,
SOME_TEXT1 IN VARCHAR2,
SOME_TIME IN VARCHAR2,
) RETURN VTABLE
IS
v_records VTABLE;
r_record MYRECORD;
CURSOR OUR_RECORDS IS
SELECT * FROM OUR_TABLE
BEGIN
OPEN OUR_RECORDS
LOOP
FETCH OUR_RECORDS
INTO r_record;
EXIT WHEN OUR_RECORDS %NOTFOUND;
-- I want to do something like the pseudo code below. Is it possible?
v_records.Extend(1);
v_records.ID := r_record.ID;
v_records.SOME_TEXT1 := r_record.SOMETEXT1;
v_records.SOME_TEXT2 := r_record.SOMETEXT2;
v_records.SOME_TEXT3 := r_record.SOMETEXT3;
v_records.SOME_TEXT4 := r_record.SOMETEXT4;
END LOOP;
RETURN (v_records);
END;
希望我已经设法传达了我想要实现的目标。道歉并非如此。如果有任何不清楚的地方,请反馈回来,我会尽力澄清。
亲切的问候保罗J。
解决方案
您提供的带有注释的代码可以工作,但使用 BULK COLLECT 会更高效。
FUNCTION Lookup_Values(
ANUMBER IN VARCHAR2,
SOME_TEXT1 IN VARCHAR2,
SOME_TIME IN VARCHAR2,
) RETURN VTABLE
IS
v_records VTABLE;
CURSOR OUR_RECORDS IS
SELECT * FROM OUR_TABLE
BEGIN
OPEN OUR_RECORDS;
FETCH OUR_RECORDS BULK COLLECT INTO v_records;
-- You may want to limit the number of records returned in
-- in which case use the limit clause:
-- FETCH OUR_RECORDS BULK COLLECT INTO v_records LIMIT 50;
CLOSE OUR_RECORDS;
RETURN (v_records);
END;
推荐阅读
- html - Z-index 过滤器影响具有较高 z-index 的内容
- ruby-on-rails - 如何在 Rails 中设置 cookie 以确保安全
- java - 如何在jsp中提供用户角色和权限
- python - 将 netCDF 文件转换为 csv
- postgresql - 从触发器执行存储过程时出现 Postgres 错误 [42883] 和 [42601]
- r - 在 BASE R 中操作 data.frame 格式
- python - 二进制插入排序与快速排序
- html - 如何有两个只有月份和年份的不同日期的垫子日期选择器
- python - 用于聚合字典的 ReduceByKey 方法
- flutter - Flutter - PopupMenuItem - 如何获取价值