Re: SDriverOracle OffesetStrategy

anthony berglas <[email protected]> Tue, 5 Feb 2013 09:40:39 +1000
Newsgroups gmane.comp.java.orm.simpleorm
Message-ID <CA+_PZMdbn7-9t1G6rCkXgaSxob7Orm_P1_2Xera6HocihwZJUw@mail.gmail.com>
--f46d04479f9541c7ad04d4eea1ba
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Again well done.

Again, it amazes me after all these years that Oracle does not support
these facilities more easily.  Why put up a barrier for people to migrate
to Oracle!

Anthony

On Tue, Feb 5, 2013 at 4:01 AM, Franck Routier <[email protected]>wr=
ote:

>  Hi,
>
> this has been a long process... but I finally implemented a QUERY
> OffsetStrategy for SDriverOracle that uses Oracle's native rownum idiom.
> I had to slightly modify the signature of the limitSQL() method, but this
> was worth the effort:
> I have a real life example where I read 1 million rows with a 15000 limit
> size, do some deduplication, and insert into another table.
> Before this modification, it took 54 minutes on Postgresql (on a slightly
> slower server), but 2 hours and 25 minutes on Oracle (and even 2h38 witho=
ut
> batch updates)...
> Query time was getting longer and longer as the offset increased...
>
> After the modification, Oracle takes only 43 minutes !
>
> Comments are welcome,
>
> Franck
>
>
> Le 03/10/2010 02:20, [email protected] a =E9crit :
>
>
>
> Hello Franck,
>
> It amazes me that Oracle does not support scrollable cursors in the
> database, but there you are. Could you please add a short comment to the
> change explaining why you did it.
>
> There never has been a standard way to do this in traditional SQL. The
> Oracle ROWNUM is actually more general than than Limit/Offset -- eg. you
> could retrieve every 10th row for sampling, or use it to detect duplicate
> rows, pick the "best" etc. If someone is interested it would not be that
> hard to wrap our queries with SELECT * FROM <original query> WHERE
> ROWNUM.... However, it would not be trivial.
>
> SQL 2003 implements a very magic CURRENT_ROW() function which is supporte=
d
> by Oracle and MSSQL, but not much else that I can tell. I would avoid it =
as
> it is complex and therefore more likely to have issues. (It is amazing th=
at
> the incredibly complex SQL 92 & 99 did not address these very basic issue=
s!)
>
> (Before MSSQL introduced CURRENT_ROW it was just about impossible to get
> at any row number, eg. to remove duplicate rows.)
>
> Thanks for the fix,
>
> Anthony
>
> At 02:21 AM 2/10/2010, Franck Routier wrote:
> >
> >
> >I have set SDriverOracle offsetStrategy to SCAN, ie let Simpleorm drop
> >records we want to skip. Anyway, this is already what Oracle driver is
> >doing (but instead of dropping the records, it keeps them in a cache
> >that eats all memory...).
> >
> >At least, this will always work.
> >
> >Franck
> >
> >Le vendredi 01 octobre 2010 =C3 15:42 +0200, Franck Routier a =C3=A9crit=
 :
> >>
> >> Yes, I also found this :
> >>
> >> <
> http://stackoverflow.com/questions/595123/is-there-an-ansi-sql-alternativ=
e-to-the-mysql-limit-keyword
> >
> http://stackoverflow.com/questions/595123/is-there-an-ansi-sql-alternativ=
e-to-the-mysql-limit-keyword
> >>
> >> Oracle seems to be one of the worse database regarding this issue.
> >> But the rownum path is not easy in Simpleorm, as it won't fit in the
> >> sql
> >> structure that we rely on...
> >>
> >> Le vendredi 01 octobre 2010 =C3 15:01 +0200, Noel Grandin a =C3=A9crit=
 :
