我正在针对源应用程序表测试数据湖中获取的表(以及其中的数据)。我们在获取时不转换任何数据,但我们并不总是获取表的所有列,并且获取过程会向表添加几个数据湖列(获取日期等)
所以我必须比较两个表,其中大多数列是相同的,但有些不是。显然,我可以通过手动指定每个SELECT
语句的列来处理这个问题。我想做一个测试脚本,将自动做到这一点,比较常见的列,然后允许我做进一步的查询使用列列表。
我已经测试了公共列,以确保列之间的数据类型完整性:
SELECT /*fixed*/
b.column_name,
a.data_type AS source_data_type,
b.data_type AS acquired_data_type,
CASE
WHEN a.data_type = b.data_type THEN 'Pass'
ELSE 'Fail'
END AS DATA_TYPE_TEST
FROM
all_tab_cols@&sourcelink a
INNER JOIN all_tab_cols b ON a.column_name = b.column_name
WHERE
a.owner = '&sourceschema'
AND b.owner = 'DATALAKE'
AND a.table_name = '&tableName'
AND b.table_name = '&tableName';
上面的操作按预期工作,并且只获得公共列。如何保存这个公共列列表,以便在直接查询表时可以在进一步的查询中使用它们,例如:
SELECT
<my dynamic list of columns here>
FROM
&sourceschema..&tablename@&sourcelink a
INNER JOIN datalake.&tablename b ON a.id = b.id;
这是可能的与Oracle PL/SQL或我应该使用python代替?
LISTAGG可以为您简化为列列表
SQL> select listagg(column_name,',') within group ( order by column_id)
2 from user_tab_columns
3 where table_name = 'EMP';
LISTAGG(COLUMN_NAME,',')WITHINGROUP(ORDERBYCOLUMN_ID)
--------------------------------------------------------------------------
EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO
然后你可以返回一个动态ref游标到任何你想要的客户端,例如
open my_ref_cur for
'select '||col_list||' from ....';