2011-09-07 42 views

回答

8

您可以使用EXECUTE IMMEDIATE语法通过动态SQL发出DDL,例如“ALTER TRIGGER”语句。

那说明是在这里: http://download.oracle.com/docs/cd/B12037_01/appdev.101/b10807/13_elems017.htm

PROCEDURE myProcedure 
IS 
BEGIN 
    EXECUTE IMMEDIATE 'ALTER TRIGGER triggername DISABLE'; 

    -- Do work 

    EXECUTE IMMEDIATE 'ALTER TRIGGER triggername ENABLE'; 
EXCEPTION 
    WHEN OTHERS 
    THEN 
     -- Handle Exceptions 
END myProcedure; 

您可以构建使用VARCHAR变量的动态SQL太多,如果你喜欢:

PROCEDURE myProcedure 
IS 
    v_triggername VARCHAR2(30) := 'triggername'; 
BEGIN 
    EXECUTE IMMEDIATE 'ALTER TRIGGER '||v_triggername||' DISABLE'; 

    -- Do work 

    EXECUTE IMMEDIATE 'ALTER TRIGGER '||v_triggername||' ENABLE'; 
EXCEPTION 
    WHEN OTHERS 
    THEN 
     -- Handle Exceptions 
END myProcedure; 

如果你这样做,那么你也应该查看包DBMS_ASSERT来包装触发器名称,并帮助强化您的代码以防SQL注入攻击。

+0

这正是我想要的。 thx男人! – Giuseppe

+0

很高兴我能帮到你。 – Ollie

+10

@giuseppe要小心:修改触发器是ddl - >它会提交。 –

相关问题