Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
Discussion Groups
Database Servers
DB2InformixIngresMS SQLOraclePervasive.SQLPostgreSQLProgressSybase
Desktop Databases
FileMakerFoxProMS AccessParadox
General
General DB TopicsDatabase Theory
Related Topics
Java Development.NET DevelopmentVB DevelopmentMore Topics ...

Database Forum / DB2 Topics / June 2006

Tip: Looking for answers? Try searching our database.

problems with concat and parameter markers

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Martin Evans - 08 Jun 2006 20:10 GMT
Hi,

I'm getting:

DBD::DB2::db do failed: [IBM][CLI Driver][DB2/LINUX] SQL0440N  No
authorized routine named "CONCAT" of type "FUNCTION" having compatible
arguments was found. SQLSTATE=42884

for some SQL like this:

insert into db2inst1.transaction (account_id, date_time_utc,
transaction_type_id, transaction_status_id, description, amount)
values (?, { fn now() }, ?, ?, concat('Unmatched on ', ?), '
repayment'), ?)'

I believe this is down to the parameter marker in the concat function
call and DB2 being unable to identify the correct concat function
because the parameter marker type is not known at compile time and DB2
supports overloaded functions so it needs to know the type to locate
the correct concat function. I've tried casting the parameter marker
like:

 cast(? as varchar(128))

but this does not help. I cannot seem to find the right cast to match
the concat function.

Any ideas?

Martin
--
Martin J. Evans
Wetherby, UK
Serge Rielau - 08 Jun 2006 21:15 GMT
> Hi,
>
[quoted text clipped - 22 lines]
> but this does not help. I cannot seem to find the right cast to match
> the concat function.
concat() is a built-in function and DB2 can derive the type from the
literal. What happens when you type SYSIBM.CONCAT ?

This works on CLP:
db2 => values concat('Unmatched on ', ?);
SQL0313N  The number of host variables in the EXECUTE or OPEN statement
is not equal to the number of values required.  SQLSTATE=07004

Can you post the real SQL? (You noted "some SQL like this" which leads
me to believe we're seeing a tainted version here)

Cheers
Serge
Signature

Serge Rielau
DB2 Solutions Development
IBM Toronto Lab

IOD Conference
http://www.ibm.com/software/data/ondemandbusiness/conf2006/

Martin Evans - 08 Jun 2006 21:36 GMT
>> Hi,
>>
[quoted text clipped - 35 lines]
>Cheers
>Serge

Well you are right, this is not EXACTLY the same SQL - I removed one
other parameter in the concat() i.e. it was:

concat('Unmatched on ', ?, ' some text')

Interestingly if I create a table:

create table fred (a char(100))

and run the following perl:

use DBI;
$dbh = DBI->connect("dbi:DB2:xxx", "db2inst1", "easysoft");
$sql = q/insert into fred (a) values(concat('hello ',?))/;
$sth = $dbh->prepare($sql);
$sth->execute("fred");

it works. But I run the following perl it fails (yet with another
error):

use DBI;
$dbh = DBI->connect("dbi:DB2:xxx", "db2inst1", "easysoft");
$sql = q/insert into fred (a) values(concat('hello ',?,' some
text'))/;
$sth = $dbh->prepare($sql);
$sth->execute("fred");

error is:

DBD::DB2::st execute failed: [IBM][CLI Driver][DB2/LINUX] SQL0418N  A
statement
contains a use of a parameter marker that is not valid. SQLSTATE=42610

so may be it is something to do with the number of arguments to concat
i.e. 2 are ok and 3 are not.

Martin
--
Martin J. Evans
Wetherby, UK
Serge Rielau - 08 Jun 2006 22:55 GMT
>>> Hi,
>>>
[quoted text clipped - 76 lines]
> Martin J. Evans
> Wetherby, UK
CONCAT is a BINARY function.
If you want to concat more than two pieces either use infix notation:
'HELLO' || 'WORLD' || '!'
or
CONCAT('Hello', CONCAT('WORLD', !'))

Cheers
Serge

Signature

Serge Rielau
DB2 Solutions Development
IBM Toronto Lab

IOD Conference
http://www.ibm.com/software/data/ondemandbusiness/conf2006/

Martin Evans - 09 Jun 2006 08:09 GMT
>>>> Hi,
>>>>
[quoted text clipped - 84 lines]
>Cheers
>Serge

Serge,

Thanks - I should have realised that. I was porting some sql from
mysql to db2 and mysql supports concat(x,y,z,...) and didn't notice
concat was a 2 op function in db2. What put me on the wrong tack was
searching for the error code and seeing loads of other people getting
the same error with ucase(?).

Thanks again.

Martin
--
Martin J. Evans
Wetherby, UK
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2009 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.