db2 z/os 在动态查询中转换简单查询

Posted

技术标签:

【中文标题】db2 z/os 在动态查询中转换简单查询【英文标题】:db2 z/os transform simple query in dynamic query 【发布时间】:2014-08-26 10:18:57 【问题描述】:

我想在动态查询中转换一个简单的查询,直接传递一些变量。 查询可能是这样的:

SELECT * FROM mySchema.THETABLE a 
WHERE a.THECOLUMN = 'someVariable';

所以,我尝试了这样的事情:

DECLARE v_schema varchar(7);
DECLARE v_param1 varchar(200);
DECLARE v_sqlstr varchar(2000);

SET v_schema = 'mySchema';
SET v_param1 = 'someVariable';

SET v_sqlstr = 'SELECT * FROM ' 
   || v_schema 
   || '.THETABLE a WHERE a.THECOLUMN = ''' 
   || v_param1 
   || ''';

execute sql v_sqlstr;

如何做到这一点? 当我在 dbvisualizer 命令窗口中尝试这种类型的代码时,我得到了错误:

[DECLARE - 0 row(s), 0.000 secs]  
[Error Code: -199, SQL State: 42601]  
DB2 SQL Error: SQLCODE=-199, SQLSTATE=42601, SQLERRMC=VARCHAR;
TABLE STATEMENT , . SCROLL INSENSITIVE SENSITIVE ASENSITIVE NO, DRIVER=4.15.82

【问题讨论】:

尝试在execute sql v_sqlstr; 行之前打印v_sqlstr 的输出,以便我们可以看到发生了什么 但错误似乎与“DECLARE”有关。我想我错过了这个块的语法......我是 z/os 的新手...... SQLERRMC=VARCHAR 表示它在抱怨varchar 位,它需要错误最后一行的关键字之一。这是在begin/end 内吗? 我试着把BEGIN/END,BEGIN ATOMIC/END...当我添加BEGIN时,它给了我这个错误:[BEGIN - 0 row(s), 0.000 secs] [Error Code: -104, SQL State: 42601] DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=CODICEBANCA;SECTION, DRIVER=4.15.82 [DECLARE - 0 row(s), 0.000 secs] [Error Code: -199, SQL State: 42601] DB2 SQL Error: SQLCODE=-199, SQLSTATE=42601, SQLERRMC=VARCHAR;TABLE STATEMENT , . SCROLL INSENSITIVE SENSITIVE ASENSITIVE NO, DRIVER=4.15.82 【参考方案1】:

试试这个:

DECLARE
   v_schema varchar(7);
   v_param1 varchar(200);
   v_sqlstr varchar(2000);
BEGIN

  v_schema := 'mySchema';
  v_param1 := 'someVariable';

SET v_sqlstr = 'SELECT * FROM ' 
   || v_schema 
   || '.THETABLE a WHERE a.THECOLUMN = ''' 
   || v_param1 
   || ''';

execute sql v_sqlstr;
END;

the link here 中的 Begin/End 代码块的更详细示例

【讨论】:

【参考方案2】:

DbVisualizer 使用分号作为语句分隔符。在执行包含分号作为代码一部分的代码块时,您需要注意。如果编辑器只包含代码块,最简单的方法是使用 SQL Commander->Execute Buffer 运行,因为这会将完整的脚本传递给数据库并在不进行任何解析的情况下运行它。

有多种解决方案,您可以在这里找到它们:

http://confluence.dbvis.com/display/UG91/Executing+Complex+Statements

【讨论】:

谢谢罗杰,我想应该是这样的。现在我必须了解正确的语法...

以上是关于db2 z/os 在动态查询中转换简单查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 like 谓词(模式匹配)对 DB2 Z/oS 的 SQL 查询进行性能调优

查询以选择具有特定最后一列的所有表 Ibm Db2 z/os

DB2 v8 for z/OS 中的交叉连接

对 DB2 for z/OS 的存储过程调用中不支持字符串文字

DB2 Z/OS:查找表中缺失的数据

嵌套表表达式不适用于 db2 z/OS