【问题标题】:How to execute prepared SQL statement stored in another table如何执行存储在另一个表中的准备好的 SQL 语句
【发布时间】:2021-03-15 16:39:02
【问题描述】:

假设我们有一个 Teradatadb.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


【解决方案1】:

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

所以你只需要这样做:

EXECUTE SQL_QRY;

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

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

【讨论】:

  • 不带IMMEDIATE直接执行返回错误5526:引用未定义语句。
  • 好吧,也许我错了。在第二个想法如何这样做:`OREPLACE(SQL_QRY,'''',''') - 将两个单引号转换为一个单引号
  • 是的,这是我的目标,正如第四个示例中所建议的,必须转义单引号。但没有运气。我肯定在做一些奇怪的事情。
  • 不,您要删除所有引号,我要用一个单引号替换它们
猜你喜欢
  • 1970-01-01
  • 2020-11-13
  • 2020-02-29
  • 2020-03-15
  • 2010-11-06
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多