snowflake-cloud-data-platform - 在上次数据加载查询中出现验证错误时出错
问题描述
我正在使用外部阶段将数据加载到雪花中。此操作在存储过程中执行,该过程是从雪花任务中调用的。该过程使用 COPY INTO 查询将数据加载到表中,然后检查验证错误。为了得到验证错误,我使用 _last 作为 job_id。
用于将数据复制/加载到雪花表中的查询
COPY INTO conference_created_tmp FROM @conference_created_src/year=2021/month=04/day=15/hour=01/ ON_ERROR = 'SKIP_FILE'
用于获取验证错误的查询:
SELECT FILE as fileName, ERROR as error
FROM table(validate(conference_created_tmp, job_id => '_last')
错误信息:
SQL 编译错误:表函数的参数无效 [我们找不到此会话期间发生的此表的副本]。表函数参数必须是常量。
如果我直接在 Snowflake 工作表中将副本运行到命令和验证查询中,它就可以工作!!!。但是当从过程中调用它时会出错。
程序代码:
CREATE OR REPLACE PROCEDURE TEST_ERROR_LOG()
RETURNS STRING NOT NULL
LANGUAGE JAVASCRIPT
AS
$$
//Copying data from external stage to snowflake table
const COPY_QUERY = `COPY INTO conference_created_tmp
FROM @conference_created_src/year=2021/month=04/day=15/hour=01/
ON_ERROR = 'SKIP_FILE'`;
const LOAD_ERROR_INSERT_QUERY = `INSERT INTO error_log(eventTime, fileName, error)
SELECT '%eventTime%', FILE as fileName, ERROR as error
FROM table(validate(conference_created_tmp, job_id => '_last'))`;
function log_load_error() {
let params = {
"%eventTime%": Date.now()
};
let insertQuery = LOAD_ERROR_INSERT_QUERY.replace(/%\w+%/g, function (all) {
return params[all] || all;
});
try {
snowflake.execute({sqlText: insertQuery});
} catch (err) {
throw err;
}
}
function loadDataFromStageToTable() {
try {
let resultSet = snowflake.execute({sqlText: COPY_QUERY});
resultSet.next();
} catch (err) {
throw err;
}
}
try {
loadDataFromStageToTable();
log_load_error();
} catch (err) {
throw err;
}
return true;
$$
解决方案
没有实际的存储过程代码很难确定,但我猜你想参数化表名:
SELECT FILE as fileName, ERROR as error
FROM table(validate(IDENTIFIER(:bind_variable), job_id => '_last');
如果是,那么您需要用IDENFITIER包装它。
将变量绑定为标识符
IDENTIFIER( { string_literal | session_variable | bind_variable } )
文字和变量(会话或绑定)可用于任何可以通过名称(查询、DML、DDL 等)标识对象的地方。
推荐阅读
- java - 我添加范围 1 - 9999 的条件的代码无法使用 switch 语句
- powershell - 在包含多个作业的 Azure DevOps 发布管道中,我可以在脚本中捕获以前作业的状态吗?
- angular - 想要从已登录的特定人员的 RESTAPI 中获取数据
- javascript - 如何获取 iframe 的 JSON 值?
- python-3.x - 如何在python中将另一个excel数据附加到sqlite3数据库中?
- node.js - 如果按下按钮(gpio,raspberry)使用node.js(服务器)将新页面/html发送到浏览器(客户端),怎么办?
- database - 如何在 Cassandra 的某个时间范围内按字段分组?
- python - 如何对多个功能进行分组和应用?
- android - 找不到 com.google.firebase-core:17.0.1:
- html - 来自本地路径的 html 视频