У меня есть хранимая процедура, которая принимает аргумент массива и запускает динамически созданный запрос, используя execute immediate
. В динамическом запросе я хотел бы передать массив вместе с набором столбцов в каждой строке хранимой функции.
Для любого другого типа аргумента это было бы просто. Для целого числа я бы использовал формат следующим образом:
execute immediate format(""" SELECT %d*value1 as scaled_value FROM (...) """)
Но, похоже, для массивов нет спецификатора формата. Один из способов сделать это — написать красивый принтер для массивов, который перебирает массив и создает соответствующую строку [a, b, c, ...]
, но такой подход кажется громоздким. Есть ли поддерживаемый способ сделать это?
а для массива можно использовать %t в FORMAT('%t', ['a', 'b', 'c']), я не уверен, что это то, что вы хотите.
%t
было именно то, что мне было нужно. Мои глаза просто пропустили описание в документации, потому что оно начинается с примера, в котором оно используется для метки времени, поэтому я предположил, что это означает метку времени. У меня есть UDF, написанный на Javascript, который принимает массив. Я думаю, что я мог бы также передавать таблицы с помощью UNNEST, но операции сложны, и Javascript здесь работает лучше.
Как упоминалось @Jaytiger, для использования массива внутри оператора немедленного выполнения% t можно использовать внутри функции FORMAT. Вы можете использовать его как FORMAT('%t', ['a', 'b', 'c'])
.
Кажется необычным не использовать массив вместе с UNNEST, а использовать его в виде литерала массива. Можете ли вы поделиться оператором select, если хотите сгенерировать его с помощью немедленного выполнения?