Использование переменной в хранимой процедуре Snowflake

#snowflake-cloud-data-platform

Вопрос:

Я должен добавить переменную maxDate в свой процесс, сохраненный в SQL (показано ниже). Код выводится с ошибкой, так как maxDate не отображается его значением. Есть идеи о том, как я могу передать переменную в сохраненном процессе?

 create or replace procedure Load_Employee()
  returns varchar not null
  language javascript
  EXECUTE AS CALLER
  

  as
  $
  //Variable Initialization
    
    var IntegrationTable ='EMPLOYEE';
    var TypeID=0;
    var MaxDate=' ';
    var cmd = "Select max(COMPLETED_DATE) from SCHEMA.TABLE where TARGET_TABLE_NAME=  "   "'"   IntegrationTable   "'"  ;
  
    var sql = snowflake.createStatement({sqlText: cmd});
    var result = sql.execute();
    result.next();
 
   MaxDate=result.getColumnValue(1);
   var cmd=` Insert into PersonTable   

    select SHA1(concat(Person_id,'|','Person')) ,12345678,SHA1(concat('Payroll','|','Pay','|', Load_Date)) ,current_timestamp() , Tenant
    from Schema.PERSONTABLE where Date_Added >= MaxDate

    where  TYPE='ABC' ;`;


  
  $
  ; 

Ответ №1:

Если ваш запрос на получение maxDate работает правильно, то значение должно быть в переменной. Проблема в том, что она не заменяется в переменной sql, определяющей инструкцию insert.

Поскольку вы используете обратные ссылки для открытия и закрытия строки, вы можете использовать специальную нотацию JavaScript, чтобы заменить переменную ее значением, ${MaxDate} .

Ваше определение оператора insert будет выглядеть следующим образом:

    var cmd=` Insert into PersonTable   

    select SHA1(concat(Person_id,'|','Person')) ,12345678,SHA1(concat('Payroll','|','Pay','|', Load_Date)) ,current_timestamp() , Tenant
    from Schema.PERSONTABLE where Date_Added >= ${MaxDate}

    where  TYPE='ABC' ;`;
 

Если это не сработает, попробуйте сократить SP return MaxDate; , чтобы посмотреть, что было присвоено этой переменной. Также очень полезно проверить представление истории запросов, чтобы увидеть, что SQL на самом деле выполнял внутри хранимой процедуры.

Кроме того, я думаю, что это тот же SP, у которого была проблема с возвращением null. Вам нужно будет вернуть строковое значение, используя что-то вроде return 'Success'; или что-то еще, чтобы избежать ошибки при возврате null. Это из returns varchar not null -за того, что в определении.

Комментарии:

1. Это сработало, но преобразование даты не происходит. Максимальная дата передается как » Пт 06 августа 2021 года 12:16:27 GMT-0700 (Тихоокеанское летнее время)» вместо мм/дд/гггг чч:мм:сс. Как произойдет преобразование?

2. Когда дата равна НУЛЮ, функция возвращает «31.12.1969 16:00:00». Вы знаете, почему это может происходить?