每次动态传递表名

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

在下面的查询中 j.table_name 是父表,它包含一些依赖表

1 STORE_ORDER_JSON_DATA
2 ECOMM_SHIPDOCS_MQ_DATA

我动态传递父表名称,依赖表名称已直接给出。

但是我想子站点依赖表名称及其列,即 在where条件中使用(js.data_Load_id,js.status,js.date_loaded也需要动态传递),因为依赖表每次都会根据父表发生变化。 我们怎样才能做到这一点?现在我直接在 exits 子句中给出了依赖表及其列。

V_SQL := 'DELETE FROM ' || j.table_name || ' ord ' ||---------------main 1
                     ' WHERE ' || j.purge_condition_1 || ' = ''' || j.purge_indicator_1 || '''' ||  
                     ' AND trunc(' || j.purge_date || ') <= trunc(sysdate) - ' || j.threshold_days ||
                     ' AND EXISTS (SELECT 1 FROM STORE_ORDER_JSON_DATA js ' ||--
                     ' WHERE js.data_Load_id = ord.data_load_id ' ||
                     ' AND js.status = ''P'' ' ||
                     ' AND trunc(js.date_loaded) <= trunc(sysdate) - 10) ' ||
                     ' AND EXISTS (SELECT 1 FROM ECOMM_SHIPDOCS_MQ_DATA mq ' ||--
                     ' WHERE mq.data_Load_id = ord.data_load_id ' ||
                     ' AND mq.status = ''P'' ' ||
                     ' AND trunc(mq.date_loaded) <= trunc(sysdate) - 10)';
sql oracle11g oracle-apex dynamic-sql
1个回答
0
投票

...因为依赖表每次都会根据父表进行更改。

我讨厌这么说,但是 - 动态 SQL 是邪恶。你真的需要它吗?为什么?你不能通过创建例如来实现目标吗

  • a view(作为多个查询的 UNION ALL,每个查询都使用自己的表组合),或
  • 一个返回refcursor的函数
或者其他什么?

如果没有,则考虑创建额外的

,其中将包含成对的主从表和要连接的列

id master detail mcol1 dcol1 mcol2 dcol2 -- ------ ------ ------ ------ -------- ---------- 1 dept emp deptno deptno 2 emp bonus empno empno hiredate bonus_date
然后根据 ID 查询该表来编写动态 SQL,这样您就知道必须连接哪些列。如有必要,可使用另一对 mcol(主列)和 dcol(详细列)对其进行扩展。或者,如果您认为这是一个更好的选择,请对其进行

规范化,以便以前的表仅包含 ID、主表和明细表,而其 detal 表包含成对的列:

id mcol dcol -- -------- ---------- 1 deptno deptno 2 empno empno 2 hiredate bonus_date
其他人可能有另一个不同的、更好的想法,所以 - 等待他们的意见。

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