Ошибка при получении ошибки проверки в последнем запросе загрузки данных

#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 и т. Д.).