1. Información general
Escenarios de uso: cuando una parte del tiempo de consulta SQL es demasiado larga, puede dividir la consulta del período de tiempo , como: consultas anuales, consultas por mes
2 código fuente
DECLARE
v_start_date DATE := DATE '2017-01-01' ;
v_end_date DATE := DATE '2020-09-30' ;
v_temp_date DATE ;
v_cycles PLS_INTEGER;
BEGIN
v_cycles := ceil( months_between( v_end_date, v_start_date) / 12 ) ;
v_temp_date := v_start_date;
FOR each_year IN 1 . . v_cycles LOOP
IF v_end_date >= v_start_date THEN
IF v_end_date >= v_temp_date THEN
v_temp_date := add_months( v_start_date, 12 ) ;
dbms_output. put_line( '循环次数:' || each_year) ;
dbms_output. put_line( '开始时间:' ||
to_char( v_start_date, 'YYYY-MM-DD HH24:MI:SS' ) ) ;
dbms_output. put_line( '结束时间:' ||
to_char( v_temp_date, 'YYYY-MM-DD HH24:MI:SS' ) ) ;
v_start_date := v_temp_date;
v_temp_date := add_months( v_temp_date, 12 ) ;
ELSE
dbms_output. put_line( '循环次数:' || each_year) ;
dbms_output. put_line( '开始时间:' ||
to_char( v_start_date, 'YYYY-MM-DD HH24:MI:SS' ) ) ;
dbms_output. put_line( '结束时间:' ||
to_char( v_end_date, 'YYYY-MM-DD HH24:MI:SS' ) ) ;
END IF ;
END IF ;
dbms_output. put_line( '' ) ;
END LOOP ;
EXCEPTION
WHEN OTHERS THEN
dbms_output. put_line( dbms_utility. format_error_backtrace) ;
dbms_output. put_line( SQLERRM) ;
END ;