> >> >
> >> > these 2 links have some solutions:
> >> >
> >> > <http://www.club-oracle.com/forums/limit-clause-for-oracle-sql-t637/=
>
> http://www.club-oracle.com/forums/limit-clause-for-oracle-sql-t637/
> >> > http://www.delphifaq.com/faq/databases/oracle/f594.shtml
> >> >
> >> > the basic syntax looks like this:
> >> >
> >> > select *
> >> > from (
> >> > select rownum rnum, a.*
> >> > from (your_query) a
> >> > where rownum <=3D :M )
> >> > where rnum >=3D :N;
> >> >
> >> > in order to get rows n through m from 'your query.'
> >> >
> >> > -- Noel.
> >> >
> >> > Franck Routier wrote:
> >> > >
> >> > >
> >> > > Seems I spoke too quickly. Oracle does not seem to support the
> >> ansi
> >> > > (2008) "OFFSET x FETCH y ROWS" syntax, nor any proprietary syntax
> >> to
> >> > > do
> >> > > that...
> >> > >
> >> > > Le vendredi 01 octobre 2010 =C3 13:55 +0200, Franck Routier a
> >> =C3=A9crit :
> >> > > >
> >> > > > Hi,
> >> > > >
> >> > > > I am bitten by an oom exception using offset/limit with
> >> > > SDriverOracle.
> >> > > > The driver uses SDriver.OffsetStrategy.JDBC. The was done
> >> assuming
> >> > > > (from
> >> > > > various reading but without any evidence) that the Oracle Driver
> >> > > was
> >> > > > smart enought to use a cursor on the server side to handle this.
> >> > > >
> >> > > > But I definitely get an oom caused by OracleResultCacheImpl
> >> eating
> >> > > all
> >> > > > memory.
> >> > > >
> >> > > > So I searched again and found this, on
> >> > > >
> >> > >
> >> <
> http://download.oracle.com/docs/cd/B28359_01/java.111/b31224/resltset.htm=
#CIHCHBJB
> >
> http://download.oracle.com/docs/cd/B28359_01/java.111/b31224/resltset.htm=
#CIHCHBJB
> >> > > >
> >> > > > "Oracle JDBC Implementation for Result Set Scrollability
> >> > > >
> >> > > > Because the underlying server does not support scrollable
> >> cursors,
> >> > > > (sic!) Oracle JDBC must implement scrollability in a separate
> >> > > layer.
> >> > > >
> >> > > > It is important to be aware that this is accomplished by using a
> >> > > > client-side memory cache to store rows of a scrollable result
> >> set.
> >> > > >
> >> > > > Important:
> >> > > > Because all rows of any scrollable result set are stored in the
> >> > > > client-side cache, a situation where the result set contains
> >> many
> >> > > > rows,
> >> > > > many columns, or very large columns might cause the client-side
> >> > > Java
> >> > > > Virtual Machine (JVM) to fail. Do not specify scrollability for
> >> a
> >> > > > large
> >> > > > result set."
> >> > > >
> >> > > > So it seems that Oracle is not any smarter than Postgresql is,
> >> and
> >> > > > that
> >> > > > resorting to a limit clause in the sql
> >> > > (SDriver.OffsetStrategy.QUERY)
> >> > > > would be a better solution for Oracle as well.
> >> > > >
> >> > > > So I propose to change the SDriverOracle to implement this
> >> > > strategy.
> >> > > > Does it sound ok ?
> >> > > >
> >> > > > Franck
> >> > > >
> >> > > >
> >> > > >
> >> > > >
> >> > > >
> >> > >
> >> > > --
> >> > > Franck Routier
> >> > > Logo Ax=C3=A8ge
> >> > > Ax=C3=A8ge
> >> > > 23,rue Saint-Simon
> >> > > 63000 Clermont-Ferrand
> >> > > T=C3=A9l: +33 (0)4 63 05 95 40
> >> > > Fax: +33 (0)4 73 70 65 29
> >> > > Email: <mailto:franck.routier%40axege.com><franck.routier%40axege.=
com>
> [email protected]
> >> > >
> >> > >
> >> > >
> >> > >
> >> >
> >> >
> >> >
> >> >
> >> > __________________________________________________________
> >> > Disclaimer: <http://www.peralex.com/disclaimer.html>
> http://www.peralex.com/disclaimer.html
> >> >
> >> >
> >> >
> >> >
> >> >
> >>
> >> --
> >> Franck Routier
> >> Logo Ax=C3=A8ge
> >> Ax=C3=A8ge
> >> 23,rue Saint-Simon
> >> 63000 Clermont-Ferrand
> >> T=C3=A9l: +33 (0)4 63 05 95 40
> >> Fax: +33 (0)4 73 70 65 29
> >> Email: <mailto:franck.routier%40axege.com> <franck.routier%40axege.com=
>
> [email protected]
> >>
> >>
> >>
> >>
> >>
> >
> >--
> >Franck Routier
> >Logo Ax=C3=A8ge
> >Ax=C3=A8ge
> >23,rue Saint-Simon
> >63000 Clermont-Ferrand
> >T=C3=A9l: +33 (0)4 63 05 95 40
> >Fax: +33 (0)4 73 70 65 29
> >Email: <mailto:franck.routier%40axege.com> <franck.routier%40axege.com>
> [email protected]
> >
> >
>
> Spreadsheet Detective,
> Southern Cross Software Queensland Pty Limited
> 54 Gerler Street
> Bardon, Queensland 4065, Australia.
>
> Email: [email protected]
> www.SpreadsheetDetective.com
> Ph: +61 427 830248 (Australian Eastern Standard Time)
>
> "If the model seems correct only because the numbers look right,
> then why build the model in the first place?"
>
>
>


