我想在具有用户定义数据类型的函数上使用参数,并在触发器中调用该函数

时间:2015-04-12 07:22:43

标签: function plsql triggers user-defined-types

1.我创建了我的数据类型" FechaHistorica"

 --1-
create or replace TYPE exper.FechaHistorica as object(
anio integer,
mes integer,
dia integer
);

2-我用我的用户数据类型

创建一个包含2列的表
CREATE TABLE exper.Persona(
persona varchar(20) not null,
nombre varchar(200) not null,
sexo varchar(1) not null,
fNacimiento ref FechaHistorica,
fMuerte ref FechaHistorica,
generales nclob,
constraint pkPersona primary key( persona ),
constraint chkSexo check( sexo = 'M' or sexo = 'm' or sexo = 'F' or sexo =   'f' )
);

3-在这个功能中,我尝试做的是通过Fnacimiento或FMuerte。在此函数中,如果comprobations将值标记为正确,则将值返回为0.

--2-
create or replace function Validar(objeto in FechaHistorica)
return integer is
some_variable integer;
vBandera boolean;
begin
if(objeto.anio = null and objeto.mes=null and objeto.dia=null ) then
some_variable:=0;
elsif(objeto.anio = null and objeto.mes<>null and objeto.dia<>null) then
some_variable:=1;
elsif(objeto.mes = null and objeto.dia<>null) then
some_variable:=1;
elsif(objeto.anio<>null and objeto.mes<>null and objeto.dia = null) then
some_variable:=0;
end if;

--Comprabar mes y día.
if(some_variable = 0) then
if((objeto.mes>12) or (objeto.mes <1)) then
some_variable:=1;
elsif((objeto.mes = 02) or (objeto.mes = 2)) then
If objeto.anio Mod 4 = 0 Then
  If (objeto.anio Mod 100 = 0) And Not (objeto.anio Mod 400 = 0) Then
    vBandera := False;
    if(objeto.dia>28) then
      some_variable:=1;
    END IF;
  Else
    vBandera := True;
    if(objeto.dia>29) then
      some_variable:=1;
        END IF;
      End If;
    Else
    vBandera := False;
    End If;
  End if;
End if;
return some_variable;
end;

4-在这个触发器中我想调用该函数,但是在调用函数时我得到错误的错误数量或类型的参数。我该怎么做才能纠正这个问题?

--3-
CREATE OR REPLACE TRIGGER exper.some_trigger 
  before insert or update on exper.Persona for each row
  BEGIN
  if Validar(:New.fNacimiento) = 0 
    then
    DBMS_OUTPUT.PUT_LINE('Fecha de Nacimiento Aceptada');
Else
    raise_application_error(-20001, 'Fecha de Nacimiento no aceptada');
  END IF;
  if Validar(:New.fMuerte) = 0 
    then
    DBMS_OUTPUT.PUT_LINE('Fecha de Muerte Aceptada');
  Else
    raise_application_error(-20002, 'Fecha de Muerte no aceptada');
  END IF;
  END some_trigger;

1 个答案:

答案 0 :(得分:0)

删除表定义中的“REF”。

CREATE TABLE Persona(
persona varchar(20) not null,
nombre varchar(200) not null,
sexo varchar(1) not null,
fNacimiento FechaHistorica,
fMuerte  FechaHistorica,
generales nclob,
constraint pkPersona primary key( persona ),
constraint chkSexo check( sexo = 'M' or sexo = 'm' or sexo = 'F' or sexo =   'f' )
);

只是想知道:为什么使用Object而不是Date列?