Выполнение хранимой процедуры через ODBC

У меня есть приложение, которое позволяет пользователю вводить строку SQL с заполнителем для определенных значений, которые производит мое приложение. Приложение заменит заполнители значениями и выполнит строку SQL через различные серверные части базы данных.

Для серверной части ODBC я вызываю SQLExecDirect() для строки SQL, которая прекрасно работает с обычными запросами, но не работает с хранимыми процедурами с параметрами.

Есть ли простой способ расширить этот механизм для поддержки хранимых процедур? Определенным образом, как должен быть написан SQL?

Единственное, о чем я могу думать прямо сейчас, это начать синтаксический анализ строки SQL и вызвать SQLBindParameter() n раз, если она содержит «вызов». Но синтаксический анализ SQL сложен.

Любые идеи ?

Пример рабочего SQL: SELECT columnA from foo, где columnB = '%placeholder'

Неработающий SQL: CALL StoredFoo('%placeholder')


person Gene Vincent    schedule 17.08.2010    source источник
comment
Звучит как ужасное приложение.. без обид.. Я бы порекомендовал создать определенный интерфейс для хранимых процедур, если это необходимая функциональность. Как вы доверяете своим пользователям писать хорошие, неразрушающие запросы?   -  person Fosco    schedule 17.08.2010
comment
Приложение устанавливается на ПК пользователя, и в процессе настройки он может поместить операторы SQL для сохранения значений в свой файл конфигурации. Таким образом, нет никаких проблем с безопасностью, кроме того, что он может случайно перезаписать свои собственные данные.   -  person Gene Vincent    schedule 17.08.2010


Ответы (1)


Вызов хранимых процедур (ODBC) :

Чтобы запустить процедуру как RPC

  1. Создайте инструкцию SQL, использующую управляющую последовательность ODBC CALL. Оператор использует маркеры параметров для каждого входного, входного/выходного и выходного параметра, а также для возвращаемого значения процедуры (если есть):

    {? = CALL procname (?,?)}

  2. Вызовите SQLBindParameter для каждого входного, входного/выходного и выходного параметра, а также для возвращаемого значения процедуры (если есть).

  3. Выполните оператор с SQLExecDirect.

В противном случае вам нужно выполнить процедуру как обычный пакет (не вызов RPC), т.е. вам нужно запустить пакет:

EXEC procname @param1, @param2, @param3...;
person Remus Rusanu    schedule 17.08.2010