--=20

Dr Anthony Berglas, [email protected]       Mobile: +61 4 4838 8874
Just because it is possible to push twigs along the ground with ones nose
does not necessarily mean that that is the best way to collect firewood.

--f46d04479f9541c7ad04d4eea1ba
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable





<head>

<style type=3D"text/css">
<!--

/* start of attachment style */
       .ygrp-photo-title{
         clear: both;
         font-size: smaller;
         height: 15px;
         overflow: hidden;
         text-align: center;
         width: 75px;
       }
       div.ygrp-photo{
         background-position: center;
         background-repeat: no-repeat;
         background-color: white;
         border: 1px solid black;
         height: 62px;
         width: 62px;
       }

       div.photo-title=20
         a,
         div.photo-title a:active,
         div.photo-title a:hover,
         div.photo-title a:visited {
           text-decoration: none;=20
       }

       div.attach-table div.attach-row {
         clear: both;
       }

       div.attach-table div.attach-row div {
         float: left;
         /* margin: 2px;*/
       }

       p {
         clear: both;
         padding: 15px 0 3px 0;
	 overflow: hidden;
       }

       div.ygrp-file {
         width: 30px;
         valign: middle;
       }
       div.attach-table div.attach-row div div a {
         text-decoration: none;
       }

       div.attach-table div.attach-row div div span {
         font-weight: normal;
       }

       div.ygrp-file-title {
         font-weight: bold;
       }
 /* end of attachment style */
        -->
        </style>
        </head>
<html>
<head>
<style type=3D"text/css">
<!--
#ygrp-mkp {
  border: 1px solid #d8d8d8;
  font-family: Arial;
  margin: 10px 0;
  padding: 0 10px;
}

#ygrp-mkp hr {
  border: 1px solid #d8d8d8;
}

#ygrp-mkp #hd {
  color: #628c2a;
  font-size: 85%;
  font-weight: 700;
  line-height: 122%;
  margin: 10px 0;
}

#ygrp-mkp #ads {
  margin-bottom: 10px;
}

#ygrp-mkp .ad {
  padding: 0 0;
}

#ygrp-mkp .ad p {
  margin: 0;
}

#ygrp-mkp .ad a {
  color: #0000ff;
  text-decoration: none;
}
-->
</style>
</head>
<body>





Again well done.<div><br></div><div>Again, it amazes me after all these yea=
rs that Oracle does not support these facilities more easily. =A0Why put up=
 a barrier for people to migrate to Oracle!</div><div><br></div><div>Anthon=
y<br>

