Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

no current record for fetch operation [CORE6106] #6355

Open
firebird-automations opened this issue Jul 22, 2019 · 7 comments
Open

no current record for fetch operation [CORE6106] #6355

firebird-automations opened this issue Jul 22, 2019 · 7 comments

Comments

@firebird-automations
Copy link
Collaborator

firebird-automations commented Jul 22, 2019

Submitted by: @livius2

Attachments:
COREXXX.FDB

WITH 
  KWARTALY AS (
    SELECT *
    FROM KWARTAL KW
    WHERE
      KW.CKWARTAL BETWEEN '2019.I' AND '2019.I'
  ),
  KWARTALY_DATY AS (
    SELECT
      MIN(KW.ZALICZAJ_OD) AS MIN_ZALICZAJ_OD
      , MAX(KW.ZALICZAJ_DO) AS MAX_ZALICZAJ_DO
      , MIN(KW.D_OD) AS MIN_D_OD
      , MAX(KW.D_DO) AS MAX_D_DO
      , MIN(KW.CKWARTAL) AS MIN_KWARTAL
      , MAX(KW.CKWARTAL) AS MAX_KWARTAL
    FROM KWARTALY KW
  )
SELECT
  K.ID, K.KONT_NR
FROM
  KONTRAHENT K
WHERE
  NOT (
    EXISTS (
      SELECT 1
      FROM KWARTALY_DATY KW
      WHERE
        /* jest jakakolwiek deklaracja w zadanym przedziale to znaczy, ze jest platnikiem */
        EXISTS (
          SELECT *
          FROM SPR S
            INNER JOIN KWARTAL SKW ON S.ID_KWARTAL = SKW.ID
          WHERE
            S.ID_KONTRAHENT = K.ID
            AND SKW.CKWARTAL BETWEEN KW.MIN_KWARTAL AND KW.MAX_KWARTAL
        )
        OR
        /* jesli ma wpis o statusie dzialnosci za zadany okres (z data pozyaskania nie z przyszlosci) to tez jest platnikiem */
        EXISTS (
          SELECT *
          FROM
            STATUS_PLATNIKA SP
            INNER JOIN STATUS_PLATNIKA_TYP SPT ON SP.ID_STATUS_PLATNIKA_TYP = SPT.ID
          WHERE
            SP.ID_KONTRAHENT = K.ID
            AND SP.DATA_POZYSKANIA <= KW.MAX_ZALICZAJ_DO
            AND (
              SPT.FLAGA_SYS IN (1)
              AND (
                (SP.DATA_OD <= KW.MAX_D_DO) AND (SP.DATA_DO IS NULL OR (SP.DATA_DO >= KW.MIN_D_OD))
              )
            )
        )
      UNION ALL
      SELECT 1
      FROM KWARTALY_DATY KD
        INNER JOIN URZADZENIE U ON 1 = 1
        /* robimy liste kwartalow w ktorych obowiazuje status dzialalnosci kontrahenta i szukamy brakow deklaracji */
        INNER JOIN KWARTALY KW ON
          EXISTS (
            SELECT *
            FROM STATUS_PLATNIKA SP
              INNER JOIN STATUS_PLATNIKA_TYP SPT ON SP.ID_STATUS_PLATNIKA_TYP = SPT.ID
            WHERE
              SP.ID_KONTRAHENT = K.ID
              AND SP.DATA_POZYSKANIA <= KD.MAX_ZALICZAJ_DO
              AND (
                SPT.FLAGA_SYS IN (1)
                AND (
                  (SP.DATA_OD <= KW.D_DO) AND
                  (SP.DATA_DO IS NULL OR (SP.DATA_DO >= KW.D_OD))
                )
              )
          )
      WHERE
        NOT EXISTS (
          SELECT *
          FROM SPR S
          WHERE
            S.ID_KONTRAHENT = K.ID
            AND S.ID_URZADZENIE = U.ID
            AND (
              ( EXTRACT(YEAR FROM S.DATA_OD) * 12 + EXTRACT(MONTH FROM S.DATA_OD)) BETWEEN (KW.ROK * 12 + KW.MIESIAC_OD) AND (KW.ROK * 12 + KW.MIESIAC_DO)
              OR (EXTRACT(YEAR FROM S.DATA_DO) * 12 + EXTRACT(MONTH FROM S.DATA_DO)) BETWEEN (KW.ROK * 12 + KW.MIESIAC_OD) AND (KW.ROK * 12 + KW.MIESIAC_DO)
            )
        )
    )
    AND K.KONT_NR > 0
  )

----------------------------------------

