#snowflake-cloud-data-platform
Вопрос:
Я загружаю данные в snowflake с помощью внешнего этапа. Эта операция выполняется в хранимой процедуре, и процедура вызывается из задачи snowflake. Процедура загружает данные в таблицу с помощью функции КОПИРОВАТЬ В запрос, а затем проверяет наличие ошибок проверки. Чтобы получить ошибку проверки, я использую _last в качестве job_id.
Запрос, используемый для копирования/загрузки данных в таблицу snowflake
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;
$
Комментарии:
1. можете ли вы привести пример хранимой процедуры, которая воспроизводит ошибку?
Ответ №1:
Без фактического кода хранимой процедуры трудно быть уверенным, но я предполагаю, что вы хотите параметризовать имя таблицы:
SELECT FILE as fileName, ERROR as error
FROM table(validate(IDENTIFIER(:bind_variable), job_id => '_last');
Если да, то вам нужно завернуть его в идентификацию.
Привязка переменных в качестве идентификаторов
IDENTIFIER( { string_literal | session_variable | bind_variable } )
Литералы и переменные (сеанс или привязка) могут использоваться в любом месте, где объект может быть идентифицирован по имени (запросы, DML, DDL и т. Д.).