Oracle存储过程中的表变量

时间:2014-07-18 04:01:47

标签: oracle stored-procedures plsql

我是Oracle新手,我需要将我的SQL Server存储过程转换为oracle。在SQL Server中,我有返回表变量的函数。

执行看起来像:

Declare @tblTSVal table(stValue varchar(500), itemKey varchar(255), props varchar(max))
insert @tblTSVal(stValue, itemKey, props) 
  select * from dbo.fn_ag_valuesToTable(@tsVal)

我在Oracle数据库中编写了这个函数,它正在运行。但我不知道如何在存储过程中声明一个表变量。

现在我正在尝试这样:

声明:

type AGValues as object
(
   stValue varchar(255),
   itemKey varchar(255),
   props varchar(8000)
);
type ValTBL is Table of AGValues;   

执行:

insert into tblTSVal(stValue, itemKey, props) 
  select * from TABLE(dbMis.fn_ag_valuesToTable(tsVal));

这会导致错误:

  

表或视图不存在。

请给我一些建议。

2 个答案:

答案 0 :(得分:1)

ValTBL是所谓的嵌套表。要在其中加载数据,请使用BULK COLLECT选项。

示例:

SELECT * BULK COLLECT INTO tblTSVal FROM TABLE(dbMis.fn_ag_valuesToTable(tsVal));

但这不是"表或视图不存在的根。"错误问题。请检查您执行dbMis.fn_ag_valuesToTable功能的权利。

使用pl / sql函数作为表值得阅读有关流水线和并行表函数的信息。 http://docs.oracle.com/cd/E11882_01/appdev.112/e10765/pipe_paral_tbl.htm#ADDCI2140

答案 1 :(得分:0)

我还没试过这个,但是因为你没有直接将查询结果作为输出返回(即你正在执行命令),如果你将它包装在PL / SQL块中怎么办? ?

BEGIN
  execute immediate 'insert into tblTSVal(stValue, itemKey, props) ' ||
    'select * from ' || dbMis.fn_ag_valuesToTable(tsVal);
END;
/

我假设dbMis.fn_ag_valuesToTable是一个函数。