SQL Message : \-508
The cursor identified in the UPDATE or DELETE statement is not positioned on a row\.

Engine Code    : 335544348
Engine Message :
no current record for fetch operation

----------------------------------------

if you change last
AND K.KONT_NR > 0)
to
AND K.KONT_NR+0 > 0)

it run without an error

@firebird-automations
Copy link
Collaborator Author

Modified by: @livius2

Attachment: COREXXX.FDB [ 13362 ]

@firebird-automations
Copy link
Collaborator Author

Modified by: @livius2

description: WITH KWARTALY AS
(SELECT
*
FROM
KWARTAL KW
WHERE
KW.CKWARTAL BETWEEN '2019.I'
AND '2019.I'), KWARTALY_DATY AS
(SELECT
MIN(KW.ZALICZAJ_OD) AS MIN_ZALICZAJ_OD
, MAX(KW.ZALICZAJ_DO) AS MAX_ZALICZAJ_DO
, MIN(KW.D_OD) AS MIN_D_OD
, MAX(KW.D_DO) AS MAX_D_DO
, MIN(KW.CKWARTAL) AS MIN_KWARTAL
, MAX(KW.CKWARTAL) AS MAX_KWARTAL
FROM
KWARTALY KW)
SELECT
http://K.ID
, K.KONT_NR

FROM
KONTRAHENT K
WHERE
NOT
(
EXISTS
(
SELECT
1
FROM
KWARTALY_DATY KW
WHERE
/* jest jakakolwiek deklaracja w zadanym przedziale to znaczy, ze jest platnikiem*/
EXISTS
(SELECT
*
FROM
SPR S
INNER JOIN KWARTAL SKW ON S.ID_KWARTAL = http://SKW.ID
WHERE
S.ID_KONTRAHENT = http://K.ID
AND SKW.CKWARTAL BETWEEN KW.MIN_KWARTAL
AND KW.MAX_KWARTAL
)
OR
/* jesli ma wpis o statusie dzialnosci za zadany okres (z data pozyaskania nie z przyszlosci) to tez jest platnikiem */
EXISTS
(SELECT
*
FROM
STATUS_PLATNIKA SP
INNER JOIN STATUS_PLATNIKA_TYP SPT ON SP.ID_STATUS_PLATNIKA_TYP = http://SPT.ID
WHERE
SP.ID_KONTRAHENT = http://K.ID
AND SP.DATA_POZYSKANIA <= KW.MAX_ZALICZAJ_DO
AND (SPT.FLAGA_SYS IN(1) AND ((SP.DATA_OD <= KW.MAX_D_DO) AND (SP.DATA_DO IS NULL OR (SP.DATA_DO >= KW.MIN_D_OD))))
)

	UNION ALL

			SELECT
		1
	FROM
		KWARTALY\_DATY KD
		INNER JOIN URZADZENIE U ON 1 = 1

/* robimy liste kwartalow w ktorych obowiazuje status dzialalnosci kontrahenta i szukamy brakow deklaracji */
INNER JOIN KWARTALY KW ON
EXISTS
(SELECT
*
FROM
STATUS_PLATNIKA SP
INNER JOIN STATUS_PLATNIKA_TYP SPT ON SP.ID_STATUS_PLATNIKA_TYP = http://SPT.ID
WHERE
SP.ID_KONTRAHENT = http://K.ID
AND SP.DATA_POZYSKANIA <= KD.MAX_ZALICZAJ_DO
AND (SPT.FLAGA_SYS IN(1) AND ((SP.DATA_OD <= KW.D_DO) AND (SP.DATA_DO IS NULL OR (SP.DATA_DO >= KW.D_OD))))
)
WHERE
NOT EXISTS
(SELECT
*
FROM
SPR S
WHERE
S.ID_KONTRAHENT = http://K.ID
AND S.ID_URZADZENIE = http://U.ID
AND ((EXTRACT(YEAR FROM S.DATA_OD)*12+EXTRACT(MONTH FROM S.DATA_OD)) BETWEEN(KW.ROK*12+KW.MIESIAC_OD) AND (KW.ROK*12+KW.MIESIAC_DO) OR (EXTRACT(YEAR FROM S.DATA_DO)*12+EXTRACT(MONTH FROM S.DATA_DO)) BETWEEN(KW.ROK*12+KW.MIESIAC_OD) AND (KW.ROK*12+KW.MIESIAC_DO))
)
)
AND K.KONT_NR > 0)

SQL Message : -508
The cursor identified in the UPDATE or DELETE statement is not positioned on a row.

Engine Code : 335544348
Engine Message :
no current record for fetch operation

if you change last
AND K.KONT_NR > 0)
to
AND K.KONT_NR+0 > 0)

