2012-12-25 19 views
3

我有以下查询:如何通过表达式在组中创建CLOB列?任何工作?

SELECT 
    Test_Case_Name, 
    Test_Case_Description, 
    Test_Case_Status, 
CASE WHEN Test_Case_Status = 'FAILED' THEN 
    LISTAGG(LN.LN_BUG_ID,', ') WITHIN GROUP(ORDER BY LN.LN_BUG_ID) 
END AS Defect_ID 
FROM Test LEFT JOIN LINK LN ON 
    LN.LN_ENTITY_ID=Test.TS_TEST_ID 
GROUP BY 
    Test_Case_Name, 
    Test_Case_Description, 
    Test_Case_Status 

当我运行此查询,我得到的错误

ORA-00932:预期不一致的数据类型有CLOB

这是因为列Test_Case_Description是一个CLOB数据类型。如果我从select子句中注释这个列,它可以正常工作,但我需要输出中的这一列。

以上查询是原始查询here

回答

3

这里的简化版本,你可能需要使用您的要求的语法:

语法:

DBMS_LOB.SUBSTR (lob_loc, amount, offset) 

Parameter Description 
lob_loc: Locator for the LOB to be read i.e CLOB column name. 
amount: Number of bytes (for BLOBs) or characters (for CLOBs) to be read. 
offset: Offset in bytes (for BLOBs) or characters (for CLOBs) from the start of the LOB (origin: 1). 

因此,最终的查询应该是这样的,

SELECT 
    Test_Case_Name, 
    DBMS_LOB.SUBSTR(Test_Case_Description,2000,1) as Test_Case_Description, 
    Test_Case_Status, 
CASE WHEN Test_Case_Status = 'FAILED' THEN 
    LISTAGG(LN.LN_BUG_ID,', ') WITHIN GROUP(ORDER BY LN.LN_BUG_ID) 
END AS Defect_ID 
FROM Test LEFT JOIN LINK LN ON 
    LN.LN_ENTITY_ID=Test.TS_TEST_ID 
GROUP BY 
    Test_Case_Name, 
    Test_Case_Description, 
    Test_Case_Status 

既然你担心以后4000个字符不丢失数据, 我的建议是分列和下面显示它..

SELECT 
    Test_Case_Name, 
    DBMS_LOB.SUBSTR(Test_Case_Description,4000,1) as Test_Case_Description1, 
    DBMS_LOB.SUBSTR(Test_Case_Description,8000,4001) as Test_Case_Description2 
    Test_Case_Status, 
CASE WHEN Test_Case_Status = 'FAILED' THEN 
    LISTAGG(LN.LN_BUG_ID,', ') WITHIN GROUP(ORDER BY LN.LN_BUG_ID) 
END AS Defect_ID 
FROM Test LEFT JOIN LINK LN ON 
    LN.LN_ENTITY_ID=Test.TS_TEST_ID 
GROUP BY 
    Test_Case_Name, 
    Test_Case_Description1, 
    Test_Case_Description2, 
    Test_Case_Status 
+0

但是这只有4000个字符的限制吧? – javanoob

+0

是的,在这种情况下,你可以在plsql块中打印该列。 PL SQL块有超过4000个字符的限制。 – Mari

+0

请你让我知道如何做到这一点?任何链接?非常感谢 – javanoob

2

我只是改变了我的查询如下提到的,它的工作:

SELECT 
    InnerTable.Test_Case_Name, 
    Test.Test_Case_Description, 
    InnerTable.Test_Case_Status, 
FROM 
    ( SELECT 
    Test_Case_ID 
    Test_Case_Name, 
    Test_Case_Status, 
CASE WHEN Test_Case_Status = 'FAILED' THEN 
    LISTAGG(LN.LN_BUG_ID,', ') WITHIN GROUP(ORDER BY LN.LN_BUG_ID) 
END AS Defect_ID 
FROM Test LEFT JOIN LINK LN ON 
    LN.LN_ENTITY_ID=Test.TS_TEST_ID 
GROUP BY 
    Test_Case_Name, 
    Test_Case_Status) AS InnerTable INNERJOIN TEST ON InnerTable.Test_Case_ID = Test.Test_Case_ID 
相关问题