Oracle/TOAD:为我的团队创建共享过滤器定义的集合

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

也许可能性不大,但在工作中,我的团队从非常复杂的表格中提取数据,这些表格不仅仅是为我们构建的。我们对如何拉取某些行以满足某些要求不断发展定义。它们是医疗索赔,例如,我们有过滤的列来定义诸如门诊护理、被拒绝的索赔、不同组的程序或诊断代码的定义等。 它现在的工作方式让我心碎,因为不同的内容专家基本上将这些定义定义为自己模式中的片段,当其他分析师可能需要它们时,我们只需联系他们,然后将其复制并粘贴到我们自己的中询问。

这不仅很难跟踪,而且随着人们骑车进出,还可能会丢失这些信息,而且同事 A 对耳部感染有一个定义,全年都会更新,那么如果我有他们旧版本的耳部感染的话代码并且不想检查它是否被更改,那么我们在这里提取不同的数据。当然,如果有人离开组织,风险也很大。

我希望找到一种方法,使所有这些定义都有效,并且能够动态拉取以供其他分析师使用,并且会自动更新最终定期运行的查询。

如果我能弄清楚(但也可能不可能),一个可行的示例想法是拥有一个共享表,其中每一行可以用于不同的过滤器定义,一列用于实际定义,以及其他文档栏。

例如,该表中的单元格可以是字符串“WHERE PROCEDURE_CODE = 123 AND PROVIDER_INFORMATION = 'abc'”。 然后,另一位分析师可以查询此定义表,以将该字符串作为其自己的查询中的 WHERE 语句的一部分提取出来。这样,表就可以更新,但如果他们重新运行查询,它现在会自动提取更新的定义。 显然,这并不是那么简单,但我不知道是否有办法让这样的事情正常工作,但如果有人有办法让这样的事情发生,我真的很高兴。我们正在使用 Toad Datapoint 6.0,因此如果人们知道 TOAD 中还有其他一些功能(可能是片段之类的功能,但我无法动态提取这些功能),那么我当然会对此持开放态度。定义表示例在我看来是有意义的,但是任何可以实现类似功能的东西都很棒

我尝试将变量定义为语句中 WHERE 的一部分,这适用于过滤器需要动态组件(例如日期或代码集)的情况,但不适用于整个 WHERE 语句及其使用的列可能需要改变不同的定义。

sql oracle toad
1个回答
0
投票

在Oracle 19c及更高版本中,SQL宏可以构建动态表函数库。将所有功能放在一个包中也会减少对象膨胀。

这种方法与视图类似,但 SQL 宏比常规视图更复杂、更强大。 SQL 宏可以用作美化视图(如下面的

getEarDiagnosis
所示),或者可以将它们参数化以在运行时获取表名,如果有许多相似的表(如下面的
getEarProc
所示),这可以简化代码,并且它们还可能需要变量进行过滤(如下
getEarProcAfterDate
所示)。结果仍然作为常规表格返回,因此用户可以在所需的过滤器之上添加自己的自定义过滤器。

create table claims(diagnosis_code varchar2(100), procedure_code varchar2(100), claim_date date);
create table claims_2018_backup(diagnosis_code varchar2(100), procedure_code varchar2(100), claim_date date);

create or replace package claimManager is
    function getEarDiagnosis return clob sql_macro;
    function getEarProc(p_claimTable dbms_tf.table_t) return clob sql_macro;
    function getEarProcAfterDate(p_claimDate date) return clob sql_macro;
end claimManager;
/

create or replace package body claimManager is
    function getEarDiagnosis return clob sql_macro is
    begin
        return
        q'[
            select * from claims where diagnosis_code = 'T16.9XXA'
        ]';
    end;

    function getEarProc(p_claimTable dbms_tf.table_t) return clob sql_macro is
    begin
        return
        q'[
            select * from p_claimTable where procedure_code = '69200'
        ]';
    end;

    function getEarProcAfterDate(p_claimDate date) return clob sql_macro is
    begin
        return
        q'[
            select * from claims where procedure_code = '69200' and claim_date > trunc(p_claimDate)
        ]';
    end;
end claimManager;
/

select * from table(claimManager.getEarDiagnosis);
select * from table(claimManager.getEarProc(p_claimTable => claims));
select * from table(claimManager.getEarProcAfterDate(p_claimDate => sysdate));

上面的代码比较简单,但也不必如此。每个函数都使用 PL/SQL,因此您可以疯狂地根据您想要的任何过程逻辑或配置表构建自己的动态查询字符串。 (但是动态 SQL 可能很困难,因此要花费额外的时间确保这样的包得到良好的注释、格式化和设计。)

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