it run without an error

=>

WITH KWARTALY AS
(SELECT
*
FROM
KWARTAL KW
WHERE
KW.CKWARTAL BETWEEN '2019.I'
AND '2019.I'), KWARTALY_DATY AS
(SELECT
MIN(KW.ZALICZAJ_OD) AS MIN_ZALICZAJ_OD
, MAX(KW.ZALICZAJ_DO) AS MAX_ZALICZAJ_DO
, MIN(KW.D_OD) AS MIN_D_OD
, MAX(KW.D_DO) AS MAX_D_DO
, MIN(KW.CKWARTAL) AS MIN_KWARTAL
, MAX(KW.CKWARTAL) AS MAX_KWARTAL
FROM
KWARTALY KW)
SELECT
http://K.ID
, K.KONT_NR

FROM
KONTRAHENT K
WHERE
NOT
(
EXISTS
(
SELECT
1
FROM
KWARTALY_DATY KW
WHERE
/* jest jakakolwiek deklaracja w zadanym przedziale to znaczy, ze jest platnikiem*/
EXISTS
(SELECT
*
FROM
SPR S
INNER JOIN KWARTAL SKW ON S.ID_KWARTAL = http://SKW.ID
WHERE
S.ID_KONTRAHENT = http://K.ID
AND SKW.CKWARTAL BETWEEN KW.MIN_KWARTAL
AND KW.MAX_KWARTAL
)
OR
/* jesli ma wpis o statusie dzialnosci za zadany okres (z data pozyaskania nie z przyszlosci) to tez jest platnikiem */
EXISTS
(SELECT
*
FROM
STATUS_PLATNIKA SP
INNER JOIN STATUS_PLATNIKA_TYP SPT ON SP.ID_STATUS_PLATNIKA_TYP = http://SPT.ID
WHERE
SP.ID_KONTRAHENT = http://K.ID
AND SP.DATA_POZYSKANIA <= KW.MAX_ZALICZAJ_DO
AND (SPT.FLAGA_SYS IN(1) AND ((SP.DATA_OD <= KW.MAX_D_DO) AND (SP.DATA_DO IS NULL OR (SP.DATA_DO >= KW.MIN_D_OD))))
)

	UNION ALL

			SELECT
		1
	FROM
		KWARTALY\_DATY KD
		INNER JOIN URZADZENIE U ON 1 = 1

/* robimy liste kwartalow w ktorych obowiazuje status dzialalnosci kontrahenta i szukamy brakow deklaracji */
INNER JOIN KWARTALY KW ON
EXISTS
(SELECT
*
FROM
STATUS_PLATNIKA SP
INNER JOIN STATUS_PLATNIKA_TYP SPT ON SP.ID_STATUS_PLATNIKA_TYP = http://SPT.ID
WHERE
SP.ID_KONTRAHENT = http://K.ID
AND SP.DATA_POZYSKANIA <= KD.MAX_ZALICZAJ_DO
AND (SPT.FLAGA_SYS IN(1) AND ((SP.DATA_OD <= KW.D_DO) AND (SP.DATA_DO IS NULL OR (SP.DATA_DO >= KW.D_OD))))
)
WHERE
NOT EXISTS
(SELECT
*
FROM
SPR S
WHERE
S.ID_KONTRAHENT = http://K.ID
AND S.ID_URZADZENIE = http://U.ID
AND ((EXTRACT(YEAR FROM S.DATA_OD)*12+EXTRACT(MONTH FROM S.DATA_OD)) BETWEEN(KW.ROK*12+KW.MIESIAC_OD) AND (KW.ROK*12+KW.MIESIAC_DO) OR (EXTRACT(YEAR FROM S.DATA_DO)*12+EXTRACT(MONTH FROM S.DATA_DO)) BETWEEN(KW.ROK*12+KW.MIESIAC_OD) AND (KW.ROK*12+KW.MIESIAC_DO))
)
)
AND K.KONT_NR > 0)

----------------------------------------

SQL Message : -508
The cursor identified in the UPDATE or DELETE statement is not positioned on a row.

Engine Code : 335544348
Engine Message :
no current record for fetch operation

----------------------------------------

if you change last
AND K.KONT_NR > 0)
to
AND K.KONT_NR+0 > 0)

it run without an error

@firebird-automations
Copy link
Collaborator Author

Commented by: Sean Leyne (seanleyne)

Reformatted SQL for readibility

@firebird-automations
Copy link
Collaborator Author

Modified by: Sean Leyne (seanleyne)

