首页 > 解决方案 > DB2 CLP 在 .sql 文件中传递变量

问题描述

由于我的 shell 脚本使用超长 SQL 语句多次调用 Db2,我想从脚本中抽象出 SQL 语句并将它们放入一个.sql文件中,然后从 Db2 命令行处理器运行它db2 -f xxx.sql

我希望某些 SQL 语句使用从 shell 脚本传入的变量。

有没有像 Oracle 的方法可以通过'&1'sqlplus在文件中传递变量?.sql

xxx.sql
SELECT * FROM TABLE_A WHERE FIELD_B > &1

CLP
db2 -f xxx.sql 999

这将返回 DB21004E 错误:

DB21004E  You cannot specify both an input file and a command when invoking
the Command Line Processor.

标签: oracleshelldb2clp

解决方案


会话全局变量可以由在同一 Db2 会话/连接句柄中执行的不同 SQL 语句和脚本进行初始化和引用。这是一个 Db2 SQL 功能,可以在 CLP、clpplus、存储过程、内联/复合 SQL 块以及任何带有 Db2 客户端驱动程序的编程语言中工作。

变量本身是数据库中的永久对象,只需要创建一次。它的名称和数据类型将对数据库中的所有授权用户可见,但存储在变量中的值对于每个连接都是私有的。

首先,创建变量。这只需要执行一次。

db2 "CONNECT TO DBNAME"
db2 "CREATE VARIABLE UTIL.FIELDBMINVALUE INTEGER"

在您的 SQL 脚本中,引用变量而不是文字值。该脚本不能包含任何CONNECT语句,因为这会破坏当前会话。

-- xxx.sql
SELECT * FROM TABLE_A WHERE FIELD_B > UTIL.FIELDBMINVALUE

在运行 SQL 脚本之前,连接到数据库并初始化变量。

db2 "CONNECT TO DBNAME"
db2 "SET UTIL.FIELDBMINVALUE = 999"
db2 -f xxx.sql
db2 "CONNECT RESET"
db2 "TERMINATE"

推荐阅读