unpivot 和 oracle 对象的问题

Posted

技术标签:

【中文标题】unpivot 和 oracle 对象的问题【英文标题】:Issue with unpivot and oracle objects 【发布时间】:2013-07-31 10:25:31 【问题描述】:
CREATE TABLE unpivot_test 
(
    unique_id NUMBER(9) PRIMARY key,
    cusip VARCHAR2(30 CHAR),
    sedol VARCHAR2(30 CHAR),
    isin VARCHAR2(30 CHAR),
    ticker VARCHAR2(30 CHAR),
    currency VARCHAR2(3 CHAR)
);
INSERT INTO  unpivot_test VALUES (1, '1234', NULL, NULL, NULL, 'USD');

当我使用 unpivot 函数时,它按预期工作。

SELECT Identifier, scheme,  unique_id, currency
FROM unpivot_test
UNPIVOT (Identifier FOR scheme IN (
    cusip AS '1', sedol AS '2', isin AS '3', ticker AS '4'));

现在用用户定义类型替换表格。

CREATE OR REPLACE TYPE obj_unpivot_test AS OBJECT (
    unique_id NUMBER(9) ,
    cusip VARCHAR2(30 CHAR),
    sedol VARCHAR2(30 CHAR),
    isin VARCHAR2(30 CHAR),
    ticker VARCHAR2(30 CHAR),
    currency VARCHAR2(3 CHAR)
);
CREATE OR REPLACE TYPE obj_unpivot_test_array AS TABLE OF obj_unpivot_test;

以下查询将失败并出现未找到数据错误。

DECLARE
   l_obj obj_unpivot_test_array := obj_unpivot_test_array(obj_unpivot_test(1, '1234',     NULL, NULL, NULL, 'USD'));
   l_IDENTIFIER VARCHAR2(30 CHAR);
   l_SCHEME NUMBER(1);
   l_UNIQUE_ID number(9);
BEGIN
   SELECT identifier, scheme, UNIQUE_ID
   INTO l_IDENTIFIER, l_SCHEME, l_UNIQUE_ID
   FROM
       TABLE(l_obj) o
   UNPIVOT  (IDENTIFIER FOR SCHEME IN (cusip AS 1, sedol AS 2, isin AS 3, ticker AS 4));
   Dbms_Output.put_line('l_IDENTIFIER:'||l_IDENTIFIER);
   Dbms_Output.put_line('l_SCHEME:'||l_SCHEME);
END;

我错过了什么?

【问题讨论】:

【参考方案1】:
SET serveroutput ON
DECLARE
     l_IDENTIFIER VARCHAR2(30 CHAR);
     l_SCHEME     NUMBER(1);
     l_UNIQUE_ID  NUMBER(9);
BEGIN
     SELECT identifier,
          scheme,
          UNIQUE_ID
     INTO l_IDENTIFIER,
          l_SCHEME,
          l_UNIQUE_ID
     FROM
          (SELECT *
          FROM TABLE(obj_unpivot_test_array(obj_unpivot_test(1, '1234',NULL, NULL, NULL, 'USD')))
          ) UNPIVOT (IDENTIFIER FOR scheme IN ( cusip AS '1', sedol AS '2', isin AS '3', ticker AS '4'));
     Dbms_Output.put_line('l_IDENTIFIER:'||l_IDENTIFIER);
     Dbms_Output.put_line('l_SCHEME:'||l_SCHEME);
END;

【讨论】:

以上是关于unpivot 和 oracle 对象的问题的主要内容,如果未能解决你的问题,请参考以下文章

oracle pivot 和 unpivot 函数的使用

oracle unpivot 多列到多列

没有 UNPIVOT 的 Oracle SQL 列到行

在 oracle 中用 Unpivot 替换 union all

Oracle开发者中级第5课(Pivot 和Unpivot)实验

Oracle pivot & unpivot