Хранимая процедура: добавьте параметр для месяца или часа

У меня есть приведенная ниже хранимая процедура на Snowflake, которая отправляет электронное письмо со всеми ошибками загрузки, существующими в таблице SNOWFLAKE.ACCOUNT_USAGE.COPY_HISTORY за последние 24 часа. Это работает нормально, но в настоящее время временной интервал установлен на «последние 24 часа». Есть ли способ добавить в эту процедуру 2 параметра «чч» / «мм», за которыми следует число, чтобы она сканировала в соответствии с тем, что требуется?

Пример 1: CALL SEND_FAILURE_ALERT('hh', 24) >> это будет сканировать таблицу SNOWFLAKE.ACCOUNT_USAGE.COPY_HISTORY за последние 24 часа.

Пример 2: CALL SEND_FAILURE_ALERT('mm', 01) >> это сканирует последний месяц таблицы SNOWFLAKE.ACCOUNT_USAGE.COPY_HISTORY.

Как показано ниже в коде, переменная «sql_query» — это место, где оператор sql создается перед его выполнением.

CREATE OR REPLACE PROCEDURE SEND_FAILURE_ALERT()
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
var sql_query = "SELECT file_name, stage_location, last_load_time, row_count, row_parsed, file_size, first_error_message, first_error_line_number, first_error_character_pos, first_error_column_name, error_count, error_limit, status, table_name, table_schema_name, table_catalog_name from SNOWFLAKE.ACCOUNT_USAGE.COPY_HISTORY where last_load_time between DATEADD(hh, -24, GETDATE()) and GETDATE() and status = 'Load failed'";
var sqlstmt = snowflake.createStatement({ sqlText: sql_query });
var rs = sqlstmt.execute();
var msg = `<html><body><table border = "1"><tr><th>File_name</th><th>Stage_location</th><th>Last_load_time</th><th>Row_count</th><th>Row_parsed</th><th>File_size</th><th>First_error_message</th><th>First_error_line_number</th><th>First_error_character_pos</th><th>First_error_column_name</th><th>Error_count</th><th>Error_limit</th><th></th><th>Status</th><th></th><th>Table_name</th><th></th><th>Table_schema_name</th><th></th><th>Table_catalog_name</th></tr>`;
 
while (rs.next()) {
  var File_name = rs.getColumnValue(1);
  var Stage_location = rs.getColumnValue(2);
  var Last_load_time = rs.getColumnValue(3);
  var Row_count = rs.getColumnValue(4);
  var Row_parsed = rs.getColumnValue(6);
  var File_size = rs.getColumnValue(7);
  var First_error_message = rs.getColumnValue(8);
  var First_error_line_number = rs.getColumnValue(9);
  var First_error_character_pos = rs.getColumnValue(10);
  var First_error_column_name = rs.getColumnValue(11);
  var Error_count = rs.getColumnValue(12);
  var Error_limit = rs.getColumnValue(13);
  var Status = rs.getColumnValue(14);
  var Table_name = rs.getColumnValue(15);
  var Table_schema_name = rs.getColumnValue(16);
  var Table_catalog_name = rs.getColumnValue(17);
 
msg += '<tr><td>' + File_name + '</td><td>' + Stage_location + '</td><td>' + Last_load_time + '</td><td>' + Row_count + '</td><td>' + Row_parsed + '</td><td>' + File_size + '</td><td>' + First_error_message + '</td><td>' + First_error_line_number + '</td><td>' + First_error_character_pos + '</td><td>' + First_error_column_name + '</td><td>' + Error_count + '</td><td>' + Error_limit + '</td><td>' + Status + '</td><td>' + Table_name + '</td><td>' + Table_schema_name + '</td><td>' + Table_catalog_name  + '</td></tr>';
}
 
msg += `</table></body></html>`;
 
 
var proc = "CALL SYSTEM$SEND_EMAIL('ERRORS_ALERTS', '[email protected]', 'Task Failure Alert: Snowflake Jobs', '" + msg + "','text/html')";
 
var stmt = snowflake.createStatement({ sqlText: proc });
stmt.execute();
 
return "Succeeded! Email sent";
$$;

Привет, и что ты пробовал? Создание нужной строки SQL путем объединения строк и входных параметров не кажется таким уж сложным — так с какой конкретной проблемой вы столкнулись?

NickW 24.06.2024 20:12

Я не уверен, как заменить «чч» и «24» для переменных в инструкции sql, чтобы можно было передавать значения в качестве аргументов при вызове процедуры?

