0

Die gespeicherte proc ist eingerichtet, so dass der Benutzer kann es mit beliebigen Daten aufrufen. Ich möchte in der Lage sein, das Datum auf zwei Monate zu beschränken.wie Daten von Daten begrenzt in mysql gespeicherte Prozedur

Wenn der Benutzer jetzt den Bericht ohne ausgewählte Daten aufruft, stürzt der Berichtsserver ab, weil zu viele Daten vorhanden sind. Ich möchte in der Lage sein, die Zeilen entweder zu begrenzen, wenn die Daten mehr als 2 Monate sind.

DELIMITER ;; 
    DROP PROCEDURE IF EXISTS rpt_missing_payroll_files_report_test;; 
    CREATE PROCEDURE `rpt_missing_payroll_files_report_test`(
     IN BEGIN_DATE VARCHAR(255), 
     IN END_DATE VARCHAR(255) 
    ) 
    BEGIN 

    SELECT c.id, 
      c.name, 
      ip.name AS icp_name, 
      s.name AS country_name, 
      sc.name AS pm_name, 
      pc.frequency, 
      pc.check_date AS check_date, 
      pc.transmit_date, 
      IFNULL(ps.updated_at, ph.updated_at) AS submit_date, 
      cpp.created_at AS date_received, 
      ifnull(cpp.import_filename,'N/A') AS import_filename, 
      CASE WHEN cpp.created_at IS NOT NULL THEN 1 END AS date_received_sum, 
      CASE WHEN cpp.success = 1 THEN 1 END AS file_successsum, 
      DATEDIFF(pc.check_date,cpp.created_at) AS date_diff, 
      DATE_FORMAT(BEGIN_DATE,'%m/%d/%Y') AS BeginDate, 
      DATE_FORMAT(END_DATE,'%m/%d/%Y') AS EndDate 
    FROM co_payroll_calendars pc 
    inner join co_infos c on pc.co_info_id = c.id                                
    inner join icp_countries icp on c.icp_country_id = icp.id 
    INNER JOIN sys_countries s ON icp.sys_country_id = s.id 
    INNER JOIN icp_infos ip ON ip.id = icp.icp_info_id 
    LEFT OUTER JOIN co_payroll_entry_setups ps ON pc.id = ps.co_payroll_calendar_id             
    LEFT OUTER JOIN co_payroll_entry_setup_histories ph ON pc.id = ph.co_payroll_calendar_id         
    LEFT OUTER JOIN co_payroll_processes cpp ON cpp.check_date >= (pc.check_date - INTERVAL 10 DAY) AND cpp.co_info_id = c.id 
    LEFT OUTER JOIN sys_csrs sc ON c.sys_csr_id = sc.id 
    -- below is the part i probably need to change 
    WHERE (ifnull(BEGIN_DATE,'') = '' 
      OR pc.check_date >= BEGIN_DATE) 
     AND (ifnull(END_DATE,'') = '' 
      OR pc.check_date <= END_DATE) 
    GROUP BY id, 
      check_date 
    ORDER BY country_name, check_date DESC, c.id; 

    END;; 
    DELIMITER ; 

Folgendes sollte

ANRUF rpt_missing_payroll_files_report_test (‚2017.06.01‘, ‚2017.07.01‘)

Die folgende Beschreibung ist nicht gestattet oder beschränkt auf einen bestimmten zulässig Menge der Zeilen

ANRUF rpt_missing_payroll_files_report_test (‚2016.01.01‘, ‚2017.07.01‘)

+0

Beachten Sie, dass Datumsangaben vom Typ "DATUM" sein sollten, nicht beliebige 'VARCHAR'-Felder. – tadman

Antwort

0

die Parameter auf die richtige Art Stellen (dh, ein Datum verwenden, n ot VARCHAR).

Sie sollten auch diese überprüfen:

LEFT OUTER JOIN co_payroll_processes cpp 
ON cpp.check_date >= (pc.check_date - INTERVAL 10 DAY) 
AND cpp.co_info_id = c.id 

Beachten Sie die Ungleichheit wählt alle Zeilen mit passenden id mit Daten posterior (pc.check_date - INTERVAL 10 DAY). Je nach Ihrem Schema kann dies sehr viel oder nicht sein. Sie sollten die Abfrage ohne GROUP BY und ORDER BY testen und untersuchen, was genau zurückgegeben wird. Wenn Sie viele Duplikate finden, könnten Sie die Abfrage viel schneller machen, indem Sie bessere JOIN-Bedingungen verwenden.

Nun, über Ihre wichtigste Frage, die Antwort ist einfach: Fügen Sie diese zu Ihrem proc

IF END_DATE > (BEGIN_DATE + INTERVAL 2 MONTH) THEN 
    raise an error 
ELSE 
    your huge SELECT 
END IF 

Es ist ganz einfach. Hier ist, wie zu raise an error in einem mysql gespeicherten proc (die Art, es zu tun, hängt von Ihrer Version ab).

Sie können auch einfach "SELECT" Ihre Nachricht hier "" und die Nachricht Zeichenfolge wird an den Client zurückgegeben (die dann möglicherweise abstürzen, da es eine bestimmte Anzahl von Spalten erwartet, so wäre es besser, eine zu erhöhen Error).

+0

Danke! hat super funktioniert! – nick

+0

Ein Problem. wenn ich es so mache, kann ich den proc in pentaho (berichts software) nicht aufrufen. hier ist, wie ich den bericht rufe {call rpt_missing_payroll_files_report ($ {Begin_Date}, $ {End_Date}, $ {Country}, $ {is_submitted}, $ {file_success})} Wenn ich es so mache, sind die einzigen Felder, die angezeigt werden, die Fehlermeldung – nick

+0

Ja, Sie müssen einen Weg finden, um den Fehler zu Ihrer Berichtssoftware zu kommunizieren (ich habe diesen nie benutzt, kann also hier nicht helfen) . – peufeu

Verwandte Themen