Xavinou
Xavinou

Reputation: 802

IBMDB2 simple query error 901 - system error

I'm working on a IBM iseries v6r1m0 system.

I'm trying to execute a very simple query :

select * from XG.ART where DOS = 998 and (DES like 'ALB%' or DESABR like 'ALB%')

The columns are:

DOS -> numeric (3,0)
DES -> Graphic(80) CCSID 1200
DESABR -> Garphic(25) CCSID 1200

I get :

SQL State : 58004
SQL Code : -901
Message : [SQL0901] SQL System error. 
Cause . . . . . :  An SQL system error has occurred. The current SQL statement cannot be completed successfully. The error will not prevent other SQL statements from being processed. Previous messages may indicate that there is a problem with the SQL statement and SQL did not correctly diagnose the error. The previous message identifier was CPF4204. Internal error type 3107 has occurred. If precompiling, processing will not continue beyond this statement.
Recovery . . . : See the previous messages to determine if there is a problem with the SQL statement. To view the messages, use the DSPJOBLOG command if running interactively, or the WRKJOB command to view the output of a precompile. An application program receiving this return code may attempt further SQL statements. Correct any errors and try the request again.

If I change DES into REF (graphic(25)), it works...

EDIT :

I run some tests this afternoon, and it is very strange :

Just after the creation of the table/indexes, I have no errors.

The index is :

create index XG.GTFAT_ART_B on XG.ART(
DOS,
DESABR,
ART_ID
)

Edit 2 :

Here is the job log (sorry, it is in French...) joblog

It sais :

Function error X'1720' in machine instruction. Internal snapshot ID 01010054
Foo file created in library QTEMP.
*** stuff with the printer
DBOP *** FAILED open. Exception from call to SLIC$
Internal error in the query processor file
Sql system error

Upvotes: 3

Views: 6873

Answers (4)

bluish
bluish

Reputation: 27292

For other people getting this errore, I encountered it on an IBM i Series v7r3, when tried an UPDATE, retrieving the value to be set on a field using a inner SELECT where multiple results where reduced to 1, using DISTINCT. I solved the problem removing DISTINCT and adding FETCH FIRST 1 ROW ONLY at the end of the inner SELECT.

E.g.: changed from

UPDATE MYTABLE AS T1  
SET T1.FIELD1 = (
    SELECT DISTINCT T2.FIELD5
    FROM MYTABLE AS T2       
    WHERE T1.FIELD2 = T2.FIELD2
      AND T1.FIELD3 = T2.FIELD3
    )
WHERE T1.FIELD4 = 'XYZ'

to

UPDATE MYTABLE AS T1  
SET T1.FIELD1 = (
    SELECT T2.FIELD5
    FROM MYTABLE AS T2       
    WHERE T1.FIELD2 = T2.FIELD2
      AND T1.FIELD3 = T2.FIELD3
    FETCH FIRST 1 ROW ONLY
    )
WHERE T1.FIELD4 = 'XYZ'

Upvotes: 0

Xavinou
Xavinou

Reputation: 802

I finally contacted IBM.

It was an old bug from v5.

I have installed the latest PTF, and now, it works.

Upvotes: 2

Chud
Chud

Reputation: 77

I know this guy got his problem fixed with an update. But here is something that worked for me that might work for the next guy here who has the problem.

My problem query had a lot of common table expressions. Most of them did not create tables with a whole lot of records. So if I figured that the maximum number of records a CTE would make was 1000, I added a "Fetch first 9999 rows only" to it. I knew that the CTE couldn't possibly have more rows than that. I guess the query optimizer had less to think about with that added.

If you have that problem and you don't have the option to upgrade or talk to IBM, I hope this help you.

Upvotes: 0

James Allman
James Allman

Reputation: 41148

You need to use the GRAPHIC scalar function to convert your character literals on the LIKE predicate.

CREATE TABLE QTEMP/TEST (F1 GRAPHIC(80))
INSERT INTO QTEMP/TEST (F1) VALUES (GRAPHIC('TEST'))
SELECT * FROM QTEMP/TEST WHERE F1 LIKE GRAPHIC('TE%')

Upvotes: 0

Related Questions