<br><div class=3D"gmail_quote">On Tue, Feb 5, 2013 at 4:01 AM, Franck Routi=
er <span dir=3D"ltr">&lt;<a href=3D"mailto:[email protected]" target=
=3D"_blank">[email protected]</a>&gt;</span> wrote:<br><blockquote c=
lass=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;=
padding-left:1ex">


=20=20
=20=20=20=20
=20=20
  <div text=3D"#000000" bgcolor=3D"#FFFFFF">
    <div>Hi,<br>
      <br>
      this has been a long process... but I finally implemented a QUERY
      OffsetStrategy for SDriverOracle that uses Oracle&#39;s native rownum
      idiom.<br>
      I had to slightly modify the signature of the limitSQL() method,
      but this was worth the effort:<br>
      I have a real life example where I read 1 million rows with a
      15000 limit size, do some deduplication, and insert into another
      table.<br>
      Before this modification, it took 54 minutes on Postgresql (on a
      slightly slower server), but 2 hours and 25 minutes on Oracle (and
      even 2h38 without batch updates)...<br>
      Query time was getting longer and longer as the offset
      increased...<br>
      <br>
      After the modification, Oracle takes only 43 minutes !<br>
      <br>
      Comments are welcome,<br>
      <br>
      Franck<br>
      <br>
      <br>
      Le 03/10/2010 02:20, <a href=3D"mailto:[email protected]=
om" target=3D"_blank">[email protected]</a> a =E9crit=A0:<br=
>
    </div>
    <blockquote type=3D"cite">
      <span>=A0</span>
=20=20=20=20=20=20
          <div>
            <p>Hello Franck,<br>
              <br>
              It amazes me that Oracle does not support scrollable
              cursors in the database, but there you are. Could you
              please add a short comment to the change explaining why
              you did it.<br>
              <br>
              There never has been a standard way to do this in
              traditional SQL. The Oracle ROWNUM is actually more
              general than than Limit/Offset -- eg. you could retrieve
              every 10th row for sampling, or use it to detect duplicate
              rows, pick the &quot;best&quot; etc. If someone is interested=
 it
              would not be that hard to wrap our queries with SELECT *
              FROM &lt;original query&gt; WHERE ROWNUM.... However, it
              would not be trivial.<br>
              <br>
              SQL 2003 implements a very magic CURRENT_ROW() function
              which is supported by Oracle and MSSQL, but not much else
              that I can tell. I would avoid it as it is complex and
              therefore more likely to have issues. (It is amazing that
              the incredibly complex SQL 92 &amp; 99 did not address
              these very basic issues!)<br>
              <br>
              (Before MSSQL introduced CURRENT_ROW it was just about
              impossible to get at any row number, eg. to remove
              duplicate rows.)<br>
              <br>
              Thanks for the fix,<br>
              <br>
              Anthony<br>
              <br>
              At 02:21 AM 2/10/2010, Franck Routier wrote:<br>
              &gt; <br>
              &gt;<br>
              &gt;I have set SDriverOracle offsetStrategy to SCAN, ie
              let Simpleorm drop<br>
              &gt;records we want to skip. Anyway, this is already what
              Oracle driver is<br>
              &gt;doing (but instead of dropping the records, it keeps
              them in a cache<br>
              &gt;that eats all memory...).<br>
              &gt;<br>
              &gt;At least, this will always work.<br>
              &gt;<br>
              &gt;Franck<br>
              &gt;<br>
              &gt;Le vendredi 01 octobre 2010 =C3 15:42 +0200, Franck
              Routier a =C3=A9crit :<br>
              &gt;&gt; <br>
              &gt;&gt; Yes, I also found this :<br>
              &gt;&gt; <br>
              &gt;&gt; &lt;<a href=3D"http://stackoverflow.com/questions/59=
