Categorias:

Funções do sistema (Informações do sistema)

SYSTEM$STREAM_HAS_DATA

Indica se um fluxo especificado contém registros de captura de dados de alterações (CDC).

Sintaxe

SYSTEM$STREAM_HAS_DATA('<stream_name>')
Copy

Argumentos

stream_name

O nome do fluxo a ser consultado.

  • Observe que o nome completo deve ser incluído entre aspas simples, incluindo o banco de dados e o esquema (se o nome for totalmente qualificado), ou seja, '<bd>.<esquema>.<nome_fluxo>'.

  • Se o nome do fluxo diferenciar letras maiúsculas e minúsculas ou incluir quaisquer caracteres ou espaços especiais, as aspas duplas são necessárias para processar o caso/caracteres. As aspas duplas devem ser incluídas dentro das aspas simples, ou seja, '"<nome_fluxo>"'.

Notas de uso

  • Esta função destina-se a ser utilizada na expressão WHEN na definição das tarefas. Se o fluxo especificado não contiver dados de alteração, a tarefa pula a execução atual. Esta verificação pode ajudar a evitar iniciar ou retomar um warehouse desnecessariamente. No entanto, note que esta função foi concebida para evitar falsos negativos (ou seja, retornar um valor falso mesmo quando o fluxo contém dados de alteração); no entanto, a função não é garantida para evitar falsos positivos (ou seja, retornar um valor verdadeiro quando o fluxo não contém dados de alteração).

  • Esta função realiza uma comparação dos metadados da versão de tabela (entre o offset do fluxo e o tempo transacional atual) para determinar se o fluxo contém registros CDC. Se a atividade de DML para a tabela durante esse período consistiu em inserir, opcionalmente atualizar e excluir o mesmo conjunto de linhas, retornando ao estado original da tabela, então é possível que esta função possa retornar um valor TRUE mesmo que o fluxo não contenha registros CDC.

  • Quando a entrada é um fluxo de exibição, o valor retornado é TRUE quando a captura de dados de alteração (CDC) registra a mudança de tabelas subjacentes. A função realiza uma comparação nos metadados da versão para as tabelas subjacentes e não para a exibição em si. O resultado é um falso positivo quando a consulta na definição da exibição de origem não faz referência às linhas nas tabelas subjacentes que foram alteradas. A taxa de falsos positivos aumenta à medida que uma exibição se torna mais seletiva.

    Quando esta função é referenciada no parâmetro opcional WHEN em uma definição de tarefa, a maior taxa de falsos positivos significa que as tarefas podem ser executadas quando um fluxo de exibição está vazio mais frequentemente do que quando um fluxo de tabela é a entrada para a função. No entanto, esta verificação ainda evita a execução de tarefas quando não há alteração nos dados da tabela subjacente.

  • Chamar esta função em um fluxo evita que ele fique obsoleto, desde que o fluxo esteja vazio e a função SYSTEM$STREAM_HAS_DATA retorne FALSE.

  • Quando essa função retorna TRUE, você deve consumir o fluxo em uma operação DML, seja um falso positivo ou dados de alteração reais. Se você não consumir o fluxo, essa função continuará retornando TRUE, e as tarefas que usam a função na cláusula WHEN não pularão a execução. Isso resulta na execução de tarefas desnecessárias e em encargos do warehouse.

    Para consumir o fluxo de forma eficiente quando o resultado é um falso positivo, por exemplo, a consulta ao fluxo não retorna nenhum registro, use uma instrução como o exemplo a seguir:

    CREATE TEMPORARY TABLE _unused_table AS SELECT * FROM my_stream WHERE 1=0;
    
    Copy

    Esta instrução é contada como uma operação DML que consome o fluxo, porque CREATE TABLE AS SELECT é uma transação DML. A cláusula WHERE 1=0 filtra todos os dados, de modo que nada é processado ou armazenado. Esta operação avança o deslocamento do fluxo, e SYSTEM$STREAM_HAS_DATA retorna FALSE até que novas alterações sejam feitas.

    Se preferir, execute sua lógica de processamento de dados regular, INSERT, UPDATE, MERGE ou outras instruções DML, no fluxo. Isso também consome o fluxo e avança o deslocamento, mesmo quando o fluxo não contém registros de alterações.

Exemplos

create table MYTABLE1 (id int);

create table MYTABLE2(id int);

create stream MYSTREAM on table MYTABLE1;

insert into MYTABLE1 values (1);

-- returns true because the stream contains change tracking information
select system$stream_has_data('MYSTREAM');

+----------------------------------------+
| SYSTEM$STREAM_HAS_DATA('MYSTREAM')     |
|----------------------------------------|
| True                                   |
+----------------------------------------+

 -- consume the stream
begin;
insert into MYTABLE2 select id from MYSTREAM;
commit;

-- returns false because the stream was consumed
select system$stream_has_data('MYSTREAM');

+----------------------------------------+
| SYSTEM$STREAM_HAS_DATA('MYSTREAM')     |
|----------------------------------------|
| False                                  |
+----------------------------------------+
Copy