Вставить, удалить, обновить при использовании компонента «Хранимая процедура» - PullRequest
2 голосов
/ 20 декабря 2011

У нас есть приложение, написанное на Delphi 2010, которое подключается к базе данных SQL Server.Сейчас мы находимся в процессе перехода на Oracle.С SQL Server было очень легко выполнять вставку, обновление, удаление прямо из dbgrid, подключенного к хранимой процедуре.

Это потому, что хранимые процедуры в SQL Server могут легко выступать в качестве таблицы, так что вы можете выполнять с ней любые операции, при условии, что она возвращает необходимые столбцы в наборе результатов.Теперь с Oracle я не знаю, как это сделать.Я подключаю DBGrid к источнику данных, набор данных которого является объектом хранимой процедуры, но я не могу редактировать сетку.Можно просто выбрать.

Что мне нужно сделать, чтобы добиться этого? Я использую комплект компонентов UniDac для подключения к базе данных Oracle.

Ответы [ 2 ]

3 голосов
/ 20 декабря 2011

ОК, здесь я отвечаю на вопрос, хотя вижу, что в последнее время очень немногие имеют дело с Delphi. Допустим, у нас есть сохраненный процесс в базе данных Oracle:

CREATE OR REPLACE PROCEDURE GET_EMPLOYEES
 (V_CUR IN OUT SYS_REFCURSOR)
AS
BEGIN
  OPEN V_CUR FOR SELECT * FROM EMPLOYEES;
END GET_EMPLOYEES;

Теперь в Delphi вы выбираете компонент хранимой процедуры (возможно, из набора компонентов ODAC или UniDac). Установите его StoredProcName GET_EMPLOYEES. Затем вы можете добавить все поля, которые процедура возвращает в курсоре. Если вы запустите приложение и активируете хранимую процедуру, вы сможете увидеть все записи. Но если вы попытаетесь вставить, изменить или удалить что-либо, у вас ничего не получится. Теперь есть очень сложная вещь. Если вы проверите, вы увидите, что свойство ReadOnly всех полей установлено в True. Даже после того, как вы установите их в False, в реальной базе данных ничего не изменится, хотя вы можете редактировать DBGrid.

Итак, мы подошли к основной части. Как работало старое партнерство с Delphi-SQL Server, чтобы вы могли выполнять любые операции прямо из DBGrid? Ну, мы должны понимать, что нет магии. Если это SQL, то в SQL есть только один способ ВСТАВИТЬ, ОБНОВИТЬ и УДАЛИТЬ записи - это с помощью соответствующих операторов SQL. С Delphi-SQL Server, похоже, существует неявный оператор SQL, на который мы никогда не обращали внимания. Но с Oracle мы должны предоставлять свои собственные операторы для каждой операции. Если вы используете UniDac или ODAC, то в объекте StoredProc есть свойства SQLInsert, SQLUpdate, SQLDelete. Если вы хотите вставить запись через DBGrid, вам следует отредактировать ее свойство SQLInsert в

INSERT INTO EMPLOYEES VALUES(:EMPLOYEEID,:EMPLOYEENAME)

где следующие переменные: соответствуют т. Е. Полям хранимой процедуры. Они просто связывают переменные. При обновлении и удалении вам понадобится какое-то уникальное значение для представления конкретной записи. Первичный ключ - это один из вариантов (возможно, единственный вариант, поскольку я не смог понять, как использовать ROWID для той же цели). Так что операторы sql для UPDATE и DELETE будут

DELETE FROM EMPLOYEES WHERE EMPLOYEEID=:EMPLOYEEID

и

UPDATE EMPLOYEES SET EMPLOYEENAME=:EMPLOYEENAME WHERE EMPLOYEEID=:EMPLOYEEID

P.S. Я только что нашел способ использовать ROWID для обновления и удаления операторов. В вашей хранимой процедуре, если вы также выберете ROWID и дадите ему псевдоним, вы можете создать свои операторы UPDATE и DELETE, например:

UPDATE EMPLOYEES SET EMPLOYEENAME=:EMPLOYEENAME,..... WHERE ROWID=:RECORD_ROWID
DELETE FROM EMPLOYEES WHERE ROWID=:RECORD_ROWID

В предыдущих инструкциях RECORD_ROWID - это имя поля, возвращаемое из хранимой процедуры в результате наложения псевдонима ROWID. Если вместо этого вы используете: ROWID, вы получите сообщение об ошибке «ORA-01745: неверное имя хоста / переменной привязки». Это потому, что в переменной привязки двоеточие не может сопровождаться зарезервированным словом. И ROWID - зарезервированное слово.

3 голосов
/ 20 декабря 2011
  1. Oracle не поддерживает такую ​​функциональность.Таким образом, в Oracle вы не можете редактировать набор результатов, предоставленный хранимой процедурой, или включать хранимую процедуру в INSERT INTO <name>, UPDATE <name> или DELETE FROM <name>.
  2. Хотя для разработчиков SQL Server традиционно "всегда" используетсяхранимые процедуры (по многим причинам), это не традиционно для разработчиков Oracle.Но это возможно и с Oracle.Выполните поиск « REF CURSOR », чтобы узнать, как получать данные с помощью SP.И используйте обычный или упакованный (предпочтительный) SP для публикации обновлений в БД.Эта процедура будет получать старые / новые значения полей через аргументы.
  3. Я не могу точно сказать о UniDAC, я могу сказать о AnyDAC .Но я ожидаю, что UniDAC имеет аналогичную функциональность.Чтобы использовать SP для публикации обновлений, вам необходимо использовать компонент TXxxUpdateSQL .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...