5123/is-there-an-ansi-sql-alternative-to-the-mysql-limit-keyword" target=3D=
"_blank">http://stackoverflow.com/questions/595123/is-there-an-ansi-sql-alt=
ernative-to-the-mysql-limit-keyword</a>&gt;<a href=3D"http://stackoverflow.=
com/questions/595123/is-there-an-ansi-sql-alternative-to-the-mysql-limit-ke=
yword" target=3D"_blank">http://stackoverflow.com/questions/595123/is-there=
-an-ansi-sql-alternative-to-the-mysql-limit-keyword</a><br>


              &gt;&gt; <br>
              &gt;&gt; Oracle seems to be one of the worse database
              regarding this issue.<br>
              &gt;&gt; But the rownum path is not easy in Simpleorm, as
              it won&#39;t fit in the<br>
              &gt;&gt; sql<br>
              &gt;&gt; structure that we rely on...<br>
              &gt;&gt; <br>
              &gt;&gt; Le vendredi 01 octobre 2010 =C3 15:01 +0200, Noel
              Grandin a =C3=A9crit :<br>
              &gt;&gt; &gt; <br>
              &gt;&gt; &gt; these 2 links have some solutions:<br>
              &gt;&gt; &gt; <br>
              &gt;&gt; &gt; &lt;<a href=3D"http://www.club-oracle.com/forum=
s/limit-clause-for-oracle-sql-t637/" target=3D"_blank">http://www.club-orac=
le.com/forums/limit-clause-for-oracle-sql-t637/</a>&gt;<a href=3D"http://ww=
w.club-oracle.com/forums/limit-clause-for-oracle-sql-t637/" target=3D"_blan=
k">http://www.club-oracle.com/forums/limit-clause-for-oracle-sql-t637/</a><=
br>


              &gt;&gt; &gt; <a href=3D"http://www.delphifaq.com/faq/databas=
es/oracle/f594.shtml" target=3D"_blank">http://www.delphifaq.com/faq/databa=
ses/oracle/f594.shtml</a><br>
              &gt;&gt; &gt; <br>
              &gt;&gt; &gt; the basic syntax looks like this:<br>
              &gt;&gt; &gt; <br>
              &gt;&gt; &gt; select * <br>
              &gt;&gt; &gt; from ( <br>
              &gt;&gt; &gt; select rownum rnum, a.* <br>
              &gt;&gt; &gt; from (your_query) a <br>
              &gt;&gt; &gt; where rownum &lt;=3D :M ) <br>
              &gt;&gt; &gt; where rnum &gt;=3D :N; <br>
              &gt;&gt; &gt; <br>
              &gt;&gt; &gt; in order to get rows n through m from &#39;your
              query.&#39;<br>
              &gt;&gt; &gt; <br>
              &gt;&gt; &gt; -- Noel.<br>
              &gt;&gt; &gt; <br>
              &gt;&gt; &gt; Franck Routier wrote: <br>
              &gt;&gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; Seems I spoke too quickly. Oracle does
              not seem to support the<br>
              &gt;&gt; ansi<br>
              &gt;&gt; &gt; &gt; (2008) &quot;OFFSET x FETCH y ROWS&quot; s=
yntax,
              nor any proprietary syntax<br>
              &gt;&gt; to<br>
              &gt;&gt; &gt; &gt; do<br>
              &gt;&gt; &gt; &gt; that...<br>
              &gt;&gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; Le vendredi 01 octobre 2010 =C3 13:55
              +0200, Franck Routier a<br>
              &gt;&gt; =C3=A9crit :<br>
              &gt;&gt; &gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; &gt; Hi,<br>
              &gt;&gt; &gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; &gt; I am bitten by an oom exception
              using offset/limit with<br>
              &gt;&gt; &gt; &gt; SDriverOracle.<br>
              &gt;&gt; &gt; &gt; &gt; The driver uses
              SDriver.OffsetStrategy.JDBC. The was done<br>
              &gt;&gt; assuming<br>
              &gt;&gt; &gt; &gt; &gt; (from<br>
              &gt;&gt; &gt; &gt; &gt; various reading but without any
              evidence) that the Oracle Driver<br>
              &gt;&gt; &gt; &gt; was<br>
              &gt;&gt; &gt; &gt; &gt; smart enought to use a cursor on
              the server side to handle this.<br>
              &gt;&gt; &gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; &gt; But I definitely get an oom caused
              by OracleResultCacheImpl<br>
              &gt;&gt; eating<br>
              &gt;&gt; &gt; &gt; all<br>
              &gt;&gt; &gt; &gt; &gt; memory.<br>
              &gt;&gt; &gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; &gt; So I searched again and found
              this, on<br>
              &gt;&gt; &gt; &gt; &gt;<br>
              &gt;&gt; &gt; &gt;<br>
              &gt;&gt; &lt;<a href=3D"http://download.oracle.com/docs/cd/B2=
