我是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));
这会导致错误:
表或视图不存在。
请给我一些建议。
答案 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是一个函数。