使用动态表名称查询Oracle数据库

时间:2019-02-05 16:11:17

标签: sql oracle oracle12c

我受困于一些糟糕的数据库设计,必须查询按日期命名的表。

当表名用相关日期进行硬编码时,以下查询有效。

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'

1 个答案:

答案 0 :(得分:1)

我认为您不能使用动态表名称编写简单的SQL查询。

您可以编写一个使用execute immediate并返回游标或其他内容的PL / SQL过程; somebody asked about that just yesterday。如果您只是想编写此查询来与某些数据进行交互,那可能是最好的选择。

此外,您可以通过将PL / SQL过程转换为pipelined function来进行修改,然后可以使用TABLE()从SQL查询中调用它。

如果是我,我会考虑创建一个同义词(或仅从动态命名表中选择的标准视图),并计划每次创建新表时都要重新创建它的作业。这可能比处理流水线函数要简单。