Nuovo tipo in PL / SQL
Domanda
ho bisogno di memorizzare creare un nuovo tipo di numeri razionali rappresentati al numeratore / denominatore per la memorizzazione di frazioni come 3/5. Ho trovato il seguente per farlo.
CREATE TYPE Rational AS OBJECT (
num INTEGER,
den INTEGER,
MAP MEMBER FUNCTION convert RETURN REAL,
MEMBER PROCEDURE normalize,
MEMBER FUNCTION reciprocal RETURN Rational,
MEMBER FUNCTION plus (x Rational) RETURN Rational,
MEMBER FUNCTION less (x Rational) RETURN Rational,
MEMBER FUNCTION times (x Rational) RETURN Rational,
MEMBER FUNCTION divby (x Rational) RETURN Rational,
PRAGMA RESTRICT_REFERENCES (DEFAULT, RNDS,WNDS,RNPS,WNPS)
);
Come posso aggiungere una contraint che il denominatore non può essere zero.
Soluzione
È necessario dichiarare un costruttore per il vostro tipo. Poi si può mettere quello che ti piace di convalida nel corpo.
CREATE TYPE Rational AS OBJECT (
num INTEGER,
den INTEGER,
MAP MEMBER FUNCTION convert RETURN REAL,
MEMBER PROCEDURE normalize,
MEMBER FUNCTION reciprocal RETURN Rational,
MEMBER FUNCTION plus (x Rational) RETURN Rational,
MEMBER FUNCTION less (x Rational) RETURN Rational,
MEMBER FUNCTION times (x Rational) RETURN Rational,
MEMBER FUNCTION divby (x Rational) RETURN Rational,
constructor function rational
(n integer, d integer)
return self as result,
PRAGMA RESTRICT_REFERENCES (DEFAULT, RNDS,WNDS,RNPS,WNPS)
);
Nel vostro corpo tipo di aggiungere il codice del costruttore:
constructor function rational
(n integer, d integer)
return self as result
is
begin
if d = 0 then
raise_application_error(-20000, 'Denominator cannot be zero!');
end if;
self.num := n;
self.den := d;
end rational;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow