【问题标题】:how to store and call a sql query from a table column?如何存储和调用表列中的 sql 查询?
【发布时间】:2019-02-05 22:11:36
【问题描述】:

下面的插入语句包含另一个具有 3 列(id、ins_dt、text_stuff)的表的详细信息

INSERT INTO swpurge_config
       (schema
       ,table_name
       ,table_alias
       ,driving_column
       ,deletion_predicate
       ,retention_period_type
       ,retention_period_value)
    VALUES
       ('CUSTOMERS_OWNER'
       ,'LAST_NAMES'
       ,'LN'
       ,'ins_dt'
       ,'WHERE ln.ins_dt < SYSDATE - p_retention_period_value
      AND ora_hash(ln.rowid, 8) = 1'
       ,'month'
       ,'6');

目标: 我实际上是在尝试在 varchar2 列中添加删除谓词。我们的想法是在过程中调用此列,该过程将删除最多 1000 行的记录:

    PROCEDURE delete_rows
   (
      p_schema                 IN VARCHAR2
     ,p_table_name             IN VARCHAR2
     ,p_table_alias            in varchar2
     ,p_retention_period_value IN VARCHAR2
     ,p_delete_predicate       IN VARCHAR2
   ) IS
      v_sql varchar2 (32000);
      v_row_limit pls_integer (1000);
   BEGIN

    v_sql := 'delete from ' || p_schema ||'.'|| table_name ||p_table_alias
     'older than '|| p_retention_period_value || p_delete_predicate;

    dbms_output.put_line(v_sql);

   END delete_rows;

不确定两件事: 1.如何将sql where子句存储在表列中? 2. 如何在过程中将where子句作为语句执行?

谢谢

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    您说的是动态 SQL

    您可以将其以字符串格式存储在VARCHAR2 中。然后检索它

     select deletion_predicate into v_sql from  swpurge_config where ...
    

    然后

    v_sql := "SELECT ...... FRom .... " || v_sql;
    

    最终执行它

     EXECUTE IMMEDIATE v_sql;
    

    如果你的sql语句也包含参数那么

    EXECUTE IMMEDIATE query_str
        using param1;
    

    【讨论】:

    • 感谢您的建议。但是,从 SWPURGE_CONFIG 表中检索 SQL 语句的原因是我可以添加其他几个表的多个删除语句并将其存储在配置表中。有没有办法做到这一点?
    • 另外我还有一个带有 select 语句的过程,它从 swpurge_config 表中获取记录。
    • 您无法在单线程下获得多个问题的答案。这破坏了 SO 的可用性。如果您有新问题,请考虑打开新线程。如果此答案解决了您的特定问题,请考虑将其标记为答案,以便社区也可以从中受益。祝你好运
    猜你喜欢
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多