【发布时间】:2021-03-15 16:39:02
【问题描述】:
假设我们有一个 Teradata 表 db.queries,其中准备好的语句作为 CLOB 存储在 statement_code 中,例如该字段的内容可能如下所示:
INSERT INTO DATA.TABLE
(ID, JOB_NAME, DATE)
VALUES(1, 'TEST_JOB', CAST(CURRENT_DAY AS DATE FORMAT 'YYYYMMDD')='$currentDay');
我们有一个存储过程,它读取这些数据,然后使用以下代码执行它:
SELECT statement_code
FROM db.queries
WHERE ACTIVE_FLAG = 1
INTO SQL_QRY;
EXECUTE IMMEDIATE SQL_QRY;
这失败了,因为在 SQL_QRY 中提取的 statement_code 现在已经转义了单引号。
Syntax error, expected something like '')'' or '','' between a string or a Unicode character literal and the word ''YYYYMMDD''.
从 SQL_QRY 返回的字符串是:
INSERT INTO DATA.TABLE
(ID, JOB_NAME, DATE)
VALUES(1, ''TEST_JOB'', CAST(CURRENT_DAY AS DATE FORMAT ''YYYYMMDD'')=''$currentDay'');
相对于存储的statement_code:
INSERT INTO DATA.TABLE
(ID, JOB_NAME, DATE)
VALUES(1, 'TEST_JOB', CAST(CURRENT_DAY AS DATE FORMAT 'YYYYMMDD')='$currentDay');
我们尝试在变量设置中使用OREPLACE 无济于事。该函数可以将双单引号替换为任何字符,但单引号除外。
通过转储各种测试组合:
OREPLACE(SQL_QRY, '''''', '*') --replaces to *
OREPLACE(SQL_QRY, '''', '*') --replaces to *
OREPLACE(SQL_QRY, '''', '') --get rids of quotes completely
OREPLACE(SQL_QRY, '''''', '''') --leaves the double quotes
有没有办法克服这种麻烦或实现目标的正确方法是什么?检索准备好的语句并执行它们?
亲切的问候
【问题讨论】:
-
你能显示
statement_code中返回的实际字符串吗? -
你这样做怎么样? :
PREPARE stmt1 FROM SQL_QRY; EXECUTE stmt1;你还会遇到同样的错误吗? -
@dnoeth 用返回的字符串编辑问题。
-
您的第 4 个 OREPLACE 应该可以工作,但 #2 应该替换为 '**'。从您的 SP 返回 SQL_QRY 作为输出变量,复制/粘贴并尝试运行。为什么要用双引号插入这些语句?
-
SELECT INTO NOT 将返回的字符串值中的引号转义/加倍。也许你用来显示返回值的任何东西都是这样做的。假设引号不是问题,您上面的 SQL_QRY 无效。您不能提供逻辑表达式
CAST(CURRENT_DAY AS DATE FORMAT 'YYYYMMDD')='$currentDay'作为列值。
标签: sql string stored-procedures teradata