SQLEXEC
有效对象
提取和复制
说明
使用 SQLEXEC 参数在 Oracle GoldenGate 处理的上下文中执行存储过程、查询或数据库命令。借助 SQLEXEC,Oracle GoldenGate 可以直接与数据库通信,以执行数据库支持的任何工作。此工作可以是同步流程的一部分,例如检索列转换的值,也可以独立于提取或复制数据,例如执行在数据库中执行操作的存储过程。
注:SQLEXEC 提供最少的全球化支持。要在源捕获的捕获参数文件中使用 SQLEXEC,请确保源 .prm 文件中的客户机字符集是源数据库字符集的相同字符集或超集。
SQLEXEC 的工作方式如下:
-
作为参数文件的根级别的独立语句,用于执行 SQL 存储过程或查询或执行数据库命令。作为独立语句,
SQLEXEC在 Oracle GoldenGate 处理期间独立于TABLE或MAP语句执行。在独立的SQLEXEC参数中使用时,查询或过程不能包括参数。请参见“独立SQLEXEC”。 -
作为
TABLE或MAP参数的一部分,用于执行存储过程或者使用或不使用参数进行查询。与参数一起使用时,执行的过程或查询可以接受来自源或目标行的输入参数并传递输出参数。请参见“TABLE或MAP参数中的SQLEXEC”。 -
在远程捕获用例中,使用
SQLEXEC可能会引入额外的延迟,因为必须为提取处理的每个记录串行执行SQLEXEC操作。如果远程中心提取执行需要SQLEXEC的特殊筛选,并且性能影响太严重,则可能需要将提取进程移到源数据库附近。注意:对数据库(尤其是对生产数据库)执行SQLEXEC过程时,请务必小心。该过程提交的任何更改都会导致覆盖现有数据。
注:SQLEXECONBEFOREIMAGE 参数支持对“图像前”记录执行 SQLEXEC。
注意:当 EXEC 类型为 TRANSACTION、SOURCEROW 或 ONCE 时,在 PK 更新或统一更新记录上将忽略 SQLEXECONBEFOREIMAGE 参数。
独立 SQLEXEC
独立 SQLEXEC 参数是在参数文件的根级别使用的参数,并且独立于 TABLE 或 MAP 参数执行操作。以下是使用独立 SQLEXEC 参数的准则。
-
独立
SQLEXEC语句按照其在参数文件中相对于其他参数的显示顺序执行。 -
SQLEXEC过程或查询必须包含所有异常处理。 -
在执行
SQLEXEC语句时,查询或过程必须结构正确,并且数据库具有合法的 SQL 语法;否则,无论存在任何错误处理规则,复制都将异常终止。有关允许的 SQL 语法,请参阅数据库供应商提供的 SQL 参考指南。 -
Oracle GoldenGate 用户的数据库身份证明必须位于
SQLEXEC子句之前。对于“提取”,请根据数据库的需要使用USERIDALIAS参数。对于 Replicat,请根据需要使用USERIDALIAS参数。 -
Oracle GoldenGate 进程使用的数据库身份证明是执行 SQL 的数据库身份证明。此身份证明必须具有执行命令和存储过程以及调用数据库提供的过程的权限。
-
独立的
SQLEXEC语句不能用于从记录获取输入参数或传递输出参数。通过在TABLE或MAP语句中使用SQLEXEC语句,可以对参数使用存储过程和查询。请参见“TABLE或MAP参数中的SQLEXEC”。 -
在 Oracle GoldenGate 进程启动之前,受独立
SQLEXEC语句影响的所有对象都必须存在。因此,必须对这些对象禁用DDL支持;否则,DDL操作可能会在对对象执行SQLEXEC过程或查询之前更改或删除该对象的结构。 -
对象名称必须采用两部分或三部分名称格式进行完全限定。
-
对于 z/OS 上的 Db2,Oracle GoldenGate 使用 ODBC
SQLExecDirect函数动态执行 SQL 语句。每次执行 SQL 语句时,ODBC 都会按指定间隔对其进行准备。要支持此功能,必须将连接的数据库服务器配置为动态准备 SQL。有关更多信息,请参见 z/OS 文档的 Db2。
获取有关使用独立 SQLEXEC 的更多信息
有关如何使用 SQLEXEC 的更多信息,请参见 Use SQLEXEC to Execute Commands,Stored Procedures,and Queries 。
独立 SQLEXEC 的语法
SQLEXEC
{'call <procedure_name>()' | '<SQL_query>' | '<database_command>'}
[EVERY <n> {SECONDS | MINUTES | HOURS | DAYS}]
[ONEXIT]
[, THREADS (<threadID>[, <threadID>][, ...][, <thread_range>[, <thread_range>][, ...])]
调用 <procedure_name ()'>
指定要执行的存储过程的名称。将语句用单引号引起来。call 关键字是必需的。以下是使用独立 SQLEXEC 执行过程的示例:
SQLEXEC 'call prc_job_count ()'
<'SQL_query'>
指定要执行的查询的名称。将查询用单引号引起来。以数据库所需的相同格式指定区分大小写的对象名称。以下是使用独立 SQLEXEC 执行查询的示例:
SQLEXEC ' select x from dual '
对于多行查询,在每行上使用单引号。为了获得最佳效果,请在每个开始引号之后和每个结束引号之前(或至少在每个结束引号之前)键入空格。
<'database_command'>
执行数据库命令。以下是使用独立 SQLEXEC 执行数据库命令的示例:
SQLEXEC 'SET TRIGGERS OFF'
EVERY <n> {SECONDS | MINUTES | HOURS | DAYS}
导致按定义的间隔执行独立存储过程和查询,例如:
SQLEXEC 'call prc_job_count ()' EVERY 30 SECONDS
间隔必须为整数,正整数。
ONEXIT
在 Extract 或 Replicat 进程适度停止时执行 SQL,例如:
SQLEXEC 'call prc_job_count ()' ONEXIT
THREADS (<threadID>[, <threadID>][, ...][, <thread_range>[, <thread_range>][, ...])
仅为协调 Replicat 的指定线程执行 SQLEXEC。
<threadID>[, <threadID>][, ...]
指定一个线程 ID,或以 threadID, threadID, threadID 格式指定逗号分隔的线程列表。
[, <thread_range>[, <thread_range>][, ...]
以 threadIDlow-threadIDhigh 形式指定线程范围,或以 threadIDlow-threadIDhigh,threadIDlow-threadIDhigh 格式指定的逗号分隔的范围列表。
允许组合使用这些格式,例如 threadID、threadID、threadIDlow-threadIDhigh。
如果未使用 THREADS 子句,则 SQL 将由 ADD REPLICAT 命令为此 Replicat 组配置的所有线程执行。但是,如果 SQL 满足屏障事务处理的条件,则无论实际的线程映射如何,线程 0 都处理整个 SQLEXEC 语句。
TABLE 或 MAP 参数中的 SQLEXEC
TABLE 或 MAP 参数中的 SQLEXEC 参数可用于执行不接受参数的存储过程或查询。以下是 MAP 或 TABLE 语句中使用的 SQLEXEC 相关项和限制:
-
SQL 由运行 Oracle GoldenGate 进程的数据库用户执行。此用户必须具有执行存储过程和调用数据库提供的过程的权限。
-
执行
SQLEXEC语句时,查询或过程必须结构正确。如果 Replicat 遇到查询或过程的问题,尽管存在任何错误处理规则,但该进程会立即异常终止。有关允许的 SQL 语法,请参阅数据库供应商提供的 SQL 参考指南。 -
复制事务对目标数据库的
COMMIT操作还会提交在原始源事务边界内的SQLEXEC语句中所做的任何DML更改。这对“提取”不适用,因为“提取”不执行 SQL 事务处理。将SQLEXEC用于提取时,可以在SQLEXEC过程中启用隐式提交或执行显式提交。 -
用单引号指定文字。按照在数据库中指定区分大小写的对象名称的方式指定这些对象名称。
-
请勿使用
SQLEXEC更改主键列的值。主键值从“提取”传递到“复制”。如果没有它,复制操作将无法完成。如果必须使用SQLEXEC更改主键值,则可以通过将原始键值映射到另一列,然后将该列定义为使用TABLE和MAP参数的KEYCOLS选项的替代键来避免错误。 -
对于 z/OS 上的 Db2,Oracle GoldenGate 使用 ODBC
SQLExecDirect函数动态执行 SQL 语句。每次执行 SQL 语句时,ODBC 都会按指定间隔对其进行准备。要支持此功能,必须将连接的数据库服务器配置为动态准备 SQL。有关更多信息,请参见 z/OS 文档的 Db2。 -
使用 Oracle GoldenGate 复制
DDL时,在执行 SQL 之前,受存储过程或查询影响的所有对象都必须具有正确的结构。因此,在SQLEXEC执行之前,必须对这些影响结构的对象(例如CREATE或ALTER)执行DDL。 -
SQLEXEC语句中的所有对象名称都必须使用其两部分或三部分名称(对于数据库而言)进行完全限定。 -
请勿对数据泵提取组在直通模式下处理的表使用
SQLEXEC。 -
SQLEXEC支持以下数据类型作为输入和输出参数。-
数值数据类型
-
日期数据类型
-
字符数据类型
-
-
由协调复制执行时,
SQLEXEC由使用MAP语句的THREAD或THREADRANGE选项指定的线程执行。However, if theSQLEXECis specified in aMAPparameter that contains theCOORDINATEDkeyword, it is executed as a barrier transaction automatically by the thread with the lowestIDnumber, regardless of the actual thread mapping.
TABLE 或 MAP 中 SQLEXEC 的语法
SQLEXEC (
{SPNAME <procedure_name>[, ID <logical_name>] |
ID <logical_name>, QUERY ' <SQL_query> '}
{, PARAMS [OPTIONAL | REQUIRED] <parameter_name> = {<source_column> | <OGG_function>} |
NOPARAMS}
[, AFTERFILTER | BEFOREFILTER]
[, ALLPARAMS {OPTIONAL | REQUIRED}]
[, ERROR {IGNORE | REPORT | RAISE | FINAL | FATAL}]
[, EXEC {MAP | ONCE | TRANSACTION | SOURCEROW}][, MAXVARCHARLEN <bytes>]
[, PARAMBUFSIZE <bytes>]
[, TRACE]
[, ...]
[, BEFORE_col1 = @BEFORE(col1),
)
SPNAME <procedure_name>[, ID <logical_name>]
执行存储过程。
SPNAME <procedure_name>
指定要执行的过程的名称。
以下示例显示了名为 lookup 的存储过程的单个执行。在这种情况下,将使用过程的实际名称。不需要逻辑名称。
SQLEXEC (SPNAME lookup), PARAMS (param1 = srccol)), &
COLMAP (targcol = lookup.param1);
ID <logical_name>
定义过程的可选逻辑名称。例如,名为 lookup 的过程的逻辑名称可以是 lookup1、lookup2 等。使用此选项可在 MAP 语句中多次执行该过程。每个 MAP 语句最多可以执行 20 次过程。执行一次过程时,不需要 ID。
以下示例显示了如何使用 ID 选项启用从查找表中获取值的存储过程的多次执行。值将映射到目标列。
SQLEXEC (SPNAME lookup, ID lookup1, &
PARAMS (long_name = current_residence_state)), &
SQLEXEC (SPNAME lookup, ID lookup2, &
PARAMS (long_name = birth_state)), &
COLMAP (custid = custid, current_residence_state_long = lookup
1.long_name, & birth_state_long = lookup2.long_name);
`ID
执行查询。
ID <logical_name>
定义查询的逻辑名称。需要提供逻辑名称,以便从查询结果中提取值。<ID logical_name> 引用查询返回的列值。
QUERY '<SQL_query>'
指定要对数据库执行的 SQL 查询语法。该查询可以返回带有 SELECT 语句的结果,也可以执行 INSERT、UPDATE 或 DELETE 语句。SELECT 语句应仅返回一行。如果返回多行,则仅处理第一行。不要为任何 SELECT statements.The 查询指定 INTO ... 子句,对于要对其执行查询的数据库,标准查询语言必须有效。大多数查询都需要输入参数的占位符。在查询中指定参数的方式取决于数据库类型,如下所示:
- 对于 Oracle,输入参数是通过使用冒号 (:) 后跟参数名称来指定的,如以下示例所示。
'SELECT NAME FROM ACCOUNT WHERE SSN = :SSN AND ACCOUNT = :ACCT'
- 对于其他数据库,输入参数通过使用问号来指定,如下例所示。
'SELECT NAME FROM ACCOUNT WHERE SSN = ? AND ACCOUNT = ?'
查询必须包含在一行单引号内。任何数据库的参数名称周围不需要引号。
以下示例分别说明了 SQLEXEC 查询用于 Oracle 和 SQL Server 查询。
Oracle 示例:
MAP sales.account, TARGET sales.newacct, &
SQLEXEC (ID lookup, &
QUERY 'select desc_col into desc_param from lookup_table &
where code_col = :code_param', &
PARAMS (code_param = account_code)), &
COLMAP (newacct_id = account_id, newacct_val = lookup.desc_param);
SQL Server 示例:
MAP sales.account, TARGET sales.newacct, &
SQLEXEC (ID lookup, &
QUERY 'select desc_col into desc_param from lookup_table &
where code_col = ?', &
PARAMS (p1 = account_code)), &
COLMAP (newacct_id = account_id, &
newacct_val = lookup.desc_param);
PARAMS [OPTIONAL | REQUIRED] <parameter_name> = {<source_column> | <OGG_function>} | NOPARAMS
定义过程或查询是否接受参数,如果是,则将参数映射到输入源。必须使用 PARAMS 子句或 NOPARAMS。
OPTIONAL |
REQUIRED |
确定在缺少参数值时是否执行过程或查询。
OPTIONAL 指示 SQL 执行不需要参数值。如果数据库操作中缺少必需的源列,或者由于缺少源列而无法成功完成列转换函数,则 SQL 仍会执行。OPTIONAL 是除 Oracle 以外的所有数据库的默认值。对于 Oracle,在检索存储过程定义时,是否自动确定参数是可选的。
REQUIRED 指示必须存在参数值。如果参数值不存在,则不会执行 SQL。
<parameter_name> = {<source_column> | <OGG_function>}
将参数的名称映射到提供输入的列或函数。SQLEXEC 支持以下数据类型作为输入和输出参数。
-
数值数据类型
-
日期数据类型
-
字符数据类型
<parameter_name> 是以下值之一:
-
对于存储过程,它是过程中可以接受输入的任何参数的名称。
-
对于 Oracle 查询,它是查询中任何输入参数的名称(不包括前导冒号)。例如,
:vemplid将在PARAMS子句中指定为vemplid。Oracle 允许为输入参数命名任何逻辑名称。
SQLEXEC (ID appphone, QUERY ' select per_type from ps_personal_data '
' where emplid = :vemplid '
' and per_status = 'N' and per_type = 'A' ',
PARAMS (vemplid = emplid)),
TOKENS (applid = @GETVAL(appphone.per_type));
- 对于非 Oracle 查询,它是
P <n>,其中<n>是语句中参数的编号,从 1 开始。例如,在具有两个参数的查询中,<parameter_name>项为p1 and p2。考虑数据库是要求p大写还是小写。
SQLEXEC (ID appphone, QUERY ' select per_type from ps_personal_data '
' where emplid = ? '
' and per_status = 'N' and per_type = 'A' ',
PARAMS (p1 = emplid)),
TOKENS (applid = @GETVAL(appphone.per_type));
<source_column> 是提供输入的源列的名称。默认情况下,如果日志中不存在指定的列(因为记录仅包含已更新的列的值),则参数将采用该过程或查询为该参数指定的任何默认值。
<OGG_function> 是为提供输入而执行的 Oracle GoldenGate 列转换函数的名称。请参阅“表和列映射函数”。
要将存储过程中的输出值或查询作为输入传递到 FILTER 或 COLMAP 子句,请使用以下语法:
{<procedure_name> | <logical_name>}.<parameter>
其中:
-
<procedure_name>是存储过程的实际名称,它必须与SQLEXEC语句中为SPNAME提供的值匹配。仅当在 Oracle GoldenGate 运行过程中执行一次过程时,才使用此参数。 -
<logical_name>是使用SQLEXEC的ID选项指定的逻辑名称。当过程在MAP语句中多次执行时,可使用此参数从查询或存储过程的实例传递输入值。 -
<parameter>是参数的名称,如果提取返回的值,则为RETURN_VALUE。默认情况下,输出值以每个参数 255 字节的形式被截断。如果输出参数必须更长,请使用MAXVARCHARLEN选项。注意:作为上述语法的替代方法,您可以使用@GETVAL函数。
以下示例适用于一组 Oracle 源表和目标表以及查找表。这些示例说明如何为存储过程的单个实例和存储过程的多个实例传递表的参数。
源表客户:
custid Number
current_residence_state Char(2)
birth_state Char(2)
目标表 cust_extended:
custid Number
current_residence_state_long Varchar(30)
birth_state_long Varchar(30)
查找表 state_lookup
abbreviation Char(2)
long_name Varchar(30)
以下示例显示了如何使用执行一次的存储过程从查找表中获取值。在处理 cust 表中的记录时,Oracle GoldenGate 将在执行列映射之前执行 lookup 存储过程。过程中的 long_name 参数接受来自 birth_state 源 column.The 值的输入映射到 COLMAP 语句中的目标列 birth_state_long。
MAP sales.cust, TARGET sales.cust_extended, &
SQLEXEC (SPNAME lookup, &
PARAMS (long_name = birth_state)), &
COLMAP (custid = custid, &
birth_state_long = lookup.long_name);
以下示例显示了如何使用 ID 选项启用从查找表中获取值的存储过程的多次执行。值将映射到目标列。
MAP sales.cust, TARGET sales.cust_extended, &
SQLEXEC (SPNAME lookup, ID lookup1, &
PARAMS (long_name = current_residence_state)), &
SQLEXEC (SPNAME lookup, ID lookup2, &
PARAMS (long_name = birth_state)), &
COLMAP (custid = custid, current_residence_state_long = lookup1.long_name, & birth_state_long = lookup2.long_name);
AFTERFILTER |
BEFOREFILTER |
使用 AFTERFILTER 和 BEFOREFILTER 指定何时执行与 MAP 语句的 FILTER 子句相关的存储过程或查询。
AFTERFILTER
使 SQL 在 FILTER 语句之后执行。这样可以跳过执行 SQL 的开销,除非筛选器成功。这是默认设置。
BEFOREFILTER
导致 SQL 在 FILTER 语句之前执行,因此结果可以在筛选器中使用。
下面是使用 BEFOREFILTER 的示例。
SQLEXEC (SPNAME check, NOPARAMS, BEFOREFILTER)
ALLPARAMS [OPTIONAL |
REQUIRED] |
使用 ALLPARAMS 作为全局规则,确定存储过程或查询是否必须存在所有指定的参数才能执行。在 PARAMS 子句中建立的各个参数的规则将覆盖使用 ALLPARAMS 的全局规则集。
OPTIONAL
允许 SQL 执行是否存在所有参数。这是默认设置。
REQUIRED
需要提供所有参数,SQL 才能执行。
下面是使用 OPTIONAL 的示例。
SQLEXEC (SPNAME lookup,
PARAMS (long_name = birth_state, short_name = state),
ALLPARAMS OPTIONAL)
ERROR {IGNORE |
REPORT |
RAISE |
FINAL |
FATAL} |
使用 ERROR 定义对与存储过程或查询关联的错误的响应。如果没有显式错误处理,Oracle GoldenGate 进程将异常终止。确保您的过程向进程返回错误并使用 ERROR 指定响应。
使用 Oracle GoldenGate 21c,该功能允许您根据 SQL 错误类型指定不同的行为。
以下示例演示了在执行存储过程查找时检测到 SQL 错误代码 1403 或 1405 的异常终止 ER 进程。将报告所有其他错误并继续复制。
SQLEXEC ( SPNAME lookup,
PARAMS( long_name = birth_state, short_name = state),
ERROR REPORT, ERROR FATAL (1403, 1405) );
IGNORE
导致 Oracle GoldenGate 忽略与存储过程或查询关联的所有错误并继续处理。任何生成的参数提取都会导致“列缺失”条件。这是默认设置。
REPORT
确保与存储过程或查询关联的所有错误都报告到放弃文件。该报告可用于跟踪错误原因。它既包括错误说明,也包括传递给过程或查询的参数值。报告错误后,Oracle GoldenGate 将继续处理。
RAISE
根据 REPERROR 参数设置的规则处理错误。在处理错误之前,Oracle GoldenGate 将继续处理与当前 MAP 语句关联的其他存储过程或查询。
FINAL
与 RAISE 类似,只是当遇到与过程或查询关联的错误时,会绕过剩余的存储过程和查询。错误处理在错误之后立即调用。
FATAL
导致 Oracle GoldenGate 在遇到与过程或查询关联的错误时立即异常终止。
EXEC {MAP |
ONCE |
TRANSACTION |
SOURCEROW} |
使用 EXEC 控制 MAP 语句中存储过程或查询的执行频率,以及提取输出参数时将结果视为有效的时间。
MAP
对为其指定的每个源 - 目标表映射执行该过程或查询一次。使用 MAP 会使结果对具有相同源表的任何后续映射无效。缺省值为 MAP。
以下示例显示了不正确的使用 MAP 缺省值。由于 MAP 是缺省值,因此无需在 SQLEXEC 语句中显式列出它。在此示例中,源表在单独的 MAP 参数中映射到两个不同的目标表。在这种情况下,结果仅对第一个映射有效。过程 lookup 的结果将在执行第二个 MAP 参数时过期,而第二个 MAP 将导致“列缺失”条件。要正确实现这一点以便每个 MAP 返回有效结果,应使用 SOURCEROW。
MAP sales.srctab, TARGET sales.targtab, &
SQLEXEC (SPNAME lookup, PARAMS (param1 = srccol)), &
COLMAP (targcol = lookup.param2);
MAP sales.srctab, TARGET sales.targtab2, &
COLMAP (targcol2 = lookup.param2);
ONCE
首次调用关联的 MAP 语句时,在 Oracle GoldenGate 运行过程中执行一次过程或查询。只要该处理仍在运行,结果就会保持有效。
下面是使用 ONCE 的示例。
MAP sales.cust, TARGET sales.cust_extended, &
SQLEXEC (SPNAME lookup, PARAMS (long_name = birth_state), EXEC ONCE), &
COLMAP (custid = custid, &
birth_state_long = lookup.long_name);
TRANSACTION
对每个源事务处理执行该过程或查询一次。结果对于事务处理的所有操作仍然有效。
下面是使用 TRANSACTION 的示例。
MAP sales.cust, TARGET sales.cust_extended, &
SQLEXEC (SPNAME lookup, PARAMS (long_name = birth_state), EXEC TRANSACTION), &
COLMAP (custid = custid, &
birth_state_long = lookup.long_name);
SOURCEROW
按源行操作执行该过程或查询一次。在将源表与多个目标表同步时使用此选项,以便为每个源 - 目标映射调用过程或查询的结果。
下面是使用 SOURCEROW 的示例。在这种情况下,第二个映射返回一个有效值,因为该过程在每个源行操作上执行。
MAP sales.srctab, TARGET sales.targtab, &
SQLEXEC (SPNAME lookup, PARAMS (param1 = srccol), EXEC SOURCEROW), &
COLMAP (targcol = lookup.param2);
MAP sales.srctab, TARGET sales.targtab2, &
COLMAP (targcol2 = lookup.param2);
MAXVARCHARLEN <bytes>
使用 MAXVARCHARLEN 指定为存储过程或查询中任何参数的输出值分配的最大字节长度。超过此最大值后,输出值将被截断。缺省值为 255 字节,不带显式 MAXVARCHARLEN 子句。有效值范围为 50 到 32767 字节。
以下示例将输出值的字节长度限制为 100。
MAXVARCHARLEN 100
PARAMBUFSIZE <bytes>
使用 PARAMBUFSIZE 指定存储 SQLEXEC 参数信息的内存缓冲区允许的最大字节数,包括输入和输出参数。缺省值为 10,000 字节,不带显式 PARAMBUFSIZE 子句。有效值范围为 1000 到 2000000 字节。每当为参数分配的内存在最大值的 500 字节内时,Oracle GoldenGate 都会发出警告。
以下示例将缓冲区增加到 15,000 字节。
PARAMBUFSIZE 15000
TRACE {ALL |
ERROR} |
使用 TRACE 将 SQLEXEC 输入和输出参数记录到报告文件中。
下面是启用了 SQLEXEC 跟踪的示例报告文件:
Input parameter values...
LMS_TABLE: INTERACTION_ATTR_VALUES
KEY1: 2818249
KEY2: 1
Report File:
From Table MASTER.INTERACTION_ATTR_VALUES to MASTER.INTERACTION_ATTR_VALUES:
# inserts: 0
# updates: 0
# deletes: 0
# discards: 1
Stored procedure GGS_INTERACTION_ATTR_VALUES:
attempts: 2
successful: 0
ALL
将每次调用过程或查询的输入和输出参数写入到报告文件中。这是默认设置。
ERROR
仅在发生 SQL 错误后,才将每次调用过程或查询的输入和输出参数写入报表文件。