如何使用代替触发器作为动态SQL编写PL / SQL过程?

问题描述 投票:0回答:1

我编写了一个PL / SQL函数,并且正在使用动态SQL来执行创建触发器语句,如下所示:-

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)是具有特定Vehicledriver_id个的视图。

[vehicle_ids是在过程外部创建的序列。

上面显示了EXECUTE IMMEDIATE行的编译错误。正确的方法是什么?

使用某些driver_name和password调用函数时显示的错误:-

ORA-24344: success with compilation error ORA-06512: at "ADMIN.REGISTER_DRIVER1", line 32 ORA-06512: at line 4

[我编写了一个PL / SQL函数,并且正在使用动态SQL执行创建触发器语句,如下所示:-创建或替换功能register_driver1(driver_name IN VARCHAR,pass_word IN VARCHAR)...

sql oracle plsql dynamic-sql
1个回答
0
投票
嗯,我不建议创建对象[[动态地
© www.soinside.com 2019 - 2024. All rights reserved.