完全处理SQL结果集

时间:2013-12-09 10:57:27

标签: oracle plsql

我需要使用SQL结果集来为每个列做一些处理(中位数,标准偏差,包括几个控制语句)

SQL是动态的,所以我不知道列数,行数。

首先,我尝试使用临时表,视图等来存储结果,但是当使用下面的sql时,我没有设法克服Oracle列的30个字符限制:

create table (or view or global temporary table) as select * from (
SELECT
DMTTBF_MAT_MATURATO_BILL_POS.MAT_V_COD_ANNOMESE, 
SUM(DMTTBF_MAT_MATURATO_BILL_POS.MAT_N_NUM_EVENTI_CHZ +DMTTBF_MAT_MATURATO_BILL_POS. MAT_N_NUM_EVENTI) <-- exceeds the 30 character limit
FROM DMTTBF_MAT_MATURATO_BILL_POS
WHERE DMTTBF_MAT_MATURATO_BILL_POS.MAT_V_COD_ANNOMESE >= '201301'
GROUP BY DMTTBF_MAT_MATURATO_BILL_POS.MAT_V_COD_ANNOMESE
)

第二种选择是使用一些PL / SQL类型来存储整个表信息,所以我可以像在其他编程语言中一样调用它(例如矩阵结果[i] [j]),但我找不到任何类似的东西。

第三种变体,使用文件进行读写:我还没有尝试过;我仍然期待更优雅的pl / sql解决方案

我可能在这里采用了错误的方法,所以任何建议都非常受欢迎。

更新:修改输入SQL不是一个选项。该计划必须接受任何选择声明。

2 个答案:

答案 0 :(得分:0)

请注意,您可以为表和字段设置别名。使用表别名可以使对它的引用不会在查询中生成文本墙。在字段中使用一个字段会在输出中为其指定一个新名称。

SELECT A.LONG_FIELD_NAME_HERE AS SHORTNAME
FROM REALLY_LONG_TABLE_NAME_HERE A

自动命名添加_1和_2等以区分来自不同表引用的相同列名。这通常会使一个领域已超出限制。自己给出字段名称可以绕过它。

答案 1 :(得分:0)

您也可以将别名放在动态SQL中:

sqlstr := 'create table (or view or global temporary table) as select * from (
SELECT
   DMTTBF_MAT_MATURATO_BILL_POS.MAT_V_COD_ANNOMESE, 
   SUM(DMTTBF_MAT_MATURATO_BILL_POS.MAT_N_NUM_EVENTI_CHZ + DMTTBF_MAT_MATURATO_BILL_POS.MAT_N_NUM_EVENTI) AS '||SUBSTR('SUM(DMTTBF_MAT_MATURATO_BILL_POS.MAT_N_NUM_EVENTI_CHZ +DMTTBF_MAT_MATURATO_BILL_POS.MAT_N_NUM_EVENTI)', 1, 30)
||' FROM DMTTBF_MAT_MATURATO_BILL_POS
WHERE DMTTBF_MAT_MATURATO_BILL_POS.MAT_V_COD_ANNOMESE >= ''201301''
GROUP BY DMTTBF_MAT_MATURATO_BILL_POS.MAT_V_COD_ANNOMESE
)'