description: WITH KWARTALY AS
(SELECT
*
FROM
KWARTAL KW
WHERE
KW.CKWARTAL BETWEEN '2019.I'
AND '2019.I'), KWARTALY_DATY AS
(SELECT
MIN(KW.ZALICZAJ_OD) AS MIN_ZALICZAJ_OD
, MAX(KW.ZALICZAJ_DO) AS MAX_ZALICZAJ_DO
, MIN(KW.D_OD) AS MIN_D_OD
, MAX(KW.D_DO) AS MAX_D_DO
, MIN(KW.CKWARTAL) AS MIN_KWARTAL
, MAX(KW.CKWARTAL) AS MAX_KWARTAL
FROM
KWARTALY KW)
SELECT
http://K.ID
, K.KONT_NR

FROM
KONTRAHENT K
WHERE
NOT
(
EXISTS
(
SELECT
1
FROM
KWARTALY_DATY KW
WHERE
/* jest jakakolwiek deklaracja w zadanym przedziale to znaczy, ze jest platnikiem*/
EXISTS
(SELECT
*
FROM
SPR S
INNER JOIN KWARTAL SKW ON S.ID_KWARTAL = http://SKW.ID
WHERE
S.ID_KONTRAHENT = http://K.ID
AND SKW.CKWARTAL BETWEEN KW.MIN_KWARTAL
AND KW.MAX_KWARTAL
)
OR
/* jesli ma wpis o statusie dzialnosci za zadany okres (z data pozyaskania nie z przyszlosci) to tez jest platnikiem */
EXISTS
(SELECT
*
FROM
STATUS_PLATNIKA SP
INNER JOIN STATUS_PLATNIKA_TYP SPT ON SP.ID_STATUS_PLATNIKA_TYP = http://SPT.ID
WHERE
SP.ID_KONTRAHENT = http://K.ID
AND SP.DATA_POZYSKANIA <= KW.MAX_ZALICZAJ_DO
AND (SPT.FLAGA_SYS IN(1) AND ((SP.DATA_OD <= KW.MAX_D_DO) AND (SP.DATA_DO IS NULL OR (SP.DATA_DO >= KW.MIN_D_OD))))
)

	UNION ALL

			SELECT
		1
	FROM
		KWARTALY\_DATY KD
		INNER JOIN URZADZENIE U ON 1 = 1

/* robimy liste kwartalow w ktorych obowiazuje status dzialalnosci kontrahenta i szukamy brakow deklaracji */
INNER JOIN KWARTALY KW ON
EXISTS
(SELECT
*
FROM
STATUS_PLATNIKA SP
INNER JOIN STATUS_PLATNIKA_TYP SPT ON SP.ID_STATUS_PLATNIKA_TYP = http://SPT.ID
WHERE
SP.ID_KONTRAHENT = http://K.ID
AND SP.DATA_POZYSKANIA <= KD.MAX_ZALICZAJ_DO
AND (SPT.FLAGA_SYS IN(1) AND ((SP.DATA_OD <= KW.D_DO) AND (SP.DATA_DO IS NULL OR (SP.DATA_DO >= KW.D_OD))))
)
WHERE
NOT EXISTS
(SELECT
*
FROM
SPR S
WHERE
S.ID_KONTRAHENT = http://K.ID
AND S.ID_URZADZENIE = http://U.ID
AND ((EXTRACT(YEAR FROM S.DATA_OD)*12+EXTRACT(MONTH FROM S.DATA_OD)) BETWEEN(KW.ROK*12+KW.MIESIAC_OD) AND (KW.ROK*12+KW.MIESIAC_DO) OR (EXTRACT(YEAR FROM S.DATA_DO)*12+EXTRACT(MONTH FROM S.DATA_DO)) BETWEEN(KW.ROK*12+KW.MIESIAC_OD) AND (KW.ROK*12+KW.MIESIAC_DO))
)
)
AND K.KONT_NR > 0)

----------------------------------------

SQL Message : -508
The cursor identified in the UPDATE or DELETE statement is not positioned on a row.

Engine Code : 335544348
Engine Message :
no current record for fetch operation

----------------------------------------

if you change last
AND K.KONT_NR > 0)
to
AND K.KONT_NR+0 > 0)

it run without an error

=>

