DB2 SQLCode -7008 - PullRequest
       53

DB2 SQLCode -7008

0 голосов
/ 29 ноября 2018

Я использую программу sqlrgple для вставки выбранного количества записей в файл, который затем выводю пользователю.См. Фрагмент кода ниже

// Build SQL statement according to the parameters passed

        if rpttype = 'O';

          sqlstmt = 'Insert into fqrylibpgm/sblbrpt ' +
            '(shclno, shscdt, shcmdt, shcust, ' +
            'ttlonl, ttlofl, ttltvl) ' +
            'Select shclno, shscdt, shcmdt, shcust, '+
            'coalesce(sum(cast(((tbontm * 0.01) * tbonbr)' + 
            ' as dec(8,2))),0), ' +
            'coalesce(sum(cast(((tboftm * 0.01) * tbofbr)' +  
            ' as dec(8,2))),0), ' +
            'coalesce(sum(cast(((tbtvtm * 0.01) * tbtvbr)' +  
            ' as dec(8,2))),0) ' +
            'from r50files/sbschd '+
            'left join r50modsdta/sbsctc on tbcmp = shcmp and ' +
            'tbcust = shcust and tbclno = shclno ';

        elseif rpttype = 'C';

          sqlstmt = 'Insert into fqrylibpgm/sblbrpt ' +
            '(shclno, shscdt, shcmdt, shcust, ' +
            'ttlonl, ttlofl, ttltvl) ' +
            'Select shclno, shscdt, shcmdt, shcust, '+
            'coalesce(sum(cast(((tbontm * 0.01) * tbonbr)' +  
            ' as dec(8,2))),0), ' +
            'coalesce(sum(cast(((tboftm * 0.01) * tbofbr)' +  
            ' as dec(8,2))),0), ' +
            'coalesce(sum(cast(((tbtvtm * 0.01) * tbtvbr)' +  
            ' as dec(8,2))),0) ' +
            'from r50files/sbhshd '+
            'left join r50modsdta/sbhstc on tbcmp = shcmp and ' +
            'tbcust = shcust and tbclno = shclno ';

        endif;

        // Only for Rentals location

        sqlstmt += 'where shloc = 1202 ';

        // Scheduled Date Filter

        sqlstmt += 'and (shscdt >= ' + %char(scdtfr) +
                   ' and shscdt <= ' + %char(scdtto) + ') ';

        //Completed Date Filter

        sqlstmt += 'and (shcmdt >= ' + %char(cmdtfr) +
                   ' and shcmdt <= ' + %char(cmdtto) + ') ';

        // Group Clause to get Sum

        sqlstmt += ' group by shclno, shscdt, shcmdt, ' +
                   ' shcust ';

        sqlstmt += ' order by shclno'; 

        // Execute SQL Insert statement

        exec sql prepare sqlsel from :sqlstmt;
        exec sql execute sqlsel;

        // Get SQL return codes (use to debug)

        exec sql GET DIAGNOSTICS CONDITION 1
                 :rsqlcode = DB2_RETURNED_SQLCODE,
                 :rmsgtext = MESSAGE_TEXT;

        exec sql commit; 

Проблема в том, что когда я запускаю эту программу, я получаю sqlcode -7008 и текст сообщения «SBLBRPT NOT VALID FOR OPERATION»

https://www.ibm.com/support/knowledgecenter/en/SSEPEK_11.0.0/codes/src/tpc/n7008.html

В соответствии с документами, я должен получить код причины после этого, но не получаю.

Когда я отлаживаю программу, чтобы убедиться, что запрос правильный.Я принимаю значение sqlstmt до его выполнения и пробую этот оператор в STRSQL как есть, и он отлично работает.

Файл SBLBRPT также находится в списке библиотек.

Я делал подобные программы раньше и еще не сталкивался с этой ошибкой, и я не уверен, как ее исправить.Любая помощь будет принята с благодарностью

1 Ответ

0 голосов
/ 30 ноября 2018

Код причины находится в журнале заданий ...

Вероятно, вы приняли значения по умолчанию для команды CRTSQLRPGI, а именно COMMIT (* CHG), и рассматриваемая таблица (файл) не записывается в журнал.

Добавьте exec sql set option commit=*none; в вашу программу, или добавьте with nc в оператор ... или измените параметр во время компиляции.

...