ОК, здесь я отвечаю на вопрос, хотя вижу, что в последнее время очень немногие имеют дело с 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 - зарезервированное слово.