WITH
KWARTALY AS (
SELECT *
FROM KWARTAL KW
WHERE
KW.CKWARTAL BETWEEN '2019.I' AND '2019.I'
),
KWARTALY_DATY AS (
SELECT
MIN(KW.ZALICZAJ_OD) AS MIN_ZALICZAJ_OD
, MAX(KW.ZALICZAJ_DO) AS MAX_ZALICZAJ_DO
, MIN(KW.D_OD) AS MIN_D_OD
, MAX(KW.D_DO) AS MAX_D_DO
, MIN(KW.CKWARTAL) AS MIN_KWARTAL
, MAX(KW.CKWARTAL) AS MAX_KWARTAL
FROM KWARTALY KW
)
SELECT
http://K.ID, K.KONT_NR
FROM
KONTRAHENT K
WHERE
NOT(
EXISTS(
SELECT 1
FROM KWARTALY_DATY KW
WHERE
/* jest jakakolwiek deklaracja w zadanym przedziale to znaczy, ze jest platnikiem*/
EXISTS(
SELECT *
FROM SPR S
INNER JOIN KWARTAL SKW ON S.ID_KWARTAL = http://SKW.ID
WHERE
S.ID_KONTRAHENT = http://K.ID
AND SKW.CKWARTAL BETWEEN KW.MIN_KWARTAL AND KW.MAX_KWARTAL
)
OR
/* jesli ma wpis o statusie dzialnosci za zadany okres (z data pozyaskania nie z przyszlosci) to tez jest platnikiem */
EXISTS (
SELECT *
FROM
STATUS_PLATNIKA SP
INNER JOIN STATUS_PLATNIKA_TYP SPT ON SP.ID_STATUS_PLATNIKA_TYP = http://SPT.ID
WHERE
SP.ID_KONTRAHENT = http://K.ID
AND SP.DATA_POZYSKANIA <= KW.MAX_ZALICZAJ_DO
AND (
SPT.FLAGA_SYS IN(1)
AND (
(SP.DATA_OD <= KW.MAX_D_DO) AND (SP.DATA_DO IS NULL OR (SP.DATA_DO >= KW.MIN_D_OD))
)
)
)
UNION ALL
SELECT 1
FROM KWARTALY_DATY KD
INNER JOIN URZADZENIE U ON 1 = 1
/* robimy liste kwartalow w ktorych obowiazuje status dzialalnosci kontrahenta i szukamy brakow deklaracji */
INNER JOIN KWARTALY KW ON
EXISTS(
SELECT *
FROM STATUS_PLATNIKA SP
INNER JOIN STATUS_PLATNIKA_TYP SPT ON SP.ID_STATUS_PLATNIKA_TYP = http://SPT.ID
WHERE
SP.ID_KONTRAHENT = http://K.ID
AND SP.DATA_POZYSKANIA <= KD.MAX_ZALICZAJ_DO
AND (
SPT.FLAGA_SYS IN(1)
AND (
(SP.DATA_OD <= KW.D_DO) AND
(SP.DATA_DO IS NULL OR (SP.DATA_DO >= KW.D_OD))
)
)
)
WHERE
NOT EXISTS(
SELECT *
FROM SPR S
WHERE
S.ID_KONTRAHENT = http://K.ID
AND S.ID_URZADZENIE = http://U.ID
AND (
( EXTRACT(YEAR FROM S.DATA_OD)*12+EXTRACT(MONTH FROM S.DATA_OD)) BETWEEN (KW.ROK*12+KW.MIESIAC_OD) AND (KW.ROK*12+KW.MIESIAC_DO)
OR (EXTRACT(YEAR FROM S.DATA_DO)*12+EXTRACT(MONTH FROM S.DATA_DO)) BETWEEN(KW.ROK*12+KW.MIESIAC_OD) AND (KW.ROK*12+KW.MIESIAC_DO)
)
)
)
AND K.KONT_NR > 0
)

----------------------------------------

SQL Message : -508
The cursor identified in the UPDATE or DELETE statement is not positioned on a row.

Engine Code : 335544348
Engine Message :
no current record for fetch operation

----------------------------------------

if you change last
AND K.KONT_NR > 0)
to
AND K.KONT_NR+0 > 0)

it run without an error

@firebird-automations
Copy link
Collaborator Author

Commented by: Sean Leyne (seanleyne)

Karol,

There are some aspects of the SQL which I find "unexpected":

1- The use of UNION when AND EXISTS could be used

2- The use of an EXISTS as a JOIN criteria, again this could be better expressed as a EXISTS within the WHERE clause

3- You use the alias "KW" 4 separate times. IMO, a very bad practice

@firebird-automations
Copy link
Collaborator Author

Commented by: @livius2

This is good catch, but as you probably can guess, this is not hand written query.
It is generated and mixed together from few separated modules.

I can change query (some generation paths) to hide the problem. But the issue somewhere exist, when the plan ues one additional index.

@firebird-automations
Copy link
Collaborator Author

Modified by: @dyemanov

assignee: Dmitry Yemanov [ dimitr ]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants