Вызов процедуры «Снежинка» из приложения-функции Azure - PullRequest
0 голосов
/ 11 марта 2020

У меня есть процедура в «Снежинке», и я хочу вызвать ее из приложения, запускаемого по таймеру Azure. Эта процедура ожидает параметр типа string. Ниже приведен фрагмент кода для подключения к Snowflake и вызова этой процедуры с параметром.

using (IDbConnection conn = new SnowflakeDbConnection())
{
    //Connect to Snowflake
    conn.ConnectionString = Environment.GetEnvironmentVariable("SnowflakeConnection");
    conn.Open();
    using (IDbCommand cmd = conn.CreateCommand())
    {
        if (conn.State == ConnectionState.Open)
        {
            cmd.CommandText = "SP_Snowflake_Procedure";
            //cmd.CommandType = CommandType.StoredProcedure;
            var date = cmd.CreateParameter();
            date.ParameterName = "RUNDATE";
            date.DbType = DbType.String;
            date.Value = "2018-01-01";
            cmd.Parameters.Add(date);
            using (IDataReader dr = cmd.ExecuteReader())
            {
                /****************
                 Logic to work on data 
                 received from SP
                *****************/
            }
        }
    }
}

Когда управление приходит к cmd.ExecuteReader (), происходит сбой с ошибкой: Snowflake.Data: SQL ошибка компиляции: синтаксическая ошибка, строка 1 в позиции 0, неожиданное «SP_Snowflake_Procedure».

Я не понимаю эту Снежинку, как вызвать процедуру. У меня была мысль, это похоже на MS SQL. Но я не прав. Я даже не мог найти соответствующие документы. Я мог бы использовать тот же код без вызова процедуры, но с простым оператором SELECT и работал нормально. Предложите мне любые изменения здесь.

1 Ответ

1 голос
/ 11 марта 2020

Я не могу определить из кода, используете ли вы драйвер ODB C для Snowflake или драйвер. NET для Snowflake. Драйвер ODB C поддерживает больше функций, чем драйвер. NET, но я думаю, что выполнение SP должно поддерживаться в обоих случаях.

Вам нужно будет выполнить вызов с помощью оператора SQL, который выполняет запрос (в отличие от методов, которые выполняют не-запрос). Он вернет таблицу с одной строкой с возвратом из SP. Он будет содержать один столбец с именем SP и скалярным значением SP (в основном то, что будет возвращено на листе SQL при запуске в веб-интерфейсе).

Вот пример SP для протестируйте, если вам нужен простой:

create or replace procedure EchoString(stringValue string)
returns VARCHAR
language JavaScript
as
  $$  

  // Note that variables passed to Snowflake stored procedures
  // muat be all CAPITAL letters when used in the body of the 
  // procedure code. 
  return STRINGVALUE

  $$;

--Run the stored procedure to echo the value.
call EchoString('Echo this string.');

Вот как вызывать SP из проекта C# с использованием соединения ODB C:

OdbcConnection DbConnection = new OdbcConnection("DSN=Snowflake;pwd=******");
OdbcCommand DbCommandSetup = DbConnection.CreateCommand();
DbConnection.Open();

// These two lines are only required if you get a message about no running warehouse.
// It will depend on how your calling user is set up in Snowflake.
DbCommandSetup.CommandText = "use warehouse TEST;";
DbCommandSetup.ExecuteNonQuery();

OdbcCommand DbCommand = DbConnection.CreateCommand();
DbCommand.CommandText = "call TEST.PUBLIC.ECHOSTRING('Echo this string.')";
OdbcDataReader DbReader = DbCommand.ExecuteReader();

// Note: If you define a Snowflake SP, DB, or schema in mixed case without double quoting
// the name, Snowflake will uppercase it in the catalog. You can call it from here without
// converting to upper case as long as it's not double quoted (escaped \") in the string.
...