首页 > 解决方案 > 如何执行存储在另一个表中的准备好的 SQL 语句

问题描述

假设我们有一个Teradatadb.queries,其中准备好的语句存储statement_code为 CLOB,例如,该字段的内容可能如下所示:

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

有没有办法克服这种麻烦或实现目标的正确方法是什么?检索准备好的语句并执行它们?

亲切的问候

标签: sqlstringstored-proceduresteradata

解决方案


由于您的查询已经准备好,我认为您不需要prepare再次执行它,执行立即转换 ' 到 '' 以使字符串准备好作为要执行的 SQL 语句,并将您已经准备好的字符串拧紧。

所以你只需要这样做:

EXECUTE SQL_QRY;

或者如果您的查询存储有两个单引号,您可能需要将它们转换为一个单引号:

OREPLACE(SQL_QRY, '''', ''') 

推荐阅读