问各位大侠个问题啊
我写了个过程,用来建立触发器得
是这样写的
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呢?
大家帮忙啊!!
我写了个过程,用来建立触发器得
是这样写的
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呢?
大家帮忙啊!!
其次,在oracle中,给变量赋值必须放到begin end之间。roacle语句分3大块,声明、语句体、错误处理。oracle的存储过程可以单独写,也可以放到包中
存包中储过程的例子见:http://hi.baidu.com/zhao_e893/blog/item/5c7097356a9d8f1190ef3937.html
换成
select cc('a') into v_new from dual;
我建立一个这样的存储过程
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;
/
这样触发器是可以建立起来得..
换成
select cc('a') into v_new from dual;
这么修改后,这个地方是没问题了
不过后面动态sql的方法有问题
就要绑定变量了
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;
没有成功
好像这样动态创建不行啊 zhao_e893(好好学习,天天向上) ( ) 信誉:100 Blog 2006-12-18 13:48:54 得分: 0
首先,这种思路不对,在oracle,不能在存储过程中执行crate对象语句;
==========
这个观点我比较赞同
-------------------------------------------
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;
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缺少关键字
cc()是一个function
可以绑定变量
可是begin end 中间不能有create啊还是换个思路把
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 ;
可是执行的结果触发器是有错误的要把||''a''||改成'a'才过,
同样的问题...
select cc('a') from dual 没有办法解释出来