sql - 如何执行存储在另一个表中的准备好的 SQL 语句
问题描述
假设我们有一个Teradata表db.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
有没有办法克服这种麻烦或实现目标的正确方法是什么?检索准备好的语句并执行它们?
亲切的问候
解决方案
由于您的查询已经准备好,我认为您不需要prepare
再次执行它,执行立即转换 ' 到 '' 以使字符串准备好作为要执行的 SQL 语句,并将您已经准备好的字符串拧紧。
所以你只需要这样做:
EXECUTE SQL_QRY;
或者如果您的查询存储有两个单引号,您可能需要将它们转换为一个单引号:
OREPLACE(SQL_QRY, '''', ''')
推荐阅读
- c# - 在 Unity 中之前的自动动画 - 如何做这样的事情?
- swift - SKPhysicsBody 即使速度为 0 也会移动
- c++ - 了解 vivado hls 中的行缓冲区概念
- javascript - Axios 获取的 HTML 页面与浏览器不同
- javascript - 按 RowClick 展开列
- python - 为多项式朴素贝叶斯准备数据并运行算法 - ValueError:发现输入变量的样本数不一致
- pine-script - Pine Script 在条的右侧绘制一条水平线
- php - PHP 警告:mysqli_num_rows() 期望参数 1 为 mysqli_result,给定对象
- reactjs - 对多个复选框做出反应验证
- python - 如何改进使用 Python 抓取 reddit 的代码