我在oracle 11g服务器上有一个存储过程,它有一个out变量的记录。我无法编辑此程序。我正在创建一个函数,它将调用该过程并返回记录集中的信息。我查看了以下问题:past question
我的问题是我可以为记录创建一种表格并直接在SQL中查询吗?或者我是否需要将记录转换为类型对象并创建表类型以便直接查询?
答案 0 :(得分:3)
RECORD是一个PL / SQL概念。因此,我们无法基于RECORD创建TABLE TYPE,并在SQL语句中使用该TYPE。 SQL只识别在SQL中创建的TYPE。
因此,如果我正确理解您的场景,您需要在SQL中创建一个对象和/或嵌套表。然后,您的函数可以调用该过程并将RECORD转换为嵌套表。然后可以返回嵌套表或流水线。
答案 1 :(得分:1)
您的链接指向的问题已标记为Oracle
,因此我假设您正在使用该问题。
最简单的方法可能是返回CURSOR
:
SQL> VAR cr_dual REFCURSOR SQL> BEGIN 2 OPEN :cr_dual FOR 3 SELECT 1 4 FROM dual 5 UNION ALL 6 SELECT 2 7 FROM dual; 8 END; 9 / Процедура PL/SQL успешно завершена. SQL> PRINT cr_dual 1 ---------- 1 2
答案 2 :(得分:1)
最终为此问题做的是基于存储过程逻辑创建视图并直接从中查询。
答案 3 :(得分:0)
如果您只收到一条记录并且您知道记录定义,则应该能够直接按名称记录该字段。
例如:
TYPE myrecord IS RECORD (
itemA NUMBER,
itemB myTable.columnName%TYPE
);
当你有myrecord类型的记录时,你可以用这样的方式引用itemA:
CREATE OR REPLACE FUNCTION myFunction(theRecord IN myrecord%TYPE) RETURN NUMBER
IS
BEGIN
RETURN recordInstance.itemA;
END myFunction;
请注意,您可以在调用代码中解决此问题,只需处理原始过程返回的记录类型即可。
答案 4 :(得分:0)
你可以试试varray。
首先 -
create or replace type addr_type
as object
(name varchar2(20)
,city varchar2(20)
)
将你的varray创建为
create or replace type varr_addr as varray(10) of addr_type
/
现在您可以使用varr_addr返回工作。一个例子:
SQL> create or replace procedure ret_user_addr (p_out out varr_addr)
2 is
3 begin
4 p_out := varr_addr(addr_type('NAME1','CITY1'),addr_type('NAME2','CITY2'));
5 end;
6 /
Procedure created.
SQL> sho err
No errors.
现在您需要在调用的地方正确配置out变量。您可以像在表格中那样从表格(VARIABLE_NAME)中进行选择。