Ok, I converted my procedure to use a cursor and fixed allocation and
initialisation for the SQLLongDesc (see below for what I did in detail).
Now my program sometimes crashes in the PUTVAL statement with stack
being:
Program received signal SIGSEGV, Segmentation fault.
0x402421af in memcpy () from /lib/libc.so.6
#1 0x40961793 in pr04LongPutData ()
#2 0x40961fde in pr04LongInsertLongVarchar ()
#3 0x40962616 in pr04LongPutvalData ()
#4 0x409629cd in pr04LongPutvalInput ()
#5 0x4094fa22 in pr01cEnd ()
#6 0x40957832 in pr01SQLExecute ()
#7 0x40954ffb in pr01PrecomExecute ()
#8 0x4094cb98 in sqlCPCExecute ()
I suspect the error in the initialisation of the host variable for the
long column or it may also be a bug:
ldesc->szBuf = param[i].buf;
ldesc->cbBufMax = param[i].size;
ldesc->cbBufLen = param[i].size;
ldesc->cbColLen = param[i].size;
ha->hostvartype=sqlvlongdesc;
ha->hostvaraddr=ldesc;
ha->hostcolsize = sizeof (SQLLongDesc);
ha->collength = sizeof (SQLLongDesc);
Here my changes in detail:
1. added
EXEC SQL DECLARE cursupd CURSOR FOR stmtupd;
if (sqlca.sqlcode!=0){return;}
between the PREPARE and DESCRIBE statement
2. replaced
SQLLongDesc *ldesc = (SQLLongDesc *)alloca(sizeof(SQLLongDesc));
by
SQLLongDesc *ldesc = (SQLLongDesc *)malloc(sizeof(SQLLongDesc));
3. added
ldesc->cbColLen = param[i].size;
4. replaced
EXEC SQL EXECUTE stmtupd USING DESCRIPTOR;
by
EXEC SQL OPEN cursupd USING DESCRIPTOR KEEP;
and
5. replaced
EXEC SQL PUTVAL stmtupd USING DESCRIPTOR;
by
EXEC SQL PUTVAL cursupd USING DESCRIPTOR;
Regards,
CTB
"Simenec, Thomas" schrieb:
>
> Hi,
>
> you have to use a cursor to use long data operations with sqlda.
>
> E.g. use the following sequence:
>
> EXEC SQL PREPARE stmtupd from :stmt;
> EXEC SQL DECLARE :C1 CURSOR FOR stmtupd;
> EXEC SQL DESCRIBE stmtupd;
> EXEC SQL OPEN :C1 USING DESCRIPTOR KEEP;
> EXEC SQL PUTVAL :C1 USING DESCRIPTOR;
>
> The keyword KEEP at the end of the OPEN statement keeps the long columns open
> for inserting data by the use of following PUTVALs.
>
> Regards,
>
> Thomas Simenec
> SAP Labs Berlin
>
> -----Original Message-----
> From: Claus-Thomas Buhl [mailto:[EMAIL PROTECTED]
> Sent: Mittwoch, 16. Juli 2003 18:32
> To: [EMAIL PROTECTED]
> Subject: Storing binary data in LONG (BYTE) columns in ESQL/C
>
> I am using the C/C++ precompiler of SAP DB 7.3.0.34 and want
> to store binary data in LONG (BYTE) columns.
> I have the following ESQL/C code snippet, there are no database errors
> at runtime, but the data isn't stored. What am I doing wrong ?
>
> int Update (char * sqlstmt, tparam param[], int nparam) {
> EXEC SQL BEGIN DECLARE SECTION;
> char * stmt;
> char stmtupd[8];
> EXEC SQL END DECLARE SECTION;
> sqlvartype *ha;
> int longcols=0;
>
> stmt = sqlstmt;
> EXEC SQL PREPARE stmtupd FROM :stmt;
> if (sqlca.sqlcode!=0){return 1;}
>
> EXEC SQL DESCRIBE stmtupd;
> if (sqlca.sqlcode!=0){return 1;}
>
> for (i=0;i<nparam;i++){
> ha = &sqlda.sqlvar[i];
> if (ha->col.colislong) {
> SQLLongDesc *ldesc = (SQLLongDesc *)alloca(sizeof(SQLLongDesc));
> ldesc->szBuf = param[i].buf;
> ldesc->cbBufMax = param[i].size;
> ldesc->cbBufLen = param[i].size;
>
> ha->hostvartype=sqlvlongdesc;
> ha->hostvaraddr=ldesc;
> ha->hostcolsize = sizeof (SQLLongDesc);
> ha->collength = sizeof (SQLLongDesc);
>
> longcols = 1;
> } else {
> ...
> }
> }
>
> EXEC SQL EXECUTE stmtupd USING DESCRIPTOR;
> if (sqlca.sqlcode!=0 && sqlca.sqlcode!=100) {return 1;}
>
> if (longcols) {
> EXEC SQL PUTVAL stmtupd USING DESCRIPTOR;
> if (sqlca.sqlcode!=0 && sqlca.sqlcode!=100){return 1;}
> }
>
> return 0;
> }
>
> Regards,
>
> CTB
> --
> _______
> \o/|\o/ Claus-Thomas Buhl
> | Diplom-Informatiker
> \_____/ mailto:[EMAIL PROTECTED]
>
> H.E.I. GmbH | Wimpfener Strasse 23 | D-68259 Mannheim
> Fon: +49-(0)621-795141 | Fax: +49-(0)621-795161 | mailto:[EMAIL PROTECTED]
> http://www.h-e-i.de && http://www.hei.biz && http://www.radpage.com
> _______________________________________________
> sapdb.general mailing list
> [EMAIL PROTECTED]
> http://listserv.sap.com/mailman/listinfo/sapdb.general
--
_______
\o/|\o/ Claus-Thomas Buhl
| Diplom-Informatiker
\_____/ mailto:[EMAIL PROTECTED]
H.E.I. GmbH | Wimpfener Strasse 23 | D-68259 Mannheim
Fon: +49-(0)621-795141 | Fax: +49-(0)621-795161 | mailto:[EMAIL PROTECTED]
http://www.h-e-i.de && http://www.hei.biz && http://www.radpage.com
_______________________________________________
sapdb.general mailing list
[EMAIL PROTECTED]
http://listserv.sap.com/mailman/listinfo/sapdb.general