òÅÛÉÌ ÐÏÄÎÑÔØ ÜÔÕ ÔÅÍÕ × ÏÞÅÒÅÄÎÏÊ ÒÁÚ ÐÏ ÐÒÉÞÉÎÅ ÔÏÇÏ ÞÔÏ ÂÁÚÙ Õ ÎÅËÏÔÏÒÙÈ
ËÌÉÅÎÔÏ× ÒÁÓÔÕÔ É ÐÒÏÇÒÁÍÍÁ ÐÏÐÒÏÓÔÕ ÎÁÞÉÎÁÅÔ ÐÏÄÔÏÒÍÁÖÉ×ÁÔØ É ÞÅÍ ÄÁÌØÛÅ
ÔÅÍ ÄÅÌÁ ÈÕÖÅ Ô.Ë. ÄÁÎÎÙÈ ÂÏÌØÛÅ Ó ËÁÖÄÙÍ ÄÎÅÍ. îÁÞÁÌ ÒÁÚÂÉÒÁÔØÓÑ  É
ÐÒÉÍÅÎÉÌ EXECUTE STATEMENT ÏÔ ÂÅÚÙÓÈÏÄÎÏÓÔÉ É ÐÏÌÕÞÉÌ ÐÒÉÒÏÓÔ ×
ÐÒÏÉÚ×ÏÄÉÔÅÌØÎÏÓÔÉ ÂÏÌÅÅ 10 ÒÁÚ. òÁÚÒÁÂÏÔÞÉËÉ ÍÏÇÕÔ ÓËÁÚÔØ ×ÏÔ É ÐÉÛÉ ÎÏ ËÔÏ
ÐÉÓÁÌ ÉÓÐÏÌØÚÕÀÑ EXECUTE STATEMENT ÞÔÏ ÐÉÓÁÔØ ÎÅ ÔÁË ÕÖ É ÐÒÏÓÔÏ Ô.Ë. ÐÒÉ
ÄÏÐÕÝÅÎÉÉ ÏÛÉÂËÉ ÓÔÁÎÏ×ÉÔÓÑ ÎÅ ÐÏÓÉÂÅ ÞÉÔÁÑ ×ÏÔÔÁËÏÊ ËÏÄ ÍÉÎÕÔ 20 ÉÓËÁÌ
ÏÛÉÂËÕ Ô.Ë. ÐÒÏÐÕÓÔÉÌ ÐÒÏÂÅÌ :(.

CREATE PROCEDURE PVD248_ItemB (ID500_1 varchar(38), ID500_6 INTEGER, ID500_7
DATE, ID500_8 DATE,
ID026_1 varchar(38))
returns
(D009_1 varchar(38))
AS
  declare variable sql varchar(1024);
  declare variable sqlD503T varchar(300);
  declare variable sqlD503W varchar(300);
BEGIN
  sqlD503T = case ID500_6
     when 0 then ''
     else ', D503'
  end;
  sqlD503W = case ID500_6
     when 1 then ' and D503.D500_1 = ''' || :ID500_1 || ''' and D503.D009_1
= T002.D009_1'
     when 2 then ' and D503.D500_1 = ''' || :ID500_1 || ''' and not
D503.D009_1 = T002.D009_1'
     else ''
  end;
  sql = 'SELECT T002.D009_1 FROM T002, D505' || sqlD503T || ' WHERE' ||
    ' D505.D500_1 = ''' || :ID500_1 || ''' and D505.D009_1 = T002.D009x and'
||
    ' T002.T003_3 <= ''' || :ID500_8 || ''' and' ||
    ' (''' || COALESCE(:ID026_1, 'null') || ''' = T002.D026_1 or' ||
    '  ''' || COALESCE(:ID026_1, 'null') || ''' = T002.D026_1b1 or' ||
    '  ''' || COALESCE(:ID026_1, 'null') || ''' = T002.D026_1b or' ||
    '  ''' || COALESCE(:ID026_1, 'null') || ''' = T002.D026_1b1b) and' ||
    ' not T002.D009_1 IS NULL' || sqlD503W ||
    ' GROUP BY T002.D009_1';

  FOR EXECUTE STATEMENT sql
    INTO :D009_1
  DO BEGIN
    SUSPEND;
  END

  sqlD503T = case ID500_6
     when 0 then ''
     else ', D503'
  end;
  sqlD503W = case ID500_6
     when 1 then ' and D503.D500_1 = ''' || :ID500_1 || ''' and D503.D009_1
= T002.D009_1b'
     when 2 then ' and D503.D500_1 = ''' || :ID500_1 || ''' and not
D503.D009_1 = T002.D009_1b'
     else ''
  end;
  sql = 'SELECT T002.D009_1b FROM T002, D505' || sqlD503T || ' WHERE' ||
    ' D505.D500_1 = ''' || :ID500_1 || ''' and D505.D009_1 = T002.D009x and'
||
    ' T002.T003_3 <= ''' || :ID500_8 || ''' and' ||
    ' (''' || COALESCE(:ID026_1, 'null') || ''' = T002.D026_1 or' ||
    '  ''' || COALESCE(:ID026_1, 'null') || ''' = T002.D026_1b1 or' ||
    '  ''' || COALESCE(:ID026_1, 'null') || ''' = T002.D026_1b or' ||
    '  ''' || COALESCE(:ID026_1, 'null') || ''' = T002.D026_1b1b) and' ||
    ' not T002.D009_1b IS NULL' || sqlD503W ||
    ' GROUP BY T002.D009_1b';

  FOR EXECUTE STATEMENT sql
    INTO :D009_1
  DO BEGIN
    SUSPEND;
  END
END

ñ ÍÏÌÞÕ ÕÖÅ ÐÒÏ ËÕÞÕ ËÏ×ÙÞÅË ËÏÔÏÒÙÅ ÎÕÖÎÏ ÎÁ×ÔÙËÁÔØ. ïÓÏÂÅÎÎÏ ÍÅÎÑ
ÐÒÉÂÉ×ÁÅÔ COALESCE( ËÏÔÏÒÙÊ ÐÒÉÈÏÄÉÔÓÑ ×ÔÙËÁÔØ ....

ëÁË ÉÚ×ÅÓÔÎÏ ÎÁ ×ÓÅ ÓÌÕÞÁÉ ÖÉÚÎÉ ÚÁÐÒÏÓ ÎÅ ÎÁÐÉÛÅÛØ Ô.Ë. ÑÚÙË SQL ÍÁÌÏ Ë
ÜÔÏÍÕ ÐÒÅÓÐÏÓÏÂÌÅÎ × ÓÉÌÕ Ó×ÏÅÊ ÏÓÏÂÅÎÎÏÓÔÉ É ÐÏÜÔÏÍÕ ÐÒÉÈÏÄÉÔÓÑ ÐÉÓÁÔØ ÔÁË

for select ... where
(
(:X = 0) or
(:X = 1 and exists()) or
(:X = 2 and not exists())
) and
(
(:Y = 0) or
(:Y = 1 and exists()) or
(:Y = 2 and not exists())
)

X & Y ÎÉËÏÇÄÁ ÎÅÍÅÎÑÀÔÓÑ × ÈÏÄÅ ×ÙÐÏÌÎÅÎÉÑ ÚÁÐÒÏÓÁ.
åÓÔÅÓÔ×ÅÎÎÏ ËÏÇÄÁ ÐÅÒÅÐÉÓÁÌ ÎÁ EXECUTE STATEMENT ÔÁÍ ÐÏÌÕÞÉÌÓÑ join É ÔÅ
ÓÁÍÙÅ 160000 ÚÁÐÉÓÅÊ ÐÒÅ×ÒÁÔÉÌÉÓØ × 600 Ô.Ë. ÄÌÑ exists ÂÙÌ ÐÅÒÅÂÏÒ ÚÁÐÉÓÅÊ.
ëÔÏ ÕÖÅ ÐÏÎÑÌ Ï ÞÅÍ ÒÅÞØ ÐÏÊÍÅÔ É ÔÏ ÞÔÏ × ÄÁÎÎÏÍ ÐÒÉÍÅÒÅ 9 ×ÁÒÉÁÎÔÏ×
ÚÁÐÒÏÓÏ× ÎÁÄÏ ÎÁÐÉÓÁÔØ ÞÔÏÂÙ ×ÓÅ ÂÙÌÉ ÎÁ 100% ÂÙÓÔÒÏÄÅÊÓÔ×ÕÀÝÉÍÉ. á ÔÁË
ÐÏÌÕÞÁÅÔÓÑ ÖÅÒÔ×ÕÅÔÓÑ ÐÒÏÉÚ×ÏÄÉÔÅÌØÎÏÓÔØ Ô.Ë. × ÏÔÞÅÔÁÈ ÚÁÄÅÊÓÔ×Ï×ÁÎÏ ÎÅ 2
ÐÁÒÁÍÅÔÒÁ Ó ÔÁËÉÍÉ ÕÓÌÏ×ÉÑÍÉ Á ËÁË ÐÒÁ×ÉÌÏ ÂÏÌØÛÅ, Á ÚÎÁÞÉÔ É ÕÞÅÓÔØ ×ÓÅ
×ÁÒÉÁÎÔÙ ÐÒÁËÔÉÞÅÓËÉ ÎÅ×ÏÚÍÏÖÎÏ.

ÎÏ ÅÓÌÉ ÂÙ ÓÅÒ×ÅÒ ÕÍÅÌ ÓÌÅÇËÁ ÆÏÒÍÉÒÏ×ÁÔØ ÓÅÌÅËÔ ÓÁÍ ÔÏ ÂÙÌÏ ÂÙ ÏÇÒÏÍÎÏÅ
ÓÞÅÓÔØÅ ×ÅÍ
ÔÏÂÉÛØ ÍÏÖÎÏ ÂÙÌÏ ÂÙ ÎÁÐÉÓÁÔØ ÔÁË
for select ... from T1
where ...
casefromwhere :X
 when 1 then TX, TX.F1 = :F1 and T1.Fx = TX.Fx
 when 2 then TX, TX.F1 = :F1 and not T1.Fx = TX.Fx
end
casefromwhere :Y
 when 1 then TY, TY.F1 = :F1 and T1.Fy = TX.Fy
 when 2 then TY, TY.F1 = :F1 and not T1.Fy = TX.Fy
end

ÐÏÞÅÍÕ casefromwhere ÐÏÔÏÊ ÐÒÉÞÉÎÅ ÞÔÏÂÙ ÍÏÖÎÏ ÂÙÌÏ ÕËÁÚÁÔØ ÞÔÏ Ë ÕÓÌÏ×ÉÀ
ÂÕÄÅÔ ÄÁÂÁ×ÌÅÎÁ É ÔÁÂÌÉÃÁ ÐÏ ×ÏÚÍÏÖÎÏÓÔÉ ÍÏÖÎÏ ËÏÎÅÞÎÏ É ÔÁË

case :Y
 when 1 then from TY where TY.F1 = :F1 and T1.Fy = TX.Fy
 when 2 then from TY where TY.F1 = :F1 and not T1.Fy = TX.Fy
end

ÜÔÏ ËÁË ÒÁÚÒÁÂÏÔÞÉËÉ ÓÏÞÔÕÔ ÎÕÖÎÙÍ ÌÉÖÂÙ ÂÙÌÏ É ÒÁÂÏÔÁÌÏ

ÐÒÉÍÅÒ ÐÏÎÉÍÁÎÉÑ ÓÅÒ×ÅÒÏÍ ÜÔÏÇÏ ÔÅËÓÔÁ
ÅÓÌÉ X = 0, Á Y = 2 ÔÏ ÓÅÒ×ÅÒ ÄÌÑ ÓÅÂÅ ÐÒÅÏÂÒÏÚÕÅÔ ÚÁÐÒÏÓ ×

for select ... from T1, TY
where ...
TY.F1 = :F1 and not T1.Fy = TX.Fy

ÅÓÌÉ X = 2 Á Y = 1 ÔÏ ÓÅÒ×ÅÒ ÄÌÑ ÓÅÂÅ ÐÒÅÏÂÒÏÚÕÅÔ ÚÁÐÒÏÓ ×
for select ... from T1, TX, TY
where ...
TX.F1 = :F1 and not T1.Fx = TX.Fx and
TY.F1 = :F1 and T1.Fy = TX.Fy

ÅÓÔÅÓÔ×ÅÎÎÏ [and | or] ÈÏÔÅÌÏÓØ ÂÙ ÔÏÖÅ ÕËÁÚÁÔØ ÐÒÉ ÄÏÂÁ×ÌÅÎÉÉ ÕÓÌÏ×ÉÑ




Ответить