8359_01/java.111/b31224/resltset.htm#CIHCHBJB" target=3D"_blank">http://dow=
nload.oracle.com/docs/cd/B28359_01/java.111/b31224/resltset.htm#CIHCHBJB</a=
>&gt;<a href=3D"http://download.oracle.com/docs/cd/B28359_01/java.111/b3122=
4/resltset.htm#CIHCHBJB" target=3D"_blank">http://download.oracle.com/docs/=
cd/B28359_01/java.111/b31224/resltset.htm#CIHCHBJB</a><br>


              &gt;&gt; &gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; &gt; &quot;Oracle JDBC Implementation for
              Result Set Scrollability<br>
              &gt;&gt; &gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; &gt; Because the underlying server does
              not support scrollable<br>
              &gt;&gt; cursors,<br>
              &gt;&gt; &gt; &gt; &gt; (sic!) Oracle JDBC must implement
              scrollability in a separate<br>
              &gt;&gt; &gt; &gt; layer.<br>
              &gt;&gt; &gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; &gt; It is important to be aware that
              this is accomplished by using a<br>
              &gt;&gt; &gt; &gt; &gt; client-side memory cache to store
              rows of a scrollable result<br>
              &gt;&gt; set.<br>
              &gt;&gt; &gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; &gt; Important:<br>
              &gt;&gt; &gt; &gt; &gt; Because all rows of any scrollable
              result set are stored in the<br>
              &gt;&gt; &gt; &gt; &gt; client-side cache, a situation
              where the result set contains<br>
              &gt;&gt; many<br>
              &gt;&gt; &gt; &gt; &gt; rows,<br>
              &gt;&gt; &gt; &gt; &gt; many columns, or very large
              columns might cause the client-side<br>
              &gt;&gt; &gt; &gt; Java<br>
              &gt;&gt; &gt; &gt; &gt; Virtual Machine (JVM) to fail. Do
              not specify scrollability for<br>
              &gt;&gt; a<br>
              &gt;&gt; &gt; &gt; &gt; large<br>
              &gt;&gt; &gt; &gt; &gt; result set.&quot;<br>
              &gt;&gt; &gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; &gt; So it seems that Oracle is not any
              smarter than Postgresql is,<br>
              &gt;&gt; and<br>
              &gt;&gt; &gt; &gt; &gt; that<br>
              &gt;&gt; &gt; &gt; &gt; resorting to a limit clause in the
              sql<br>
              &gt;&gt; &gt; &gt; (SDriver.OffsetStrategy.QUERY)<br>
              &gt;&gt; &gt; &gt; &gt; would be a better solution for
              Oracle as well.<br>
              &gt;&gt; &gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; &gt; So I propose to change the
              SDriverOracle to implement this<br>
              &gt;&gt; &gt; &gt; strategy.<br>
              &gt;&gt; &gt; &gt; &gt; Does it sound ok ?<br>
              &gt;&gt; &gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; &gt; Franck<br>
              &gt;&gt; &gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; -- <br>
              &gt;&gt; &gt; &gt; Franck Routier <br>
              &gt;&gt; &gt; &gt; Logo Ax=C3=A8ge<br>
              &gt;&gt; &gt; &gt; Ax=C3=A8ge<br>
              &gt;&gt; &gt; &gt; 23,rue Saint-Simon<br>
              &gt;&gt; &gt; &gt; 63000 Clermont-Ferrand<br>
              &gt;&gt; &gt; &gt; T=C3=A9l: <a href=3D"tel:%2B33%20%280%294%=
