【问题标题】:How to include ' in dynamic query?如何在动态查询中包含'?
【发布时间】:2019-05-30 06:08:25
【问题描述】:

我需要生成这样的查询

SELECT max(batch_sk) INTO ln_batch FROM test_app.table WHERE categ_cd = 'ABC' ;

这个“ABC”将作为过程(in_code)中的输入参数出现。 我尝试了下面提到的查询的不同版本,但没有得到正确的查询。

SET lv_query ='SELECT max(batch_sk) INTO ln_batch FROM test_app.table WHERE categ_cd = ''''||in_code||'';

如何在查询中包含那些 '?

【问题讨论】:

  • 字符串中的引号必须加倍:'SELECT max(batch_sk) INTO ln_batch FROM test_app.table WHERE categ_cd = '''||in_code||''''
  • 非常感谢您的澄清。包含时间戳列是否有任何特定规则?我在程序开始时选择了这个。选择 CURRENT_TIMESTAMP(0) 进入 ld_start_ts ;然后我试图在程序结束时更新 - SET lv_query ='UPDATE test_abc SET seq_nr='||ln_seq_nr||' , start_ts='''ld_start_ts ''' where Categ_Cd='''||lv_categ_cd||'''' ;如果时间戳存在,则在编译时抛出错误。
  • COMPILE TIME ERROR : 编译时报错 ---------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------- SPL1026:E(L606),无效或缺少表达式'E(5407):日期时间或间隔的无效操作。'。

标签: dynamic teradata


【解决方案1】:

这里有几个问题。

  1. 不匹配/未转义的引号
  2. 连接对字符串进行操作,并且没有隐式 从 TIMESTAMP 到 VARCHAR 的转换。您需要先使用明确的CASTTO_CHAR 等进行转换
  3. SELECT … INTO 不允许作为动态 SQL。也许是带有主变量的参数化静态 SQL?

    SELECT max(batch_sk) INTO ln_batch FROM test_app.table WHERE categ_cd=:in_code;

    否则你需要一个动态游标来提供值作为文字

    DECLARE lv_cur CURSOR for lv_stmt;
    SET lv_query ='SELECT max(batch_sk) FROM test_app.table WHERE categ_cd = '''||in_code||'''';
    PREPARE lv_stmt FROM lv_query;
    OPEN lv_cur;
    FETCH  lv_cur INTO ln_batch;
    CLOSE lv_cur;
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-28
    • 2014-05-19
    • 2022-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多