我受困于一些糟糕的数据库设计,必须查询按日期命名的表。
当表名用相关日期进行硬编码时,以下查询有效。
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'
答案 0 :(得分:1)
我认为您不能使用动态表名称编写简单的SQL查询。
您可以编写一个使用execute immediate
并返回游标或其他内容的PL / SQL过程; somebody asked about that just yesterday。如果您只是想编写此查询来与某些数据进行交互,那可能是最好的选择。
此外,您可以通过将PL / SQL过程转换为pipelined function来进行修改,然后可以使用TABLE()
从SQL查询中调用它。
如果是我,我会考虑创建一个同义词(或仅从动态命名表中选择的标准视图),并计划每次创建新表时都要重新创建它的作业。这可能比处理流水线函数要简单。