【发布时间】:2021-02-16 12:31:14
【问题描述】:
我正在使用反引号在 Snowflake 存储过程中构建下面的插入查询,并且在触发 sql 时它工作正常
CREATE OR REPLACE PROCEDURE SP_TEST_CALLPROC()
RETURNS STRING
LANGUAGE JAVASCRIPT
EXECUTE AS OWNER
AS $$
var q = `insert into abc
select col1, col2,
to_date(col3,'YYYYMMDD') as col3 from def;`
var insrtSql = snowflake.createStatement({sqlText: q});
var result = insrtSql.execute();
result.next()
$$
;
我还想将此查询记录到日志表中,由于 TO_DATE 函数 'YYYYMMDD' 中的单引号导致该查询失败:
CREATE OR REPLACE PROCEDURE SP_LOAD_LOG_POC(PROCESS_ID FLOAT,
PROCESS_NAME STRING,
BATCH_ID FLOAT,
LOG_TXT STRING)
RETURNS STRING
LANGUAGE JAVASCRIPT
EXECUTE AS OWNER
AS $$
var query = `INSERT INTO INGESTION_LOG
VALUES
(${PROCESS_ID},'${PROCESS_NAME}',${BATCH_ID},current_timestamp(),'${LOG_TXT}');`
var stmt = snowflake.createStatement( { sqlText: query});
var res = stmt.execute();
$$
;
CREATE OR REPLACE PROCEDURE SP_TEST_CALLPROC()
RETURNS STRING
LANGUAGE JAVASCRIPT
EXECUTE AS OWNER
AS $$
function log(process_id,process_name,batch_id,log_txt){
snowflake.createStatement( { sqlText: `call SP_LOAD_LOG_POC(:1,:2,:3,:4)`, binds:[process_id,process_name,batch_id,log_txt] } ).execute();
}
var q = `insert into abc
select col1, col2,
to_date(col3,'YYYYMMDD') as col3 from def;`
log(1,'test_procedure',12345,`Firing insert query : ${q}`);
var insrtSql = snowflake.createStatement({sqlText: q});
var result = insrtSql.execute();
result.next()
$$
;
CALL SP_TEST_CALLPROC()
Execution error in store procedure SP_TEST_CALLPROC:
Execution error in store procedure SP_LOAD_LOG_POC: SQL compilation error: syntax error line 5 at position 23 unexpected 'YYYYMMDD'.
At Statement.execute, line 10 position 19
At Statement.execute, line 4 position 169
尝试使用 javascript 函数 replaceAll() 将单引号替换为 2 个单引号 (' -> ''),但 Snowflake 存储过程中不支持此函数。 任何人都可以建议如何在插入日志条目时摆脱这个错误
【问题讨论】:
标签: stored-procedures snowflake-cloud-data-platform