在应用程序中调用内置例程和视图的最佳实践
为帮助确保成功使用内置例程和视图,建议使用某些编码实践。 这些实践尤其重要,因为随着增强,例程可能会在发行版之间以及发行版中进行更改,例如通过修订包进行更改。
发出查询以使用内置例程或视图检索信息时,请选择特定列,而不是选择具有通配符的所有列。 例如,请勿发出以下查询:
SELECT * FROM TABLE(MON_GET_UNIT_OF_WORK(NULL,-1)) AS t
ORDER BY total_cpu_time DESC 请改为在 SELECT 语句中命名结果列。 此方法使应用程序能够控制结果列的数目以及返回结果列的顺序。 在先前查询的以下重写中,将命名这些列:
SELECT application_handle,
uow_id,
total_cpu_time,
app_rqsts_completed_total,
rqsts_completed_total
FROM TABLE(MON_GET_UNIT_OF_WORK(NULL,-1)) AS t
ORDER BY total_cpu_time DESC如果例程中的列顺序和列数发生更改,那么命名列可防止出现问题。 例程返回的结果列数可能会增加。 例如,如果在例程返回六个结果列时仅提供五个主变量,那么应用程序将中断。
此外,例程的输出参数或结果列的类型和大小可能会更改。 例如,列可能从 VARCHAR (8) 更改为 VARCHAR (128) ,或者 INTEGER 列可能变为 BIGINT 列。 如果您使用的变量太小,那么您从例程接收的数据可能会被截断。
为了保护 C 应用程序免受此类更改的影响,您可以描述预编译语句以确定返回的结果列及其类型和大小。 以下示例显示如何描述预编译语句:
strcpy(strStmt, "SELECT application_handle, uow_id,total_cpu_time
FROM TABLE(MON_GET_UNIT_OF_WORK(NULL,-1))
AS t ORDER BY total_cpu_time DESC");
EXEC SQL PREPARE stmt FROM :strStmt;
EXEC SQL DESCRIBE stmt into :*pSqlda;
有关如何使用 SQL 描述区域 (SQLDA) 中返回的信息的示例,请参阅 samples/c/tbread.sqc 文件中的 RowDatamemoryAlloc 函数。
对于 Java™ 和 .NET 应用程序,您需要了解程序的数据类型和大小,可以使用元数据来确定返回的结果列及其类型和大小,如以下示例中所示:
ResultSet rs = pstmt.executeQuery();
ResultSetMetaData rsms = rs.getMetaData();
有关如何使用结果集的元数据的示例,请参阅 samples/java/jdbc/TbRead.java 文件中的 execPreparedQueryWithUnknownOutputColumn( ) 方法。