Как отладить процедуру в облачной базе данных Snowflake.? - PullRequest
0 голосов
/ 30 октября 2019

Я использую базу данных Snowflake Cloud, пожалуйста, помогите мне с инструментом для отладки процедур или функций.

Ответы [ 3 ]

2 голосов
/ 30 октября 2019

Следующая хранимая процедура Snowflake Javascript - это шаблон, который я использую для запуска новых хранимых процедур. Он содержит множество приемов отладки, таких как:

  • У него есть «где я?»переменная, которая дает вам представление о том, где в коде вы
  • собираете информацию в массив по мере продвижения процесса
  • и возвращает этот массив в стандартный вывод команды вызова
  • у него есть "хорошее начало" блока исключений, содержимое которого также выталкивается на стандартный вывод при вызове хранимой процедуры, если она завершится неудачей.

Что-то, что я имеюсмысл в том, чтобы добавить это установить тег запроса в коде, который будет полезен при просмотре истории запросов, чтобы легко идентифицировать команды SQL, которые использовались при выполнении хранимой процедуры.

Это «связано» с последней «уловкой отладки» - вы всегда должны просматривать историю запросов (фактические запросы, выполняемые вашим кодом) при разработке хранимых процедур в среде разработки или тестирования, особенно когда вы создаете динамический SQLзаявления. Просмотр истории запросов является обязательным и покажет вам точно, какие команды выполняются, и порядок их выполнения.

Вот код с таблицей примеров, которую он использует, надеюсь, это поможет ... Rich

CREATE OR REPLACE TABLE test_scripts (
   load_seq  number,
   script    varchar(2000)
   );

INSERT INTO test_scripts values 
   (1, 'SELECT current_timestamp();'),
   (2, 'SELECT current_warehouse();'),
   (3, 'SELECT COUNT(*) FROM snowflake.account_usage.tables;'),
   (4, 'SELECT current_date();'),
   (5, 'SELECT current_account();'),
   (6, 'SELECT COUNT(*) FROM snowflake.account_usage.tables;'),
   (7, 'SELECT ''RICH'';');

select * from test_scripts;


CREATE OR REPLACE PROCEDURE sp_test(p1 varchar, p2 varchar)
  RETURNS ARRAY
LANGUAGE javascript
EXECUTE AS caller
AS 
$$
//note:  you can change the RETURN to VARCHAR if needed
//       but the array "looks nice"
try {
   var whereAmI = 1;
   var return_array = [];
   var counter = 0;

   var p1_str = "p1: " + P1
   var p2_str = "p2: " + P2
   var load_seq = P1;
   var continue_flag = P2;

   whereAmI = 2;
   return_array.push(p1_str)
   return_array.push(p2_str)

   whereAmI = 3;
   //which SQL do I want to run?
   if (continue_flag=="YES") {
       return_array.push("query 1")
       var sqlquery = "SELECT * FROM test_scripts WHERE load_seq >= " + load_seq + " order by 1, 2;";
       }
   else {
       return_array.push("query 2")
       var sqlquery = "SELECT * FROM test_scripts WHERE load_seq = " + load_seq + " order by 1, 2;";
       }

   whereAmI = 4;
   //begin the run of grabbing the commands
   var stmt = snowflake.createStatement( {sqlText: sqlquery} );
   var rs = stmt.execute();

   whereAmI = 5;
   // Loop through the results, processing one row at a time... 
   while (rs.next())  {
       counter = counter + 1;
       var tmp_load_seq = rs.getColumnValue(1);
       var tmp_script = rs.getColumnValue(2);

       var tmp_rs = snowflake.execute({sqlText: tmp_script});
       tmp_rs.next();
       var tmp_col1 = tmp_rs.getColumnValue(1);
       return_array.push("tmp_col1: " + tmp_col1)

       }

   whereAmI = 6;
   return_array.push("end process - counter: " + counter)

   return return_array;
   }

catch (err) {
   return_array.push("error found")
   return_array.push(whereAmI)
   return_array.push(err)
   return return_array;
}

$$;

CALL sp_test(3, 'NO');
1 голос
/ 30 октября 2019

Я не верю, что есть какой-либо редактор / отладчик для хранимых процедур для Snowflake. Несколько вариантов:

  1. Вы можете разбить свой код на более мелкие части и попытаться устранить неполадки
  2. Используйте таблицу журналов и часто вставляйте в таблицу журналов, чтобы вы могли просматривать таблицу журналов дляузнать, что пошло не так
0 голосов
/ 30 октября 2019

к сожалению, нет единой среды, которая бы управляла ими всеми 1. записать свой SQL в рабочую таблицу или в редактор 2. записать свой код SPROC в редакторе с поддержкой JS 3. объединить их вместе в рабочую таблицу или редактор 4. Модульный тест вSPROCS, как показано выше @Rich Murmane

Обычно я просто пишу SPROCS на рабочем листе, но это не оптимально

...