在 Linux 上的 Db2 v11.5 中,我想创建变量,然后在 SELECT 语句中使用此变量。我不想在数据库上创建过程或函数,我只想从 db2cmd 或某些数据库工具在动态 SQL 中执行此操作。
简化示例:
BEGIN
DECLARE name VARCHAR(10);
SET name = 'John';
SELECT * FROM SYSIBM.SYSDUMMY1 WHERE name = :name;
END;
编辑: 为什么我不想创建存储过程/函数?我每半年对几个数据库的数据库权限/授权进行一次审计,由于严格的安全设置,我没有在某些数据库上创建过程的权限。在大多数情况下,我只能访问系统目录表,这完全足够让我创建审计。我列出数据库用户,然后对于“可疑”用户,我执行完整的权限/权限检查,从系统目录中执行几个 SQL。到目前为止,对于每个用户,我都使用过文本编辑器并使用查找/替换,这是一个不错的解决方案,但变量是更好的解决方案。谢谢!
您的问题显示了用法
:variable-name
,但该语法仅在嵌入式 SQL 或 Oracle 模式下可用(如果您的 Db2 实例和 Db2 数据库启用了该功能)。另外,一些客户端工具(来自第三方)允许使用变量编写脚本,但它只有在使用这些特定工具时才有效,即不适用于 Db2-CLP。
一般来说,创建例程(用户定义函数或存储过程)是更明智的选择。不清楚你为什么要避免这个选项。
您可以使用全局变量(更简单,限制更少,但具有全局变量的所有缺点),也可以使用匿名块(Db2 中有很多限制)。
但是匿名块不会让您直接看到 SELECT 的输出,您需要在块外执行 SELECT。IBM 记录了有关 的各种限制,
compound-sql(inlined)
有关详细信息,请参阅 Db2 知识中心中的文档。使用全局变量(此示例使用 Linux 上的 Db2 CLP):
使用复合 SQL(内联)匿名块(使用 Linux 上的 Db2 CLP),这里有一种方法可以通过会话表来实现(其他方法也是可能的):