Michael Peppler
Sybase Consulting
Sybase on Linux
Install Guide for Sybase on Linux
General Sybase Resources
General Perl Resources
BCP Tool
Bug Tracker
Mailing List Archive
Downloads Directory
Sybase on Linux FAQ
Sybperl FAQ
Michael Peppler's resume

sybperl-l Archive

Up    Prev    Next    

From: Michael Peppler <mpeppler at MBAY dot NET>
Subject: Explicitly binding columns... How do I??
Date: Jun 3 1998 7:38PM

Todd E. Scheresky writes:
 > Folks,
 > I have problem which pertains to Open Client on Alpha VMS, and Sybperl.
 > There must be a Sybperl solution to this problem, though I am not sure
 > what it is.  The problem is described as follows.
 > When I execute a stored procedure, or SQL statement, that returns a
 > numeric(9,0) from CTlib ( using the CTlib/Perl code found below ) Perl
 > dies a horrible death.  The VMS error output follows the CTlib/Perl
 > code.  Note: I am not doing any explicit binding in my Sybperl code, and
 > the same stored procedure executes fine in Sybperl on Windows NT 4.0 and
 > Unix.  It has been determined that Open Client on Alpha VMS defaults to
 > binding a numeric to a IEEE floating point data type, instead of the
 > native VMS data type, which causes and overflow on Alpha architecture.
 > My question is how do tell Sybase Server, from Sybperl, to returns all
 > my result set as strings?  What would be the most elegant Sybperl
 > solution to this problem?
 > Any help, or sane suggestion, is appreciated!!

There's no "clean" solution at this point. Sybase::DBlib has the
dbKeepNum attribute which you can set to 0 to return everything as
strings, but Sybase::CTlib doesn't have this.

However, all is not lost.

In CTlib.xs, go to line 1146 (at least that's what I have) - where you 
will find the following code:

	    /* FIXME:
	       Should this be DoChar: when not using native numeric
	       formats (overflow problems...)? */
		goto DoFloat;
	    info->datafmt[i].maxlength = sizeof(CS_NUMERIC);
	    info->datafmt[i].datatype = CS_NUMERIC_TYPE;
	    info->datafmt[i].format   = CS_FMT_UNUSED;
	    info->coldata[i].type = CS_NUMERIC_TYPE;
	    retcode = ct_bind(info->cmd, (i + 1), &info->datafmt[i],

Change the goto to be DoChar instead of DoFloat and you should get
strings instead of floats returned to you from numberic/decimal data.

Michael Peppler         -||-  Data Migrations Inc.    -||-
Int. Sybase User Group  -||-