2063%2005%2095%2040" value=3D"+33463059540" target=3D"_blank">+33 (0)4 63 0=
5 95 40</a><br>
              &gt;&gt; &gt; &gt; Fax: <a href=3D"tel:%2B33%20%280%294%2073%=
2070%2065%2029" value=3D"+33473706529" target=3D"_blank">+33 (0)4 73 70 65 =
29</a><br>
              &gt;&gt; &gt; &gt; Email:
              <a href=3D"mailto:franck.routier%40axege.com" target=3D"_blan=
k">&lt;mailto:franck.routier%40axege.com&gt;</a><a href=3D"mailto:franck.ro=
utier%40axege.com" target=3D"_blank">[email protected]</a><br>
              &gt;&gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; <br>
              &gt;&gt; &gt; &gt; <br>
              &gt;&gt; &gt; <br>
              &gt;&gt; &gt; <br>
              &gt;&gt; &gt; <br>
              &gt;&gt; &gt; <br>
              &gt;&gt; &gt;
              __________________________________________________________<br=
>
              &gt;&gt; &gt; Disclaimer: &lt;<a href=3D"http://www.peralex.c=
om/disclaimer.html" target=3D"_blank">http://www.peralex.com/disclaimer.htm=
l</a>&gt;<a href=3D"http://www.peralex.com/disclaimer.html" target=3D"_blan=
k">http://www.peralex.com/disclaimer.html</a><br>


              &gt;&gt; &gt; <br>
              &gt;&gt; &gt; <br>
              &gt;&gt; &gt; <br>
              &gt;&gt; &gt; <br>
              &gt;&gt; &gt; <br>
              &gt;&gt; <br>
              &gt;&gt; -- <br>
              &gt;&gt; Franck Routier <br>
              &gt;&gt; Logo Ax=C3=A8ge<br>
              &gt;&gt; Ax=C3=A8ge<br>
              &gt;&gt; 23,rue Saint-Simon<br>
              &gt;&gt; 63000 Clermont-Ferrand<br>
              &gt;&gt; T=C3=A9l: <a href=3D"tel:%2B33%20%280%294%2063%2005%=
2095%2040" value=3D"+33463059540" target=3D"_blank">+33 (0)4 63 05 95 40</a=
><br>
              &gt;&gt; Fax: <a href=3D"tel:%2B33%20%280%294%2073%2070%2065%=
2029" value=3D"+33473706529" target=3D"_blank">+33 (0)4 73 70 65 29</a><br>
              &gt;&gt; Email: <a href=3D"mailto:franck.routier%40axege.com"=
 target=3D"_blank">&lt;mailto:franck.routier%40axege.com&gt;</a><a href=3D"=
mailto:franck.routier%40axege.com" target=3D"_blank">[email protected]=
om</a><br>


              &gt;&gt; <br>
              &gt;&gt; <br>
              &gt;&gt; <br>
              &gt;&gt; <br>
              &gt;&gt; <br>
              &gt;<br>
              &gt;-- <br>
              &gt;Franck Routier <br>
              &gt;Logo Ax=C3=A8ge<br>
              &gt;Ax=C3=A8ge<br>
              &gt;23,rue Saint-Simon<br>
              &gt;63000 Clermont-Ferrand<br>
              &gt;T=C3=A9l: <a href=3D"tel:%2B33%20%280%294%2063%2005%2095%=
2040" value=3D"+33463059540" target=3D"_blank">+33 (0)4 63 05 95 40</a><br>
              &gt;Fax: <a href=3D"tel:%2B33%20%280%294%2073%2070%2065%2029"=
 value=3D"+33473706529" target=3D"_blank">+33 (0)4 73 70 65 29</a><br>
              &gt;Email: <a href=3D"mailto:franck.routier%40axege.com" targ=
et=3D"_blank">&lt;mailto:franck.routier%40axege.com&gt;</a><a href=3D"mailt=
o:franck.routier%40axege.com" target=3D"_blank">[email protected]</a=
><br>


              &gt;<br>
              &gt;<br>
              <br>
              Spreadsheet Detective,<br>
              Southern Cross Software Queensland Pty Limited<br>
              54 Gerler Street<br>
              Bardon, Queensland 4065, Australia.<br>
              <br>
              Email: <a href=3D"mailto:berglas%40spreadsheetdetective.com" =
