【问题标题】:Process SQL result set entirely完全处理 SQL 结果集
【发布时间】:2013-12-09 19:25:47
【问题描述】:

我需要使用 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 不是一种选择。程序必须接受任何选择语句。

【问题讨论】:

  • 一定喜欢 Oracle 的 30 个字符限制。
  • 在这种情况下,您必须使用DBMS_SQL 包,在那里您可以动态解析任何SQL 语句并读取每个记录和字段。在此处查看 Oracle 文档:DBMS_SQL

标签: oracle plsql


【解决方案1】:

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

SELECT A.LONG_FIELD_NAME_HERE AS SHORTNAME
FROM REALLY_LONG_TABLE_NAME_HERE A

自动命名添加 _1 和 _2 等以区分来自不同表引用的相同列名。这通常会使已经处于边界边缘的字段超出限制。自己给字段命名可以绕过这一点。

【讨论】:

  • 嗨,Brian,记住我不知道后面的 SQL,所以我不能放别名
【解决方案2】:

您也可以将别名放在动态 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
)'

【讨论】:

    猜你喜欢
    • 2015-12-27
    • 2011-01-31
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 2011-08-24
    • 2011-07-02
    相关资源
    最近更新 更多