Как вызвать процедуру внутри другой процедуры в snowflake

#javascript #sql #stored-procedures #snowflake-cloud-data-platform

#javascript #sql #хранимые процедуры #snowflake-cloud-data-platform

Вопрос:

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

 CREATE OR REPLACE PROCEDURE get_columns(TABLE_NAME VARCHAR)
RETURNS ARRAY
LANGUAGE JAVASCRIPT
AS
$$
var stmt = snowflake.createStatement({
    sqlText: "SELECT * FROM "   TABLE_NAME   " LIMIT 1;",    
});
stmt.execute();

var cols=[];
for (i = 1; i <= stmt.getColumnCount(); i  ) {
  cols.push(stmt.getColumnName(i));
}
return cols
$$;
  

Ниже приведена основная процедура, которая вызывает указанную выше процедуру и возвращает массив имен столбцов. Но я не понимаю, где я ошибаюсь.

 CREATE OR REPLACE PROCEDURE get_data()   //procedure call the above procedure
    RETURNS ARRAY
    LANGUAGE JAVASCRIPT
    AS
    $$
    var arr = [];
    var r = snowflake.createStatement({sqlText: "call get_columns('Table_Name')"});
    arr = r.execute();  //r.execute() returns an array
    return arr; //getting an error
    $$
  

Комментарии:

1. Какое у вас сообщение об ошибке / вывод? Итак, что именно идет не так?

2. @Marcel Я получаю «Возвращаемое значение не является МАССИВОМ»

3. @Marcel Это возвращает объект [object]

4. Любопытно, почему вы используете SP для возврата массивов, а не используете UDTF и возвращаете таблицу. Может работать лучше для вас…

5. @Marcel, неважно, я понял это. Спасибо.

Ответ №1:

Я не вижу никаких «больших» ошибок… может быть, помогает добавление точки с запятой после вызова get_columns(‘имя_таблицы’)? (для меня это также работает без точки с запятой здесь, поэтому я думаю, что это не проблема)

Кроме того, после $$ в конце нет точки с запятой (возможно, какой-то более поздний код в вашем скрипте вызывает ошибку)

Дополнительную информацию можно найти здесь https://docs.snowflake.com/en/sql-reference/stored-procedures-overview.html#stored-procedures-are-called-as-independent-statements

Последним намеком могут быть права доступа к вашей таблице.

Ответ №2:

Проблема в том, что вы не выполнили итерацию по набору результатов arr. Вы можете сделать следующее в своем коде:

 CREATE OR REPLACE PROCEDURE get_data()   //procedure call the above procedure
  RETURNS ARRAY
  LANGUAGE JAVASCRIPT
  AS
  $$
  var arr = [];
  var r = snowflake.createStatement({sqlText: "call get_columns('TABLE_NAME')"});
  arr = r.execute();
  arr.next();
  return arr.getColumnValue(1);
  $$;
    
call get_data();