Понимание процедур в Снежинке (javascript) - PullRequest
0 голосов
/ 24 апреля 2020

Я недавно прошел следующую строку кода при анализе стороннего сценария данных.

  CREATE OR REPLACE PROCEDURE WH.SCHEMA.PROCEDURE_NAME(DATE_OF_LOAD STRING) --input which will be binded later
  RETURNS STRING
  LANGUAGE javascript
  AS $$

   var drop_table = `drop table if exists TABLE_NAME;`; 
   var stmt_drop_table = snowflake.createStatement( {sqlText: drop_table} );
   var incremental_data =
     `CREATE TABLE AS <many arguments>

      WHERE P.CZAS_MODYF_SF >= :1 --this is where biding of DATE_OF_LOAD occurs)

   SELECT *, HASH(*) HASH FROM (
                             SELECT <arguments>
                            FROM CTE) q; `;

   var stmt_incremental_data = snowflake.createStatement( {sqlText: incremental_data,binds: [DATE_OF_LOAD ].map(function(x){return x === undefined ? null : x}) } );

   try {

    stmt_drop_table.execute();  
    stmt_incremental_data.execute(); 
    rtr = "Success!";
    return rtr;
    }

   catch (err) {

       return "Failed: " + err;
}  
$$
;

Весь мой вызов с:

var stmt_incremental_data = snowflake.createStatement( {sqlText: incremental_data,binds: [DATE_OF_LOAD ].map(function(x){return x === undefined ? null : x}) } ).

object. method часть ясна. То же самое для binds. Код после binds - моя проблема здесь.

Еще одна топика c: Snowflake интерпретирует параметры метода как JSON. Означает ли это, что значение bind может быть расширено путем присвоения кода JS? Я буду очень благодарен за помощь и объяснения.

1 Ответ

2 голосов
/ 24 апреля 2020

Причина, по которой я изначально не публиковал это как ответ, заключается в том, что JavaScript не является моей областью знаний. Я баловался этим в течение нескольких месяцев.

Но чтобы понять, что происходит:

[DATE_OF_LOAD ].map(function(x){return x === undefined ? null : x})

Вам нужно разбить это на части:

 x === undefined ? null : x

Это называется оператором Элвиса и эквивалентно:

if (x === undefined) 
{ 
  return null
} else { 
  return x 
} 

Теперь, когда мы знаем, что делает функция, нам нужно понять карту метод. Но вкратце он создает новый массив с результатами вызова предоставленной функции для каждого элемента в вызывающем массиве.

Итак, простой ответ, скопированный из моего комментария: если DATE_OF_LOAD не определен, он заменит его нулевым в противном случае он будет использовать любое значение, хранящееся в DATE_OF_LOAD. Это потому, что SQL не знает, как обращаться с неопределенным. Но вот причина моего ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...