64 lines
2.5 KiB
SQL
64 lines
2.5 KiB
SQL
{% materialization table_if_rows_exist, adapter='oracle' %}
|
|
|
|
{%- set target_relation = this -%}
|
|
|
|
-- Count the number of rows in the source table
|
|
{#-- Use the compiled SQL of the model to count rows --#}
|
|
{%- set count_query %}
|
|
select count(*) as row_count from (
|
|
{{ model.compiled_sql }}
|
|
)
|
|
{%- endset %}
|
|
|
|
{#-- Execute the count query --#}
|
|
{%- set result = run_query(count_query) -%}
|
|
{%- set num_rows = result.columns[0].values()[0]|int -%}
|
|
|
|
{#-- Proceed only if there are rows --#}
|
|
{%- if num_rows > 0 -%}
|
|
{{ log(num_rows ~ ' rows found in source data. Executing model.', info=True) }}
|
|
|
|
{#-- collect hooks --#}
|
|
{% set pre_hooks = control_model_start() %}
|
|
{% set post_hooks = control_model_end('TRG') %}
|
|
|
|
{#-- run pre_hooks --#}
|
|
{% do run_hooks(pre_hooks, inside_transaction=True) %}
|
|
|
|
{#-- Define a temporary relation with a unique name --#}
|
|
{%- set tmp_relation = api.Relation.create(
|
|
schema=target_relation.schema,
|
|
identifier=target_relation.identifier + '_tmp'
|
|
) %}
|
|
|
|
{#-- Create a temporary table with the model's SQL --#}
|
|
{% set ctas_sql = 'CREATE TABLE ' ~ tmp_relation ~ ' AS ' ~ model.compiled_sql %}
|
|
{% call statement('main') %}
|
|
{{ ctas_sql }}
|
|
{% endcall %}
|
|
|
|
{#-- Drop the existing table if it exists --#}
|
|
{%- if adapter.get_relation(target_relation.database, target_relation.schema, target_relation.identifier) is not none -%}
|
|
{{ log('Dropping target table ' ~ target_relation.identifier, info=True) }}
|
|
{% do run_query('DROP TABLE ' ~ target_relation.schema ~ '.' ~ target_relation.identifier) %}
|
|
{%- endif -%}
|
|
|
|
{#-- Rename the temporary table to the target name --#}
|
|
{{ log('Renaming temporary table to target table', info=True) }}
|
|
{% do run_query('ALTER TABLE ' ~ tmp_relation ~ ' RENAME TO ' ~ target_relation.identifier) %}
|
|
|
|
{#-- run post_hooks --#}
|
|
{% do run_hooks(post_hooks, inside_transaction=True) %}
|
|
{%- else -%}
|
|
{#-- Do nothing; leave the target table untouched --#}
|
|
{{ log('No rows in source data. Skipping model execution.', info=True) }}
|
|
{% call statement('main') %}
|
|
SELECT 1 FROM DUAL
|
|
{% endcall %}
|
|
{%- endif -%}
|
|
|
|
{#-- Return the target relation to dbt --#}
|
|
{{ return({'relations': [target_relation]}) }}
|
|
|
|
{% endmaterialization %}
|
|
|