Хранимая процедура - использовать список массивов в запросе SQL для вставки в снежинку - PullRequest
0 голосов
/ 29 мая 2020

Если я создал / сгенерировал список элементов во время обработки в хранимой процедуре, скажите rownum = [1,2,3,4]. Теперь я хочу использовать этот список в операторе sql, чтобы отфильтровать строки, скажем, select * from mytable, где rownum не находится в (1,2,3,4) в той же хранимой процедуре. Как я могу этого добиться? Пожалуйста, направьте. Спасибо

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

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

API JavaScript позволяют динамически генерировать SQL, используя строку и функции преобразования массива , поэтому для решения проблемы можно использовать следующие подходы.

Вставить список значений в запрос, сформировав синтаксис SQL набора значений:

CREATE OR REPLACE PROCEDURE SAMPLE()
    RETURNS RETURNTYPE
    LANGUAGE JAVASCRIPT
    AS
    $$
      var lst = [2, 3, 4]
      var lstr = lst.join(',') // "2, 3, 4"
      var sql_command = `SELECT * FROM T WHERE C NOT IN (${lstr})` // (2, 3, 4)
      var stmt = snowflake.createStatement( {sqlText: sql_command} )
      // Runs: SELECT * FROM T WHERE C NOT IN (2, 3, 4) [Literal query string]
      [...]
    $$;

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

CREATE OR REPLACE PROCEDURE SAMPLE()
    RETURNS RETURNTYPE
    LANGUAGE JAVASCRIPT
    AS
    $$
      var lst = [2, 3, 4]
      var lst_vars = Array(lst.length).fill("?").join(", ") // "?, ?, ?"
      var sql_command = `SELECT * FROM T WHERE C NOT IN (${lst_vars})` // (?, ?, ?)
      var stmt = snowflake.createStatement( {sqlText: sql_command, binds: lst} )
      // Runs: SELECT * FROM T WHERE C NOT IN (2, 3, 4) [After bind-substitution]
      [...]
    $$;
0 голосов
/ 29 мая 2020

Snowflake имеет функцию ARRAY_CONTAINS (,).

пример: Array_Contains (5, array_construct (1,2,3,4))

...