2009-06-30 78 views
3

我在Oracle 11g服务器中有一个存储过程,该过程具有记录的变量。我无法编辑此程序。我正在创建一个将调用该过程并返回记录集中的信息的函数。我在这里看到以下问题:past question从记录收集类型中选择数据

我的问题是我可以创建一种记录类型,并直接在SQL查询它?或者我是否需要将记录转换为类型对象并为其创建直接查询的表类型?

+0

您使用的是什么RDMS?在存储过程中你可以做什么因平台而异。 – 2009-06-30 17:49:20

+0

对不起,我正在使用oracle 11g – Slowbie 2009-06-30 18:01:27

回答

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 
0

,如果你只接收到一个记录,你知道记录定义,你应该能够记录的现场直接的名字。

例如:

CREATE OR REPLACE FUNCTION myFunction(theRecord IN myrecord%TYPE) RETURN NUMBER 
IS 
BEGIN  
    RETURN recordInstance.itemA; 
END myFunction; 

请注意您可能能够解决这个问题:

TYPE myrecord IS RECORD (
     itemA NUMBER, 
     itemB myTable.columnName%TYPE 
); 

,当你有myrecord类型的记录,你可以在这样的方式引用意达在你的调用代码中简单地处理原始过程返回的记录类型。

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. 

现在,你需要有从那里你call.And你可以从表(VARIABLE_NAME)选择,你会做正确配置了变量。

3

RECORD是一个PL/SQL概念。所以我们不能创建基于RECORD的TABLE TYPE,并在SQL语句中使用该TYPE。 SQL只能识别在SQL中创建的TYPE。

所以,如果我正确理解你的场景,你需要在SQL中创建一个对象和/或嵌套表。然后您的函数可以调用该过程并将RECORD转换为嵌套表格。嵌套表可以被返回或流水线化。

1

最终这个问题是为了创建一个基于存储过程逻辑的视图并直接从中查询。