问各位大侠个问题啊 
我写了个过程,用来建立触发器得
是这样写的 
create or replace procedure create_trigger as
declare v_new   char(100);
v_new := select cc('a') from dual;
begin
execute immediate'
create or replace trigger aaa
before insert or update or delete on a
for each row
begin
insert into b(q) values(v_new);
end;';
end create_trigger;
可是这样编译同不过,问题 就是那个函数...
我应该怎么 样把select cc('a') from dual 得值赋给变量v_new呢?
大家帮忙啊!!

解决方案 »

  1.   

    select cc('a') into v_new from dual;  呢
      

  2.   

    首先,这种思路不对,在oracle,不能在存储过程中执行crate对象语句;
       其次,在oracle中,给变量赋值必须放到begin end之间。roacle语句分3大块,声明、语句体、错误处理。oracle的存储过程可以单独写,也可以放到包中
       存包中储过程的例子见:http://hi.baidu.com/zhao_e893/blog/item/5c7097356a9d8f1190ef3937.html
      

  3.   

    select cc('a') from dual
    换成
    select cc('a') into v_new from dual;
      

  4.   

    可以得呀
    我建立一个这样的存储过程
    create or replace procedure create_trigger as
    begin
    execute immdiate'
    create or replace trigger aaa
    before insert or update or delete 
    on a
    for each row
    begin
    insert into b(q) values (user);
    end;';
    end create_trigger;
    执行是这样的
    begin
    create_trigger;
    end;
    /
    这样触发器是可以建立起来得..
      

  5.   

    lz要用动态pl/sql的方法select cc('a') from dual
    换成
    select cc('a') into v_new from dual;
    这么修改后,这个地方是没问题了
    不过后面动态sql的方法有问题
      

  6.   

    v_new  后面都没有用上阿不好意思啊,我看错了 看成了insert into b(q) values (v_new);
      

  7.   

    如果后面动态创建触发器里面用v_new,就不能用上面的方法了
      

  8.   

    select cc('a') into v_new from dual;后面直接用v_new
      

  9.   

    如果后面动态创建触发器里面用v_new,
    就要绑定变量了
      

  10.   

    我需要在create trigger 里面用到变量v_new,且它的值是由select cc('a') from dual;来得
      

  11.   

    EXECUTE IMMEDIATE sqlpro USING 变量;
      

  12.   

    参考一下
    CREATE OR REPLACE PROCEDURE ll_03 IS
    tmpVar NUMBER;
    sqlpro VARCHAR2(100);
    p_cursor sys_refcursor;
    v_area VARCHAR2(20);
    BEGIN
       
       DBMS_OUTPUT.PUT_LINE('ll03');
       tmpvar:=1;
       IF tmpvar=1 THEN 
           sqlpro:='begin ll_01; end;';
       END IF;
      
       EXECUTE IMMEDIATE sqlpro;
       tmpvar:=2;
       IF tmpvar=2 THEN 
           sqlpro:='begin ll_02(:1) ; end;';
       END IF;
       DBMS_OUTPUT.PUT_LINE(sqlpro);
       EXECUTE IMMEDIATE sqlpro USING OUT p_cursor;END ll_03;
      

  13.   

    我测试了一下
    没有成功
    好像这样动态创建不行啊 zhao_e893(好好学习,天天向上) ( ) 信誉:100    Blog  2006-12-18 13:48:54  得分: 0  
     
     
       首先,这种思路不对,在oracle,不能在存储过程中执行crate对象语句;  
     
    ==========
    这个观点我比较赞同
      

  14.   

    这样倒是可以 CREATE TABLE ll_0001(col1 NUMBER(20))
    -------------------------------------------
    CREATE OR REPLACE PROCEDURE ll_07 AS
     v_new   NUMBER;
    v_sql VARCHAR2(200);
    BEGIN
    SELECT Etam.fn_get_no() INTO v_new FROM dual;
    v_sql:='CREATE OR REPLACE TRIGGER aaa
    BEFORE INSERT OR UPDATE OR DELETE 
    ON ll_0001
    FOR EACH ROW
    BEGIN
    INSERT INTO ll_0001(col1) SELECT Etam.fn_get_no()  FROM dual;
    END;';
    DBMS_OUTPUT.PUT_LINE(v_sql);
    EXECUTE IMMEDIATE v_sql ;
    END ll_07;
      

  15.   

    我是这样写得
    create or replace procedure create_trigger as
    v_new   char(100);
    v_sql   varchar2(1000);
    begin
    select cc('a') into v_new from dual;
    v_sql := 'create or repalce trigger aaa before insert or update or delete on a for each row begin insert into b(q) values(v_new);end;';
    dbms_output.put_line(v_sql);
    execute immediate v_sql;
    end create_trigger;
    可是在执行得时候报错说ora-00905缺少关键字
      

  16.   

    这样肯定不行 insert into b(q) values(v_new);v_new的值根本没有带进去
      

  17.   

    select cc('a') into v_new from dual;cc('a')  这个输入参数也是变量么
      

  18.   

    a是一个参数..
    cc()是一个function
      

  19.   

    动态pl/sql要以begin开头,end;结束
    可以绑定变量
    可是begin   end  中间不能有create啊还是换个思路把
      

  20.   

    v_sql:='CREATE OR REPLACE TRIGGER aaa
    BEFORE INSERT OR UPDATE OR DELETE 
    ON ll_0001
    FOR EACH ROW
    BEGIN
    INSERT INTO ll_0001(col1) SELECT cc('a') FROM dual;
    END;';
    EXECUTE IMMEDIATE v_sql ;
      

  21.   

    'a'要改成这样的过程才对||''a''||
    可是执行的结果触发器是有错误的要把||''a''||改成'a'才过,
    同样的问题...
    select cc('a') from dual 没有办法解释出来