Передайте значение в процедуре javascript снежинки

Возможно ли в Snowflake dwh получить результат SQL-запроса и передать его в качестве переменной следующему запросу в рамках той же процедуры?

Я пытаюсь попробовать% ROWCOUNT, CURSOR case, но застрял в следующем:

CREATE OR REPLACE PROCEDURE PASS_VAR_IN_JS()
RETURNS VARCHAR
LANGUAGE javascript
  AS
    $$
    var command = "SELECT * FROM TABLE WHERE ATTRIBUTE = 'Value'";
    var stmt = snowflake.createStatement( {sqlText: command} );
    var result1 = stmt.execute();
    return result1.getColumnName(3); //this returns column name
    var col_name = result1.getColumnName(3); //save column name to variable

    //pass the column name to the query
    var stmt = snowflake.createStatement({sqlText: "SELECT * FROM INFORMATION_SCHEMA WHERE COLUMN_NAME = ;", binds:[col_name]});

    $$; 
UPDATE - working code that passes one result to another query
<pre>
CREATE OR REPLACE PROCEDURE szpotma_rowcount()
RETURNS VARCHAR(250)
LANGUAGE JAVASCRIPT
as
$$
  var command = `SELECT ATTR1 FROM TABLE1 LIMIT 1`; 
  var stmt = snowflake.createStatement( {sqlText: command} );
  var rs = stmt.execute(), col_name ;

  if (rs.next()) {
    col_name = rs.getColumnValue(1);
    stmt = snowflake.createStatement({
        sqlText: `SELECT STATUS FROM TABLE_STATUS WHERE ATTR1 = :1`, binds: [col_name]});

    //view second query results
    rs = stmt.execute();    
    rs.next()
    return rs.getColumnValue(1);
  }
$$


person marcin2x4    schedule 21.11.2019    source источник


Ответы (1)


Конечно.

Вы можете сделать всего:

  var command = `SELECT * FROM TABLE WHERE ATTRIBUTE = 'Value'`;
  var stmt = snowflake.createStatement( {sqlText: command} );
  var rs = stmt.execute(), col_name ;
  if (rs.next()) {
    col_name = rs.getColumnValue(3);

    stmt = snowflake.createStatement({
        sqlText: `SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = :1`, 
          binds: [col_name]
    });
  }

Я перечислил различные способы получения данных из набора результатов в:
Как использовать команду Show в хранимых процедурах - не работает

[Скопировано сверху]:

Если у вас несколько столбцов, код становится немного сложнее:

  var result = [], row, col;
  while (rs.next()) {
    row = [];
    for (col = 1; col <= stmt.columnCount; col++)
      row.push(rs.getColumnValue(col));
    result.push(row);
  }

Хардкорные программисты на JavaScript могут сжать это до:

var result = [], cols = Array.from({ length: stmt.columnCount }, (v, i) => i + 1);
while (rs.next()) result.push(cols.map(c => rs.getColumnValue(c)));

Последний вариант, когда первая строка результата содержит имена столбцов, а следующие строки содержат данные из набора результатов, доступные как результат [строка] [столбец]:

var result =
    [ Array.from({ length: stmt.columnCount }, (v, i) => stmt.getColumnName(i + 1)) ];
while (rs.next()) result.push(result[0].map(cn => rs.getColumnValue(cn)));
person Hans Henrik Eriksen    schedule 21.11.2019
comment
Чтобы дать более подробную информацию, я хочу воссоздать цикл ROWCOUNT, как в PL / SQL, T-SQL. - person marcin2x4; 22.11.2019
comment
Выше я привел еще несколько примеров. В Snowflake нет эквивалента курсору% ROWCOUNT, но после выполнения запроса stmt.rowCount (недокументированный) содержит количество строк в наборе результатов. - person Hans Henrik Eriksen; 22.11.2019
comment
Я не совсем понимаю, как закодировать момент передачи первого результата запроса в другой запрос. Не могли бы вы подробнее рассказать об этом? - person marcin2x4; 02.12.2019
comment
var sql_command = SELECT * FROM TABLE_1 LIMIT 10 ;; var sql_command2 = ВЫБРАТЬ ATTR1, ATTR2 FROM TABLE_2 WHERE ATTR2 = '' ;; оператор var = snowflake.createStatement ({sqlText: sql_command}); var resultSet = statement.execute (); col_name; если (resultSet.next ()) {col_name = resultSet.getColumnValue (1); // как вставить указанное выше значение во второй оператор? оператор2 = snowflake.createStatement ({sqlText: sql_command2}); - person marcin2x4; 02.12.2019
comment
Я расширил многоточие [...] из моей первой версии в верхней части моего ответа. Вы используете позиционный параметр во втором запросе (в данном случае: 1), который является индексом в массиве значений binds [] (индекс начинается с 1). - person Hans Henrik Eriksen; 02.12.2019
comment
Я добавил несколько строк после второго кода SQL, чтобы действительно отобразить результаты. `// чтобы вернуть значение из запроса выше rs = stmt.execute (); rs.next () return rs.getColumnValue (1); `. Первая строка из первого запроса была передана второму. - person marcin2x4; 02.12.2019
comment
Как мы могли бы изменить код для отображения результатов второго запроса, если сначала передали 10 строк одного столбца? - person marcin2x4; 02.12.2019
comment
Есть множество способов сделать это, но, пожалуй, самый простой способ - объединить два запроса в один. Почему должно быть два запроса? Я думаю, что вы, возможно, пытаетесь имитировать код из какой-то другой системы, например Oracle, но невозможно угадать, что это за код. - person Hans Henrik Eriksen; 03.12.2019
comment
Точно - я хотел на практике воссоздать классическое поведение PL / SQL. Позиционный параметр (`1) прояснил мне это. Спасибо! - person marcin2x4; 03.12.2019