Hi,

 I am seeing a similar problem when using  mysql as db backend.
*How to get the ID of a NEWLY INSERTED ROW ?*

*problem:*
 - I insert a new fow in a table with  the dbreport module.  It gets a new
id. (it is an AUTO_INCREMENT variable).
- further in my sequence, and in the 'out' sequence I need to update that
row in the table, using the id.
I couldn't find a clean (and threadsafe!!!) way to get the newly created id
with wso2.

The wso2 samples don't address this problem.

mysql provides a function LAST_INSERT_ID() to get the newly inserted ID.
However that can only be used in the *_same_* transaction.
So I can use LAST_INSERT_ID()  in the _same_ dbreport module (as 2nd or 3rd
sql statement). However dbreport mediator CANNOT save this to a variable.
(only dblookup can).
A following dblookup mediator can however NOT use LAST_INSERT_ID()  (it
always returns zero, as this is a new db transaction).
dblookup could do some MAX like magic... but thatis not threadsafe.

*workaround*
I found a (but-ugly) workaround:
dbreport:
        sql1:   insert into .....      (store my new row... creates a new
ID).
        sql2:   insert into transaction_uuid(id, uuid)
values(LAST_INSERT_ID(),?)
                       param:
get-property('MessageID')                   (store the newly created ID in a
new temp table, using the uuid of the message)
dblookup:    select id from transaction_uuid where uuid = ?
                      param: get-property('MessageID')
                   result: transaction_id                                (
read the newly created id from the temp table, store it in a variable).
dbreport: delete from transaction_uuid where id = ?
                    param: get-property('transaction_id')          (delete
the temp table).

>From here on I can use get-property('transaction_id')  to update the row in
the same sequence, (and in the answer sequence).

I would expect however that I can do the above with  _one_ single dbreport
mediator.   Insert the new field, and store the id in
set-property('transaction_id').
I didn't  measure my workaround but it must be slow. (the hole temp table
should be unneeded, the above contains 3 unneeded db accesses  and 2
unneeded mediators).

Do you see any way how wso2 could cleanly support this ?  (Maybe an
extension to the dbreport module ?)

Regards,
Harm


2008/10/2 Indika Kumara <[EMAIL PROTECTED]>

>  Here, you had done two wrongs
>
>         1)     The IDENTITY_VAL_LOCAL function has no input parameters.
> But, you have tried to set parameters – That is why you get exception.
>
> 2)     You have called it in db report mediator. DB report mediator use to
> add /update record …simply uses executeUpdate(). But values
> IDENTITY_VAL_LOCAL() is for retrieving latest inserted record identity and
>  will throws errors.
>
>        Please use values IDENTITY_VAL_LOCAL() with DB LookUp mediator
> Thanks
> Indika
>
> Schmilinsky, Remsy wrote:
>
> Thanks. I am trying to get the generated id after insert, I'm using
> derby, with 'values IDENTITY_VAL_LOCAL()' in a second sql but doesn't work,
> are these incompatible functions ?
>
> 2008-10-01 13:47:14,790 [169.254.7.221-WH24CU6052] [jms-Worker-1] ERROR
> DBReportMediator Error execuring insert statement : values
> IDENTITY_VAL_LOCAL() against DataSource :
> jdbc:derby://localhost:1527/esbdb;create=false
> java.sql.SQLException: The column position '1' is out of range.  The number
> of columns for this ResultSet is '0'.
>         at
> org.apache.derby.client.am.SQLExceptionFactory.getSQLException(Unknown
> Source)
>         at org.apache.derby.client.am.SqlException.getSQLException(Unknown
> Source)
>         at org.apache.derby.client.am.ColumnMetaData.getColumnType(Unknown
> Source)
>
> the insert statement alone works though.
>
> here dbreport config, for the moment I assign value 1 to test it out:
>
> <syn:dbreport>
>             <syn:connection>
>                 <syn:pool>
>
> <syn:driver>org.apache.derby.jdbc.ClientDriver</syn:driver>
>                     <syn:password>esb</syn:password>
>                     <syn:user>esb</syn:user>
>
> <syn:url>jdbc:derby://localhost:1527/esbdb;create=false</syn:url>
>                 </syn:pool>
>             </syn:connection>
>             <syn:statement>
>                 <syn:sql><![CDATA[insert into sample values (DEFAULT,
> ?)]]></syn:sql>
>                 <syn:parameter xmlns:ns1="http://org.apache.synapse/xsd";
> xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";
> expression="//*/*" type="VARCHAR"/>
>             </syn:statement>
>             <syn:statement>
>                 <syn:sql><![CDATA[values IDENTITY_VAL_LOCAL()]]></syn:sql>
>                 <syn:parameter value="1" type="INTEGER"/>
>             </syn:statement>
>         </syn:dbreport>
>
> remsy
>
> -----Original Message-----
> *From:* [EMAIL PROTECTED] [
> mailto:[EMAIL PROTECTED] <[EMAIL PROTECTED]>]*On
> Behalf Of *Indika Kumara
> *Sent:* October 1, 2008 1:21 PM
> *To:* [email protected]
> *Subject:* Re: [esb-java-user] dbreport question
>
>  Hi Remsy
>
> All the samples in [1] show a scenario somewhat similar to your scenario (I
> believe). In those samples, get an ID from DB and set it as message context
> property
> and then perform conditional switching based on the value of that property.
> On the out path, some result form response is stored in the DB too.
> By going through [2], it will be easy to understand the current behavior of
> the DB -mediators
>
>
> [1]
> http://wso2.org/project/esb/java/1.7.1/docs/ESB_Samples.html#DBMediators
>
> [2]
> http://wso2.org/project/esb/java/1.7.1/docs/ESB_Configuration_Language.html#dblookup
>
> Thanks
> Indika
>  Schmilinsky, Remsy wrote:
>
> I need ro propagate the result of a query (id number) from dbreport to the 
> mediators along with the message.
>
> The idea is that the mediators will perform some actions on the message and 
> then log results in the db, so we need the id to reference the original data.
>
> is this possible ? how ?
>
> thanks
>
> Remsy
>
> _______________________________________________
> Esb-java-user mailing [EMAIL 
> PROTECTED]://mailman.wso2.org/cgi-bin/mailman/listinfo/esb-java-user
>
> ------------------------------
>
>
> No virus found in this incoming message.
> Checked by AVG - http://www.avg.com
> Version: 8.0.173 / Virus Database: 270.7.5/1698 - Release Date: 9/29/2008 
> 7:25 PM
>
>
>
>
>  ------------------------------
>
> _______________________________________________
> Esb-java-user mailing [EMAIL 
> PROTECTED]://mailman.wso2.org/cgi-bin/mailman/listinfo/esb-java-user
>
> ------------------------------
>
>
> No virus found in this incoming message.
> Checked by AVG - http://www.avg.com
> Version: 8.0.173 / Virus Database: 270.7.5/1698 - Release Date: 9/29/2008 
> 7:25 PM
>
>
>
>
>
> _______________________________________________
> Esb-java-user mailing list
> [email protected]
> http://mailman.wso2.org/cgi-bin/mailman/listinfo/esb-java-user
>
>
_______________________________________________
Esb-java-user mailing list
[email protected]
http://mailman.wso2.org/cgi-bin/mailman/listinfo/esb-java-user

Reply via email to