查询与动态表名的Oracle数据库

问题描述 投票:0回答:1

我坚持与一些贫穷的数据库设计在那里我有查询由日期命名表。

当表名是很难与相关日期编码下面的查询工作。

SELECT
  ajob.ORDER_ID
     , ajob.JOB_NAME
     , abim.SERVICE_ID
     , shist.SERVICE_NAME
  FROM
    obscuredschema.A190129001_AJOB               ajob --hardcoded YYMMDD table name
    INNER JOIN obscuredschema.A190129001_ABIMSVC abim --hardcoded YYMMDD table name
               ON (ajob.ORDER_ID = abim.ORDER_ID)
    INNER JOIN obscuredschema.SERVICE_HIST       shist
               ON (abim.SERVICE_ID = shist.SERVICE_KEY)
WHERE shist.SERVICE_NAME LIKE '%BIM'
  AND shist.BIM_AUTH_ID > 0
;

注意到这两个硬编码表名(带有别名一起)

我将如何执行使用动态表名该查询? (有二)

为动态日期代码:TO_CHAR(trunc(sysdate - 7), 'YYMMDD')

如果第一个表名是一个字符串,这里是我会怎么构建它:'A'||TO_CHAR(trunc(sysdate - 7), 'YYMMDD')||'001_AJOB'

如果第二个表名是一个字符串,这里是我会怎么构建它:'A'||TO_CHAR(trunc(sysdate - 7), 'YYMMDD')||'001_ABIMSVC'

sql oracle oracle12c
1个回答
1
投票

我不认为你可以写动态表名普通的SQL查询。

你可以写它采用execute immediate并返回一个指针或东西PL / SQL程序; somebody asked about that just yesterday。如果你只是想编写此查询一些数据进行交互,这可能是你最好的选择。

此外,你可以修改通过转动你的PL / SQL程序为pipelined function,然后你可以从SQL查询中使用TABLE()调用它。

如果是我的话,我会考虑创建一个同义词(或刚刚从动态命名表中选择一个标准视图)和调度作业的每一个创建新表时重新创建它。这可能是比处理流水线功能简单。

© www.soinside.com 2019 - 2024. All rights reserved.