类别:

系统函数 (系统信息)

SYSTEM$STREAM_HAS_DATA

指明指定的流是否包含变更数据获取 (CDC) 记录。

语法

SYSTEM$STREAM_HAS_DATA('<stream_name>')
Copy

实参

stream_name

要查询的流的名称。

  • 请注意,整个名称必须放在单引号内,包括数据库和架构(如果名称是完全限定名称),即 '<db>.<schema>.<stream_name>'

  • 如果流名称区分大小写或包含任何特殊字符或空格,则需要使用双引号来处理大小写/字符。双引号必须放在单引号内,即 '"<stream_name>"'

使用说明

  • 此函数旨在用于任务定义中的 WHEN 表达式。如果指定的流不包含任何变更数据,则任务将跳过当前的运行。此检查有助于避免在不必要的情况下启动或恢复仓库。但是,请注意,该函数旨在避免伪阴性(即,即使流包含变更数据,也返回 False 值);但是,该函数 不能 保证避免伪阳性(即,当流不包含变更数据时,返回 True 值)。

  • 此函数执行表版本元数据的差异(在流偏移与当前事务时间之间),以确定流是否包含 CDC 记录。如果该时间段内表的 DML 活动包含已插入、(可选)更新和删除且返回到原始表状态的同一组行,则即使流不包含任何 CDC 记录,此函数也可能返回 TRUE 值。

  • 如果输入是视图流,则当 基础表 的变更数据获取 (CDC) 记录更改时,返回值为 TRUE。该函数对基础表的版本元数据执行差异,而不是对视图本身执行差异。当源视图定义中的查询未引用已更改的基础表中的行时,结果是伪阳性。伪阳性率随着视图的选择性增加而增加。

    当在任务定义的可选 WHEN 参数中引用此函数时,较高的伪阳性率意味着,任务更可能在视图流为空时运行,而不是在表流是函数的输入时运行。但是,当基础表数据没有更改时,此检查仍会避免任务运行。

示例

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
语言: 中文