【问题标题】:User defined table types in OracleOracle中用户定义的表类型
【发布时间】:2017-03-21 22:29:28
【问题描述】:

首先,我通常使用 MSSQL。但是我在 MSSQL 中有一个存储过程,我现在需要在 Oracle 中使用它,因为我对 Oracle 完全陌生,所以我完全不知道如何正确地做到这一点。

我需要在我的 MS SQL 存储过程中使用用户定义的表类型,因为我在我的存储过程中使用“逻辑”表,我还需要将它们传递给此过程中的动态 sql 语句(使用“物理”表作为变量/参数)。

我已经开始在我之前为另一个函数制作的包中添加 oracle 函数。好像

TYPE resultRec IS RECORD
(
   [result columns] 
);

TYPE resultTable IS TABLE OF resultRec;

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

我还描述了表的布局(MSSQL 中的用户定义表类型),我想在这个包头的这个函数中使用它。 到目前为止一切顺利,但现在我真的不知道我必须在哪里声明我的表变量或用户定义的表类型。我还尝试将它们放在包头中,但是如果我尝试在包主体中使用这些表,我正在描述我的函数,Oracle 告诉我们,该表或视图不存在。 我还尝试用它来描述包体或函数块中的表,如下所示:

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 在这种情况下是如何工作的。非常感谢!

【问题讨论】:

    标签: oracle


    【解决方案1】:

    您不能插入到 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 机制。

    【讨论】:

    • Alex,只是一个挑剔...从 11g 开始(我猜),您可以在流水线表函数中使用打包的集合类型。作为包编译的结果,Oracle 在后台为您创建相应的模式级别类型(通常带有 SYS_PLSQL 前缀)。
    • @nop77svk - I think that's from 12c,但很好,我忘记了。
    • Alex,这是关于将纯 PL/SQL 类型传递给 NDSQL(通过立即执行)的能力。我的意思是here, in the "Return data type" section
    • @nop77svk - 啊,好的,谢谢。 (在 OP 的情况下,集合类型的元素不是 SQL 类型,它们是 PL/SQL 记录,因此在这种特定情况下仍然不允许;但通常仍然有用)。
    • 不。还是允许的。只要记录只包含 SQL 类型的元素(甚至也包含模式级对象类型),这些记录的集合仍然可以在流水线 TF 中使用,这些封装类型的“镜像”仍然会在架构级别的引擎盖。 Oracle 文档并没有具体说明这一点,更多的是我自己的经验。
    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2014-10-06
    • 2018-09-19
    相关资源
    最近更新 更多