ОБНОВЛЕНИЕ столбца IMAGE в Sybase с оператором PREPARED не выполняется

Это с ASE 15.7 и ESQL/C. Обновление строки в CURSOR подготовленным оператором:

EXEC SQL BEGIN DECLARE SECTION;
CS_IMAGE image[512];
EXEC SQL END DECLARE SECTION;

strcpy(image, "foo");

EXEC SQL PREPARE updt FROM "UPDATE image_test SET nettodaten = ? WHERE CURRENT OF hc_image_test";
EXEC SQL EXECUTE updt USING :image;

терпит неудачу с сообщением от ASE:

** SQLCODE=(-201)
** ASE Error
** Procedure *sq1625128094_1900377684ss* expects parameter
Invalid pointer param number 4, pointer value 0x(nil)
, which was not supplied.

Что может быть причиной этого?

Обновление 1

Я немного изменил код ESQL/C, чтобы он выглядел так:

strcpy(anweisung, "UPDATE image_test SET katkey = ?, nettodaten = ? WHERE CURRENT OF hc_image_test");
EXEC SQL PREPARE updt FROM :anweisung;
EXEC SQL EXECUTE updt USING :key, :blobfld;
EXEC SQL CLOSE hc_image_test;

Ошибка остается той же, что и выше. Но если взглянуть на созданный CPRE C-код, можно увидеть интересную деталь:

   /*
   ** SQL STATEMENT: 17
   ** EXEC SQL EXECUTE updt USING :key, :blobfld;
   */
   {
        _SQL_CT_HANDLES * _sql;
       _sqlinitctx(&_sql, CS_CURRENT_VERSION, CS_TRUE, &sqlca, (long
           *)NULL, (CS_CHAR *)NULL);
       if (_sql != (_SQL_CT_HANDLES *) NULL)
       {
           _sql->stmtData.persistent = CS_FALSE;
           _sql->stmttype = SQL_EXECUTE;
           _sql->connName.lnlen = CS_UNUSED;
           _sql->stmtName.fnlen = 4;
           strcpy(_sql->stmtName.first_name, "updt");
           if ((_sql->retcode = _sqlprolog(_sql)) == CS_SUCCEED)
           {
               _sql->retcode = ct_dynamic(_sql->conn.command,
                   CS_EXECUTE, "updt", 4, NULL, CS_UNUSED);
               if (_sql->retcode == CS_SUCCEED)
               {
                   _sql->dfmtCS_INT_TYPE.count = 0;
                   _sql->dfmtCS_INT_TYPE.status = CS_INPUTVALUE;
                   _sql->retcode = ct_param(_sql->conn.command,
                       &_sql->dfmtCS_INT_TYPE, &key, (CS_INT)
                       CS_UNUSED, (CS_SMALLINT) 0);
                   _sql->dfmtCS_INT_TYPE.status = 0;
               }

               _sql->retcode = ct_send(_sql->conn.command);
               _sql->hastate = (_sql->retcode == CS_RET_HAFAILOVER);
               _sql->retcode = _sqlResults(_sql);
               _sql->retcode = _sqlepilog(_sql);
           }

           if (sqlca.sqlcode < 0)
           {
               error_handler();
           }

Как видно выше, указатель на переменную хоста CS_INT :key помещается с вызовом ct_param() во внутренние структуры, но не какая-либо ссылка на переменную хоста CS_IMAGE :blobfld. Вот почему ASE жалуется на отсутствие значения параметра, потому что видит два вопросительных знака ? в подготовленном операторе UPDATE. Мне это почему-то кажется ошибкой компилятора CPRE, а не самой ASE.


person guru    schedule 27.07.2018    source источник


Ответы (1)


Я связался через наш контракт на техническое обслуживание с компанией SAP (номер проблемы 390674 / 2018), и какой-то инженер изучает эту проблему CPRE...

На данный момент я добавляю в C-код, созданный CPRE, незадолго до вызова ct_send(), следующие строки кода для добавления отсутствующей ссылки в столбец IMAGE:

                   /* additional code for host var :blobfld */
                   if (_sql->retcode == CS_SUCCEED)
                   {
                       _sql->dfmtCS_IMAGE_TYPE.count = 0;
                       _sql->dfmtCS_IMAGE_TYPE.maxlength = (CS_INT) 65535;
                       _sql->dfmtCS_IMAGE_TYPE.format = CS_FMT_UNUSED;
                       _sql->dfmtCS_IMAGE_TYPE.status = CS_INPUTVALUE;
                           _sql->retcode = ct_param(_sql->conn.command,
                               &_sql->dfmtCS_IMAGE_TYPE, blobfld, (CS_INT) ImageLengthField,
                               (CS_SMALLINT) 0);
                       _sql->dfmtCS_IMAGE_TYPE.status = 0;
                   }
                   /* end of additional code for host var :blobfld */

                   _sql->retcode = ct_send(_sql->conn.command);
                   ...

И все работает нормально.

person guru    schedule 14.09.2018