Сообщение об успешном захвате в хранимой снежинке - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть несколько хранимых процедур в Snowflake, и когда они успешны, отображается созданное мной пользовательское сообщение, я бы предпочел отобразить то же сообщение, которое Snowflake показывает в окне результатов запроса.
Например, я выполняю сохраненный Pro c с операторами COPY TO. Я хотел бы, чтобы успешное выполнение этого сохраненного Pro c показывало количество успешно экспортированных строк. Могут ли они получать информацию об успехе и отображать ее так же легко, как сообщения об ошибках?

1 Ответ

1 голос
/ 01 апреля 2020

Да, вы можете сделать это, используя JavaScript хранимые процедуры. Когда Snowflake выполняет запрос, который возвращает только сообщение о состоянии, он возвращает его в виде таблицы с одним столбцом «status» и одной строкой со статусом. Вы можете вернуть это значение. Вы можете рассмотреть, что произойдет, если возникнет ошибка SQL: обработайте ее локально в SP или сгенерируйте ошибку, чтобы вызывающий сеанс знал, что произошла ошибка. В любом случае при возвращении состояния будет отображаться сообщение об ошибке, если оно есть.

Вот пример использования JavaScript SP. У него также есть некоторые вспомогательные функции, которые я обычно использую для выполнения запросов с одним значением и операторов без запроса, просто ища возвращаемое значение:

create or replace procedure SampleSP()
returns string
language javascript
as
$$
    try{
        return ExecuteNonQuery("create table MY_NATION_TABLE as select * from SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.NATION;");
    }
    catch(err){
        return err;
    }
// ----------------------------------------------------------------------------------
// Main function above; helper functions below

    function ExecuteNonQuery(queryString) {
        return ExecuteSingleValueQuery("status", queryString)
    }

    function ExecuteSingleValueQuery(columnName, queryString) {
        var out;
        cmd1 = {sqlText: queryString};
        stmt = snowflake.createStatement(cmd1);
        var rs;
        try{
            rs = stmt.execute();
            rs.next();
            return rs.getColumnValue(columnName);
        }
        catch(err) {
            if (err.message.substring(0, 18) == "ResultSet is empty"){
                throw "ERROR: No rows returned in query.";
            } else {
                throw "ERROR: " + err.message.replace(/\n/g, " ");
            } 
        }
        return out;
    }
$$;

-- Run this twice to see the effect of an error. You can remove the try block
-- in the main function of the SP to generate a SQL error instead of just 
-- returning a string with the error text

call SampleSP();
...