#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();