sql >> データベース >  >> RDS >> Mysql

MySQLのクエリによって返される各行のストアドプロシージャを呼び出す

    「ループ」(for-each、whileなど)や「分岐」(if-else、callなど)などの概念は手続き型 宣言型には存在しません SQLのような言語。通常、希望する結果を宣言的な方法で表現できます。これは、この問題を解決するための正しい方法です。

    たとえば、testProc 呼び出されるプロシージャは、指定されたidを使用します 別のテーブルへのルックアップキーとして、代わりに単にJOINすることができます(そしてそうすべきです)。 テーブルを一緒に-例:

    SELECT ...
    FROM   objects JOIN other USING (id)
    WHERE  ...
    

    問題を宣言的に表現できない非常にまれな状況でのみ、代わりに手続き的に問題を解決する必要があります。保存された手順 MySQLで手続き型コードを実行する唯一の方法です。したがって、既存のsprocを変更して、ループ内で現在のロジックを実行するか、ループ内から既存のロジックを呼び出す新しいsprocを作成する必要があります。

    CREATE PROCEDURE foo() BEGIN
      DECLARE done BOOLEAN DEFAULT FALSE;
      DECLARE _id BIGINT UNSIGNED;
      DECLARE cur CURSOR FOR SELECT id FROM objects WHERE ...;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;
    
      OPEN cur;
    
      testLoop: LOOP
        FETCH cur INTO _id;
        IF done THEN
          LEAVE testLoop;
        END IF;
        CALL testProc(_id);
      END LOOP testLoop;
    
      CLOSE cur;
    END
    



    1. SQLIN句をパラメータ化する

    2. CSVを解析し、GrailsのMysqlデータベースにエクスポートします

    3. MySQLルートユーザーを使用してMySQLにアクセスする方法

    4. SQLクエリ:文字の長さで並べ替えますか?