Mysql
在 MySQL 游標中,是否可以跳過游標的迭代或行?
在問這個問題之前,我正在檢查是否有任何類似的問題,但我沒有找到我要找的東西。開始了!。
問題是我有一個交叉的游標,但相信聲明一個變數,當我執行我執行驗證的課程時,我希望當驗證為 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 的威力。
但首先,關於訂購的教訓。“表”是無序的。執行 a
SELECT
不能保證將傳遞的行是什麼——除非你有一個ORDER BY
子句。這是你想要做的嗎?“從表的組合中獲取一些行,但在滿足某些條件時停止。”?
相反,如果您需要“從表組合中獲取所有行,但滿足某些條件的行除外”,那麼像這樣的單個查詢就足夠了:
SELECT ... FROM a JOIN b ... WHERE NOT EXISTS ( SELECT 1 FROM SER_LEGAL.EVALUACION_has_ARTICULO WHERE ... )
不需要游標。
如果您真的需要在此類“第一次”出現時停止,請提供,
ORDER BY
以便我們進一步討論。