oracle 存储过程与触发器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 存储过程与触发器相关的知识,希望对你有一定的参考价值。

//存储过程
create or replace procedure createTable_Sp
(
data_file out varchar,
tablespace_name out varchar,
v_sql out varchar
)
is
begin
data_file:='D:\test.dbf';
tablespace_name:='Test';
v_sql:='create tablespace'||tablespace_name||'
logging
datafile ""||data_file||""
size 32m
autoextend on
extent management local';
Execute Immediate v_sql;
end createTable_Sp;
//触发器
create or replace trigger create_tablespace
after insert
on student
for each row
begin
createTable_Sp();
end;
最后编译触发器时报错报错了,错误如下
错误:PLS-00306: 调用 'CREATETABLE_SP' 时参数个数或类型错误
有谁能解决??

触发器脚本中createTable_Sp();中没有用变量获取返回参数
修改成
data_file varchar(4000);
tablespace_name varchar(4000);
v_sql varchar(4000);
createTable_Sp(data_file ,tablespace_name ,v_sql );
参考技术A 括号里的东西写在is后面,用分号隔开 参考技术B 调用时没输入参数 ?

MYSQL和ORACLE的触发器与存储过程语法差异

整改了一番脚本,遇到了一些两种数据库之间的差异,记录一下:

触发器:

差异 MYSQL ORACLE 说明
创建语句不同 create trigger `AA` BEFORE INSERT on `BB` 
for each row 
create or replace trigger AA
  before insert or update or delete on BB
  for each row
1.Oracle可以在一个触发器触发insert,delete,update事件. 
   Mysql每个触发器只支持一个事件. 也就是说,目前每个trigger需要拆分成3个mysql trigger.
引用新旧数据不同 取得新数据NEW.aa
取得老数据OLD.bb
取得新数据:new.aa
取得老数据:old.bb
1.oracle 多一对冒号

 

 

 

 

 

 

存储过程:

差异 MYSQL ORACLE 说明
创建语句不同 DROP PROCEDURE IF EXISTS `SD_USER_P_ADD_USR`;
create procedure AA(
       aa varchar(100))
create or replace procedure AA(
   varchar aais

1.oracle创建语比较简洁,mysql要先执行drop

2.mysql先变量再类型,oracle相反,且不必限定长度

3.如果是number或varchar2的话不需要定义长度。否则编译不能通过

异常处理不一样 DECLARE EXIT HANDLER FOR  AAEXCEPTION 
 BEGIN
   ...
 END;
EXCEPTION
    WHEN OTHERS THEN
    ROLLBACK ;
    ....
1.mysql不能自定义异常,且使用内部异常时需要先定义
调用存储方式不同 call procedure(); procedure(); 1.调用方式不同

 

 

 

 

 

 

 

 

 

那么如何任性删除触发器呢:

declare   
 V_NUM number;   

BEGIN  

select count(0) into V_NUM from user_triggers where trigger_name = ‘AA‘; (注意大小写)

if V_NUM > 0 then   
    execute immediate ‘DROP TRIGGER  AA‘;   
    end if;

END;

以上是关于oracle 存储过程与触发器的主要内容,如果未能解决你的问题,请参考以下文章

Oracle数据库基本操作五——存储过程与触发器

Oracle Day09 存储与触发器

Oracle学习总结5-存储过程,存储函数,触发器

MYSQL和ORACLE的触发器与存储过程语法差异

Oracle 学习之触发器

oracle存储过程和存储函数&触发器