#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». Вы знаете, почему это может происходить?