oracle - 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.
解决方案
会话全局变量可以由在同一 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"
推荐阅读
- c - printf 格式说明符的参数类型和 printf 格式说明符的额外参数类型无效
- ms-access - 如何压缩重复记录并获取数据元素的主要值?
- webpack - BigCommerce Checkout window.stencilBootstrap 不是函数
- xcode - Xcode 助手编辑器被锁定
- bash - 将环境变量传递给 jenkins 管道 bash 脚本
- r - 按字符加入 dplyr 中的数据帧
- python - 如何创建叶图
- android - 在 Android 中有没有办法查看/更改电池输出功率和频率
- c# - 自动签署所有编译的输出文件
- angular - 使用角度服务在多个组件中设置超时