Mysql

在 MySQL 游標中,是否可以跳過游標的迭代或行?

  • June 11, 2019

在問這個問題之前,我正在檢查是否有任何類似的問題,但我沒有找到我要找的東西。開始了!。

問題是我有一個交叉的游標,但相信聲明一個變數,當我執行我執行驗證的課程時,我希望當驗證為 TRUE 時,我可以跳轉到游標的下一個“行” ,跳過此“記錄”,以便不執行以下游標階段。

我知道在 CURSOR 中我可以生成一個直接進行驗證的“子查詢”,但我希望能夠了解是否可以執行游標的這種“跳轉”。

這是我的一些程式碼。

DECLARE queryCriterionHasArticle CURSOR FOR 
SELECT 
 CCLA.CLEG_ID, 
 CCLA.ALEG_ID, 
 CCLA.CCL_ID, 
 CCLA.CCLA_ID, 
 CCLAC.CRCA_ID 
FROM 
 SER_LEGAL.CONFIGURACION_has_CUERPO_LEGAL_has_ARTICULO_CUMPLIMIENTO AS CCLAC 
 JOIN SER_LEGAL.CONFIGURACION_has_CUERPO_LEGAL_has_ARTICULO AS CCLA ON CCLA.CCLA_ID = CCLAC.CCLA_ID 
 AND CCLA.ENT_ID = companyId 
 AND CCLA.CCLA_ESTADO = 1 
 AND CCLA.ESA_ID = 1 
 AND CCLA.CCLA_TIPO_CLASIFICACION = 1 
WHERE 
 CCLAC.CRC_ID = criterionId;
DECLARE CONTINUE HANDLER FOR NOT FOUND 
SET 
 noMoreRowsOne = TRUE;
-- ####################################################################################    
-- Se comienza a recorrer un cursor que tiene los articulos asociados al criterio
-- ####################################################################################    
OPEN queryCriterionHasArticle;
queryCriterionHasArticle_LOOP : LOOP FETCH queryCriterionHasArticle INTO legalBodyId, 
legalArticleId, 
legalBodyConfigId, 
legalArticleConfigId, 
criterionConfigId;
IF noMoreRowsOne THEN CLOSE queryCriterionHasArticle;
LEAVE queryCriterionHasArticle_LOOP;
END IF;
-- ####################################################################################
-- 11/06/2019
-- Se procede a agregar una validacion donde no se conside aquellos articulos que tengan
-- una evaluacion en SER_LEGAL.EVALUACION_has_ARTICULO WHERE EHA_TIPO = 1 AND EHA_ORIGEN = 2
-- debido a que estos articulos han sido evaludos con la integracion SISQUIM/ALMACENAMIENTO
-- estos articulos no se pueden modificar desde pre-evaluacion
-- ####################################################################################
SET 
 validationIntegrationSisquim = (
   SELECT 
     IF(
       COUNT(0) = 1, 
       TRUE, 
       FALSE
     ) 
   FROM 
     SER_LEGAL.EVALUACION_has_ARTICULO 
   WHERE 
     CCL_ID = legalBodyConfigId 
     AND CCLA_ID = legalArticleConfigId 
     AND EHA_TIPO = 1 
     AND EHA_ORIGEN = 2
 );
IF (
 validationIntegrationSisquim IS TRUE
) THEN -- ¿¿¿¿¿LEAVE queryCriterionHasArticle_LOOP;?????
END IF;
END LOOP;

感謝您的幫助和指導。

游標通常可以變成查詢。使用游標程式 SQL 以避免 SQL 的威力。

但首先,關於訂購的教訓。“表”是無序的。執行 aSELECT不能保證將傳遞的行是什麼——除非你有一個ORDER BY子句。

這是你想要做的嗎?“從表的組合中獲取一些行,但在滿足某些條件時停止。”?

相反,如果您需要“從表組合中獲取所有行,但滿足某些條件的行除外”,那麼像這樣的單個查詢就足夠了:

SELECT ...
   FROM a JOIN b ...
   WHERE NOT EXISTS ( SELECT 1 FROM SER_LEGAL.EVALUACION_has_ARTICULO WHERE ... )

不需要游標。

如果您真的需要在此類“第一次”出現時停止,請提供,ORDER BY以便我們進一步討論。

引用自:https://dba.stackexchange.com/questions/240303