Запрос мощности — Как использовать значение ячейки Excel 2016 в запросе Oracle SQL

#oracle #powerquery

#Oracle #powerquery

Вопрос:

Я решил использовать Power Query в Excel 2016 для загрузки и интерпретации некоторых данных, которые я извлекаю из Oracle DB. У меня есть несколько листов, которые я хочу загрузить на основе определенного кода выполнения, EXE_ID, который может отличаться в зависимости от данных, которые я намереваюсь увидеть.

То, что я хочу сделать, должно быть относительно простым, по крайней мере, согласно всем руководствам, которые я видел до сих пор: я просто хочу указать EXE_ID на одном отдельном листе и хочу, чтобы все запросы на каждом листе могли его прочитать и соответствующим образом загрузить информацию. Проблема в том, что я всегда получаю какую-то ошибку.

Вот моя последняя попытка:

Я создал простую таблицу с заголовком с именем Current_EXE_ID и единственным значением ниже, 43.

После этого я создал пустой запрос, в который я добавил следующий код:

 let
  Source = Excel.CurrentWorkbook(){[Name="GetExeId"]}[Content],
  #"Changed Type" = Table.TransformColumnTypes(Source,{{"Current_EXE_ID", type text}}),
  #"Current_EXE_ID" = #"Changed Type"{0}[Current_EXE_ID]
in
  #"Current_EXE_ID"
  

Идея заключалась в том, чтобы просто прочитать значение в таблице 43, преобразовать его в текст и сохранить в переменной #»Current_EXE_ID», чтобы я мог извлечь его из другого листа.

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

[Выражение.Ошибка] Импортируемый CUrrent_EXE_ID не соответствует экспорту. Вы пропустили ссылку на модуль?

Вот как я это делаю:

 let
    Source = Oracle.Database("<DB_NAME>", [Query="SELECT * #(lf)FROM TABLE_NAME#(lf)WHERE EXE_ID = " amp; #"Current_EXE_ID"])
in
    Source
  

Я также пробовал разные подходы, такие как создание таблицы параметров со следующим кодом, прикрепленным также через пустую страницу запроса:

 (ParameterName as text) =>
let
ParamSource = Excel.CurrentWorkbook(){[Name="Parameters"]}[Content],
ParamRow = Table.SelectRows(ParamSource, each ([Parameter] = ParameterName)),
Value=
if Table.IsEmpty(ParamRow)=true
then null
else Record.Field(ParamRow{0},"Value")
in
Value
  

Я назвал функцию fnGetExeId и включил ее в запрос Oracle SQL

пусть Source = Oracle.База данных(«», [Запрос=»ВЫБЕРИТЕ * #(lf)ИЗ ИМЯ_ТАБЛИЦЫ#(lf), ГДЕ EXE_ID =» amp; fnGetExeId(«EXE_ID»)]) в исходном коде

но в итоге я получил эту ошибку:

Выражение.Ошибка: Мы не можем применить оператор amp; к типам Text и Number. Подробные сведения: Оператор=amp; Left=ВЫБЕРИТЕ * #(lf)ИЗ ИМЯ_ТАБЛИЦЫ#(lf), ГДЕ EXE_ID = Right =43

Если бы кто-нибудь мог хотя бы объяснить причины ошибки, это было бы здорово!

Заранее спасибо! Мигель

Ответ №1:

1) Первое выражение.Ошибка выглядит как опечатка. Есть ли какое-нибудь место, где на запрос ссылаются как #"CUrrent_EXE_ID" вместо #"Current_EXE_ID" ?

2) Похоже, что Record.Field(ParamRow{0},"Value") возвращает число в функции, которую вы опубликовали. Если вы планируете использовать его только для построения SQL-запроса, вы можете изменить его на Number.ToText(Record.Field(ParamRow{0},"Value")) , и тогда это должно сработать.

Однако, если вам нужно выполнить только простую инструкцию WHERE, вы также можете использовать Table.SelectRows вот так:

Table.SelectRows(Source, each [EXE_ID] = Current_EXE_ID)

Это предпочтительное решение, поскольку оно позволяет Power Query вносить дальнейшие преобразования в запрос, который он отправляет на сервер, и устраняет риск внедрения SQL.