òÅÛÉÌ ÐÏÄÎÑÔØ ÜÔÕ ÔÅÍÕ × ÏÞÅÒÅÄÎÏÊ ÒÁÚ ÐÏ ÐÒÉÞÉÎÅ ÔÏÇÏ ÞÔÏ ÂÁÚÙ Õ ÎÅËÏÔÏÒÙÈ ËÌÉÅÎÔÏ× ÒÁÓÔÕÔ É ÐÒÏÇÒÁÍÍÁ ÐÏÐÒÏÓÔÕ ÎÁÞÉÎÁÅÔ ÐÏÄÔÏÒÍÁÖÉ×ÁÔØ É ÞÅÍ ÄÁÌØÛÅ ÔÅÍ ÄÅÌÁ ÈÕÖÅ Ô.Ë. ÄÁÎÎÙÈ ÂÏÌØÛÅ Ó ËÁÖÄÙÍ ÄÎÅÍ. îÁÞÁÌ ÒÁÚÂÉÒÁÔØÓÑ É ÐÒÉÍÅÎÉÌ 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] ÈÏÔÅÌÏÓØ ÂÙ ÔÏÖÅ ÕËÁÚÁÔØ ÐÒÉ ÄÏÂÁ×ÌÅÎÉÉ ÕÓÌÏ×ÉÑ