Estrobelai 24.06.2024 20:26

Вы можете объединить строки с переменными или использовать литералы шаблона .

mykaf 24.06.2024 20:39

Понял, спасибо за помощь @mykaf

Estrobelai 24.06.2024 23:14
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
93
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, для этого вопроса единственное, что вам нужно изменить, это первая строка, поэтому давайте просто попрактикуемся:

CREATE OR REPLACE PROCEDURE SEND_FAILURE_ALERT()
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
var sql_query = "SELECT file_name, stage_location, last_load_time, row_count, row_parsed, file_size, first_error_message, first_error_line_number, first_error_character_pos, first_error_column_name, error_count, error_limit, status, table_name, table_schema_name, table_catalog_name from SNOWFLAKE.ACCOUNT_USAGE.COPY_HISTORY where last_load_time between DATEADD(hh, -24, GETDATE()) and GETDATE() and status = 'Load failed'";

return sql_query;
$$;
call SEND_FAILURE_ALERT();

дает:

SELECT file_name, stage_location, last_load_time, row_count, row_parsed, file_size, first_error_message, first_error_line_number, first_error_character_pos, first_error_column_name, error_count, error_limit, status, table_name, table_schema_name, table_catalog_name from SNOWFLAKE.ACCOUNT_USAGE.COPY_HISTORY where last_load_time between DATEADD(hh, -24, GETDATE()) and GETDATE() and status = 'Load failed'

правильно, теперь заменим unit и unit_size переменными (которые должны быть в ПРОПИСНОМ РЕГИСТРЕ в Javascript:

CREATE OR REPLACE PROCEDURE SEND_FAILURE_ALERT(unit string , unit_size string )
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
var sql_query = "SELECT file_name, stage_location, last_load_time, row_count, row_parsed, file_size, first_error_message, first_error_line_number, first_error_character_pos, first_error_column_name, error_count, error_limit, status, table_name, table_schema_name, table_catalog_name from SNOWFLAKE.ACCOUNT_USAGE.COPY_HISTORY where last_load_time between DATEADD("+UNIT+", -"+UNIT_SIZE+", GETDATE()) and GETDATE() and status = 'Load failed'";
return sql_query;
$$;
call SEND_FAILURE_ALERT('hh', 24);

SELECT file_name, stage_location, last_load_time, row_count, row_parsed, file_size, first_error_message, first_error_line_number, first_error_character_pos, first_error_column_name, error_count, error_limit, status, table_name, table_schema_name, table_catalog_name from SNOWFLAKE.ACCOUNT_USAGE.COPY_HISTORY where last_load_time between DATEADD(hh, -24, GETDATE()) and GETDATE() and status = 'Load failed'

и

call SEND_FAILURE_ALERT('mm', 1);

SELECT file_name, stage_location, last_load_time, row_count, row_parsed, file_size, first_error_message, first_error_line_number, first_error_character_pos, first_error_column_name, error_count, error_limit, status, table_name, table_schema_name, table_catalog_name from SNOWFLAKE.ACCOUNT_USAGE.COPY_HISTORY where last_load_time between DATEADD(mm, -1, GETDATE()) and GETDATE() and status = 'Load failed'

Замечательно, спасибо большое, Семен! Очень признателен.

Estrobelai 24.06.2024 23:13

Другие вопросы по теме

Как эффективно самостоятельно присоединиться к одной и той же таблице несколько раз с порядком сортировки по возрастанию и убыванию?
Запретить SQL сопоставлять конечные пробелы и вместо этого явно сопоставлять условие
Как вы можете вычислить, является ли результат десятичным или целым числом в SQL?
ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ НА ДВУХ ТАБЛИЦАХ MYSQL С 3 СВЯЗАННЫМИ КОЛОННАМИ
Подзапрос INSERT INTO SELECT, который использует udf и возвращает 1 значение
Файл содержит значения даты как «01.09.2015 14:30:00». Но после импорта в таблицу oracle все значения даты отображаются как «20-01-19 15:12:15.00000 PM»
Как поднять ошибку, если условие не соответствует
Как вставить много строк тегов на основе входного массива?
UNSUPPORTED_FEATURE.SET_OPERATION_ON_MAP_TYPE Эта функция не поддерживается: не может быть столбцов типа MAP, которые вызывают операции набора (INTERSECT, E
SQL SELECT * FROM table WHERE Столбец NOT LIKE '%str%' не работает, я чувствую себя глупо