target=3D"_blank">[email protected]</a><br>
              <a href=3D"http://www.SpreadsheetDetective.com" target=3D"_bl=
ank">www.SpreadsheetDetective.com</a><br>
              Ph: <a href=3D"tel:%2B61%20427%20830248" value=3D"+6142783024=
8" target=3D"_blank">+61 427 830248</a> (Australian Eastern Standard Time)<=
br>
              <br>
              &quot;If the model seems correct only because the numbers loo=
k
              right, <br>
              then why build the model in the first place?&quot;<br>
              <br>
            </p>
          </div>
=20=20=20=20=20=20=20=20=20=20
=20=20=20=20=20=20
=20=20=20=20=20=20
    </blockquote>
    <br>
  </div>

</blockquote></div><br><br clear=3D"all"><div><br></div>-- <br><p>
</p><p>Dr Anthony Berglas, <a href=3D"mailto:[email protected]" target=3D=
"_blank">[email protected]</a>=A0=A0=A0=A0=A0=A0 Mobile: +61 4 4838 8874<=
br>
Just because it is possible to push twigs along the ground with ones nose<b=
r>
does not necessarily mean that that is the best way to collect firewood.</p=
>
</div>




<!-- |**|begin egp html banner|**| -->

<br>

=20=20=20=20
=20=20=20=20
<br>

<!-- |**|end egp html banner|**| -->


<div width=3D"1" style=3D"color: white; clear: both;"/>__._,_.___</div>

<!-- Start Recommendations -->
<!-- End Recommendations -->



<!-- |**|begin egp html banner|**| -->

  <img src=3D"http://geo.yahoo.com/serv?s=3D97476590/grpId=3D7360226/grpspI=
d=3D1705006905/msgId=3D2078/stime=3D1360021283" width=3D"1" height=3D"1"> <=
br>

<!-- |**|end egp html banner|**| -->

=20=20
<!-- |**|begin egp html banner|**| -->

<br>
      <div style=3D"font-family: verdana; font-size: 77%; border-top: 1px s=
olid #666; padding: 5px 0;" >
      Your email settings: Individual Email|Traditional <br>
      <a href=3D"http://groups.yahoo.com/group/SimpleORM/join;_ylc=3DX3oDMT=
Jma3Bha3RiBF9TAzk3NDc2NTkwBGdycElkAzczNjAyMjYEZ3Jwc3BJZAMxNzA1MDA2OTA1BHNlY=
wNmdHIEc2xrA3N0bmdzBHN0aW1lAzEzNjAwMjEyODM-">Change settings via the Web</a=
> (Yahoo! ID required) <br>
      Change settings via email: <a href=3D"mailto:SimpleORM-digest@yahoogr=
oups.com?subject=3DEmail Delivery: Digest">Switch delivery to Daily Digest<=
/a> | <a href =3D "mailto:[email protected]?subject=3D=
Change Delivery Format: Fully Featured">Switch to Fully Featured</a> <br>
           <a href=3D"http://groups.yahoo.com/group/SimpleORM;_ylc=3DX3oDMT=
Jkam1idm10BF9TAzk3NDc2NTkwBGdycElkAzczNjAyMjYEZ3Jwc3BJZAMxNzA1MDA2OTA1BHNlY=
wNmdHIEc2xrA2hwZgRzdGltZQMxMzYwMDIxMjgz">
        Visit Your Group=20
      </a> |
      <a href=3D"http://docs.yahoo.com/info/terms/">
        Yahoo! Groups Terms of Use
      </a> |
      <a href=3D"mailto:[email protected]?subject=3DUns=
ubscribe">
       Unsubscribe=20
      </a>=20
 <br>
    </div>
  <br>

<!-- |**|end egp html banner|**| -->


<div style=3D"color: white; clear: both;"/>__,_._,___</div>
</body>

</html>

--f46d04479f9541c7ad04d4eea1ba--