Oracle

时间:2016-11-08 10:25:02

标签: oracle

首先,我通常使用MSSQL。但是我在MSSQL中有一个存储过程,我现在需要在Oracle中使用,因为我对Oracle完全不熟悉,我根本不知道如何正确处理它。

我需要在MS SQL存储过程中使用用户定义的表类型,因为我正在使用" logical"我的存储过程中的表,我还需要将它们传递给此过程中的动态sql语句(使用" physical"表作为变量/参数的列名)。

我已经开始在我之前为另一个函数创建的包中添加oracle函数。它看起来像

TYPE resultRec IS RECORD
(
   [result columns] 
);

TYPE resultTable IS TABLE OF resultRec;

Function MyFunctionName([A LOT PARAMETERS]) RETURN resultTable PIPELINED;

我还描述了表的布局(用户定义的MSSQL中的表类型),我想在这个包头中的这个函数中使用它。 到目前为止一切都那么好,但现在我不知道我必须在哪里声明我的表变量或用户定义的表类型。我也尝试将它们放在包头中,但是如果我试图在包体中使用这些表,我在描述我的函数,Oracle告诉met,表或视图不存在。 我还试着用它来描述包体内或我的函数块中的表,看起来像这样:

FUNCTION MyFunctionName
(
   [MyParameters]
)
RETURN resultTable PIPELINED is rec resultrec;

TYPE tableVariableA IS TABLE OF tableRecA;
TYPE tableVariableB IS TABLE OF tableRecB;

BEGIN

  INSERT INTO tableVariableA
  SELECT ColumnA, ColumnB FROM physicalTable WHERE[...];

  [A LOT MORE TO DO...]
END;

但在这种情况下,Oracle也告诉我,它不知道表或视图。 我还尝试了一些其他的东西,但最后我无法告诉Oracle它应该使用哪个表... 我很感激每一个提示,这有助于我理解oracle在这种情况下的工作原理。非常感谢!

1 个答案:

答案 0 :(得分:2)

您无法插入collection(例如PL / SQL表)。您可以use the bulk collect syntax填充该集合:

SELECT ColumnA, ColumnB
BULK COLLECT INTO tableVariableA
FROM physicalTable
WHERE [...];

但是,您可能希望检查这是一种合适的方法,因为SQL Server和Oracle有很大不同。您不能在纯SQL(at least prior to 12c)中使用PL / SQL表,即使在您的过程中也是如此,因此可能需要模式级类型而不是PL / SQL类型,但是这取决于你接下来会做什么。你可能根本不想要一个集合。尝试将T-SQL直接转换为PL / SQL而不了解差异可能会导致您走错路径 - 确保您了解实际需求,然后找到最佳的Oracle机制。