【问题标题】:local collection types not allowed in SQL statementsSQL 语句中不允许使用本地集合类型
【发布时间】:2014-12-16 17:24:43
【问题描述】:

我有一个关于在 Oracle SQL 函数中使用集合的问题。

包中有类型的定义:

/* Types of package*/
create or replace PACKAGE "test" AS 

TYPE type_record_1 IS record ( id_num NUMBER , timestamp_num NUMBER,value NUMBER);
TYPE type_table_1 IS TABLE OF type_record_1; 
TYPE type_record_2 IS record ( id_num NUMBER , timestamp_num NUMBER,pValue NUMBER);
TYPE type_table_2 IS TABLE OF type_record_2; 
END test;

问题在于函数_2。 function_2 使用 function_1 的输出。 当我尝试在 function_2 中选择时出现错误消息。 错误信息“SQL 语句中不允许本地集合类型”。

你能帮忙吗?在函数中使用集合有什么问题?

/*function 1*/
FUNCTION function_1
RETURN  type_table_1
IS
table_1 type_table_1;
BEGIN
-- select values from
SELECT id_num, timestamp_num, value --type_record_1 (id_num, timestamp_num, value) 
BULK COLLECT INTO table_1 
    FROM (
      SELECT       
        l.id_num,
        EXTRACT(hour from end_time) * 60 + EXTRACT(minute from end_time) as timestamp_num,
        l.value
      FROM INTERVAL_F l
      WHERE id_num IN (SELECT id_num FROM table_rev)
    );

 RETURN table_1;

 END function_1;


 /*function 2*/
 FUNCTION function_2
         (
          table_1 IN type_table_1
          )
 RETURN type_table_2
 IS 
 table_2 type_table_2;
 BEGIN

 SELECT type_record_2(id_num , timestamp_num , pValue)
 BULK COLLECT INTO table_2 FROM (
 SELECT  id_num
       , timestamp_num 
       , value as pValue
       FROM table(table_1)  -- ERROR IS HERE
       );

 RETURN table_2;
 END function_2;

【问题讨论】:

  • 因为根本不允许在声明不是在模式级别(12c 之前)的集合上使用 table() 运算符。 12c 放宽了这个限制,在包规范中声明一个集合就足够了,以便能够在其他地方“查询”它(使用table() 运算符)。

标签: sql oracle select collections plsql


【解决方案1】:

为了实现你应该使用类似的东西:

创建或替换类型 type_record_1... /

创建或替换类型 type_table_1 作为 type_record_1 的表; /

Oracle 不允许将包中声明的类型转换为表。 直到 11 点才说 Oracle,还没有检查 12c 的新特性 :(.

【讨论】:

  • 谢谢它的工作!有没有办法绕过这个限制而不在架构级别创建数据类型?
  • 长答案是否定的,因为它与数据类型的范围有关。我希望这个限制在未来的版本中可以避免,但是在 11g R2 之前这是非常正常的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 2020-03-07
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
相关资源
最近更新 更多