then the guy is correct. that is a weakness in oracle's object oriented model. in c++ 
and java, you can override signatures. its different then overloading. 

having to add an additional flag can be tedious in a large project. you might want to 
open a TAR on this? Id like to see what the tech support guys say. If you do, please 
post what they say. 
> 
> From: "Nuno Souto" <[EMAIL PROTECTED]>
> Date: 2003/07/15 Tue AM 09:49:24 EDT
> To: Multiple recipients of list ORACLE-L <[EMAIL PROTECTED]>
> Subject: Re: AW: Object Types in PL/SQL
> 
> ----- Original Message ----- 
> > That is what I want to do. The object type compiles, but if I use it, 
> > PL/SQL tells me that it finds more than one constructors with that 
> > signature, which are the "hidden" default constructor and the one I 
> > implemented (I think). Now, that leaves me clueless, since it should be 
> > possible (manual says so) to override the default constructor from 9.2 on.
> > 
> > Any more ideas ?
> > 
> 
> I think the problem is that both the default constructor
> and your custom one have the same "signature".  Ie,
> they both have the same parameters, which is the way
> Oracle PL/SQL distinguishes between "overloaded"
> function and procedure calls.
> 
> What you need is to add a fake variable to your constructor
> so that it looks like this:
> 
> CONSTRUCTOR FUNCTION tVNR(piVNR VARCHAR2, my_fake NUMBER) 
> 
> and then ignore the darn thing (do nothing with it).
> That will make tVNR() constructor differ sufficiently 
> from the default one so Oracle considers it an overload
> for the default.  Don't forget that Oracle's default constructor
> is STILL available when you define your own.  The only way
> it gets distinguished is by the parameter list (name is 
> the same or else it ain't a constructor for the type!).
> 
> BTW this works also in 8i, it's not just 9i.
> 
> 
> Cheers
> Nuno Souto
> [EMAIL PROTECTED]
> 
> > Von: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
> > Gesendet: Dienstag, 15. Juli 2003 14:44
> > An: Multiple recipients of list ORACLE-L
> > Betreff: Re: AW: Object Types in PL/SQL
> > 
> > 
> > ok then i missed it. where is the overriding taking place? I saw a base
> > constructor.. where was the 'override'?
> > > 
> > > From: Stefan Jahnke <[EMAIL PROTECTED]>
> > > Hi
> > > 
> > > The anonnymous block at the bottom of my email is just a little test
> > driver.
> > > Basically, I don't use subtyping here. I just override the default
> > > constructor.
> > > If I don't implement a constructor at all, I would look like this:
> > > 
> > > CREATE OR REPLACE TYPE tVNR AS OBJECT
> > > (
> > >  
> > >   vVNR VARCHAR2(14),
> > >   
> > >   MEMBER FUNCTION getVNR 
> > >   RETURN VARCHAR2
> > >    
> > > ) INSTANTIABLE FINAL;
> > > 
> > > CREATE OR REPLACE TYPE BODY tVNR AS
> > > 
> > >   MEMBER FUNCTION getVNR RETURN VARCHAR2 IS
> > >   BEGIN
> > >     RETURN SELF.vVNR;
> > >   END;
> > > END;
> > > 
> > > And I would get a hidden, system provided default constructor.
> > > That would allow me to do the following (tested it):
> > > 
> > > declare
> > >   vVNR tVNR;
> > > begin
> > >   vVNR := new tVNR('12345678901');
> > >   dbms_output.put_line(vVNR.getVNR());
> > > end;
> > > 
> > > And I would get the output:
> > > 
> > > 12345678901
> > > 
> > > Unfortunately, that doesn't give me any control regarding the
> > initialization
> > > of vVNR.
> > > Explanation: VNR = "Versichertennummer", which is kind of the Swiss analog
> > > to the 
> > > US Social Security ID, only less unique ;).
> > > 
> > > We don't use Object Relational features IN the database. Just plain
> > > relational tables.
> > > What we would like to use are Object Types to encapsulate certain things
> > > like the above 
> > > shown VNR to ensure data integrity during data conversion for PL/SQL
> > > programs using 
> > > these types. It's more of a guideline where the developers are constrained
> > > to use the 
> > > types for certain stuff.
> > > 
> > > Enjoy your day,
> > > 
> > > Von: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
> > > Gesendet: Dienstag, 15. Juli 2003 14:05
> > > An: Multiple recipients of list ORACLE-L
> > > Betreff: Re: Object Types in PL/SQL
> > > 
> > > 
> > > if im reading your code right... looks like your overriding in an
> > anonymous
> > > block. in most OO languages overriding is done by a child class. i dont
> > see
> > > any subclassing here? didnt they add sub-types and 'extends' to 9.2? 
> > > 
> > > btw, are you using object oriented design in your database? How efficient
> > do
> > > you find that? 
> > > > 
> > > > From: Stefan Jahnke <[EMAIL PROTECTED]>
> > > > Date: 2003/07/15 Tue AM 06:49:25 EDT
> > > > To: Multiple recipients of list ORACLE-L <[EMAIL PROTECTED]>
> > > > Subject: Object Types in PL/SQL
> > > > 
> > > > Hi list
> > > > 
> > > > I have a problem regardint PL/SQL Object Types. According to the fine
> > > > manual, it should be 
> > > > possible to override the default constructor (I'm on 9.2.0.3.0 Win2k). I
> > > did
> > > > that, Object Type 
> > > > compiles without complaints:
> > > > 
> > > > CREATE OR REPLACE TYPE tVNR AS OBJECT
> > > > (
> > > >  
> > > >   vVNR VARCHAR2(14),
> > > >   
> > > >   CONSTRUCTOR FUNCTION tVNR(piVNR VARCHAR2) 
> > > >   RETURN SELF AS RESULT,
> > > >   
> > > >   MEMBER FUNCTION getVNR 
> > > >   RETURN VARCHAR2
> > > >   
> > > > ) INSTANTIABLE FINAL;
> > > > 
> > > > CREATE OR REPLACE TYPE BODY tVNR AS
> > > > 
> > > >   CONSTRUCTOR FUNCTION tVNR(piVNR VARCHAR2)
> > > >   RETURN SELF AS RESULT IS
> > > >   BEGIN
> > > >     IF (LENGTH(piVNR)=11) THEN
> > > >       SELF.vVNR := SUBSTR(piVNR,1,4) || '.' || SUBSTR(piVNR,5,4) || '.'
> > ||
> > > > SUBSTR(piVNR,9,3);
> > > >     ELSE
> > > >       SELF.vVNR := 'invalid';
> > > >     END IF;
> > > >     RETURN;
> > > >   END;
> > > > 
> > > >   MEMBER FUNCTION getVNR RETURN VARCHAR2 IS
> > > >   BEGIN
> > > >     RETURN SELF.vVNR;
> > > >   END;
> > > > END;
> > > > 
> > > > Now, everytime I want to create an object like this:
> > > > 
> > > > declare
> > > >   vVNR tVNR;
> > > > begin
> > > >   vVNR := new tVNR('12345678901');
> > > >   dbms_output.put_line(vVNR.getVNR());
> > > > end;
> > > > 
> > > > I get the following error message:
> > > > 
> > > > ERROR at line 4:
> > > > ORA-06550: line 4, column 15:
> > > > PLS-00307: too many declarations of 'TVNR' match this call
> > > > ORA-06550: line 4, column 3:
> > > > PL/SQL: Statement ignored
> > > > 
> > > > Looks to me like the PL/SQL enginge isn't able to distinguish the
> > default
> > > > constructor from the 
> > > > overridden (my) version, since they have the same signature (of course).
> > > > 
> > > > Any input ? I couldn't find ANY descenct hints in the fine manual or the
> > > > Feuerstein book :(.
> > > > 
> 
> 
> -- 
> Please see the official ORACLE-L FAQ: http://www.orafaq.net
> -- 
> Author: Nuno Souto
>   INET: [EMAIL PROTECTED]
> 
> Fat City Network Services    -- 858-538-5051 http://www.fatcity.com
> San Diego, California        -- Mailing list and web hosting services
> ---------------------------------------------------------------------
> To REMOVE yourself from this mailing list, send an E-Mail message
> to: [EMAIL PROTECTED] (note EXACT spelling of 'ListGuru') and in
> the message BODY, include a line containing: UNSUB ORACLE-L
> (or the name of mailing list you want to be removed from).  You may
> also send the HELP command for other information (like subscribing).
> 

-- 
Please see the official ORACLE-L FAQ: http://www.orafaq.net
-- 
Author: <[EMAIL PROTECTED]
  INET: [EMAIL PROTECTED]

Fat City Network Services    -- 858-538-5051 http://www.fatcity.com
San Diego, California        -- Mailing list and web hosting services
---------------------------------------------------------------------
To REMOVE yourself from this mailing list, send an E-Mail message
to: [EMAIL PROTECTED] (note EXACT spelling of 'ListGuru') and in
the message BODY, include a line containing: UNSUB ORACLE-L
(or the name of mailing list you want to be removed from).  You may
also send the HELP command for other information (like subscribing).

Reply via email to