Я написал функцию PL / SQL и использую Dynami c SQL для выполнения оператора триггера Create следующим образом: -
CREATE OR REPLACE FUNCTION register_driver1(driver_name IN VARCHAR, pass_word IN VARCHAR) RETURN NUMBER AS
sql_stmt VARCHAR2(500);
driver_id NUMBER;
new_view_name VARCHAR(50); --<-----Line 4
BEGIN
--function statements
sql_stmt := 'CREATE OR REPLACE TRIGGER reg_vehicle
INSTEAD OF INSERT ON '||new_view_name||
' FOR EACH ROW
DECLARE
vehicle_id NUMBER;
BEGIN
vehicle_id := vehicle_ids.nextval
INSERT INTO Vehicles VALUES(:NEW.Model, :NEW.Seats, :NEW.reg_no, vehicle_id, '||driver_id||');
END;';
EXECUTE IMMEDIATE sql_stmt; --<-----Line 32
--Remaining function body
END;
/
Здесь определены переменные new_view_name, driver_id
над этим фрагментом кода. Vehicle
- это таблица (Model, Seats, Reg_no, vehicel_id, driver_id)
, а reg_vehicle(Model, Seats, Reg_no)
- это представление, имеющее Vehicle
с определенного driver_id
.
vehicle_ids
- последовательность, созданная вне процедуры.
Выше показана ошибка компиляции в строке EXECUTE IMMEDIATE
. Как правильно это сделать?
Ошибка, отображаемая при вызове функции с некоторыми имя_драйвера и паролем: -
ORA-24344: success with compilation error ORA-06512: at "ADMIN.REGISTER_DRIVER1", line 32 ORA-06512: at line 4