-- Scheduler helpers for running SIMULATE_COMMERCE_ACTIVITY asynchronously. -- Run as the schema owner after oracle_ecommerce_activity.sql. -- The schema owner needs the CREATE JOB system privilege. WHENEVER SQLERROR EXIT SQL.SQLCODE SET DEFINE OFF SET SERVEROUTPUT ON SIZE UNLIMITED CREATE OR REPLACE PROCEDURE create_commerce_activity_job ( p_job_name IN VARCHAR2, p_iterations IN PLS_INTEGER, p_seconds_between_iterations IN NUMBER, p_average_rows_per_iteration IN NUMBER ) AS l_job_name VARCHAR2(128); BEGIN IF p_job_name IS NULL OR TRIM(p_job_name) IS NULL THEN RAISE_APPLICATION_ERROR(-20010, 'p_job_name must not be empty'); END IF; l_job_name := DBMS_ASSERT.SIMPLE_SQL_NAME(UPPER(TRIM(p_job_name))); IF p_iterations IS NULL OR p_iterations < 0 THEN RAISE_APPLICATION_ERROR(-20011, 'p_iterations must be a non-negative integer'); END IF; IF p_seconds_between_iterations IS NULL OR p_seconds_between_iterations < 0 THEN RAISE_APPLICATION_ERROR(-20012, 'p_seconds_between_iterations must be non-negative'); END IF; IF p_average_rows_per_iteration IS NULL OR p_average_rows_per_iteration < 0 OR p_average_rows_per_iteration > 10000 THEN RAISE_APPLICATION_ERROR(-20013, 'p_average_rows_per_iteration must be between 0 and 10000'); END IF; DBMS_SCHEDULER.CREATE_JOB( job_name => l_job_name, job_type => 'STORED_PROCEDURE', job_action => 'SIMULATE_COMMERCE_ACTIVITY', number_of_arguments => 3, start_date => SYSTIMESTAMP, enabled => FALSE, auto_drop => FALSE, comments => 'Background e-commerce activity simulation' ); DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE( job_name => l_job_name, argument_position => 1, argument_value => TO_CHAR(p_iterations, 'TM9', 'NLS_NUMERIC_CHARACTERS=''.,''') ); DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE( job_name => l_job_name, argument_position => 2, argument_value => TO_CHAR( p_seconds_between_iterations, 'TM9', 'NLS_NUMERIC_CHARACTERS=''.,''' ) ); DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE( job_name => l_job_name, argument_position => 3, argument_value => TO_CHAR( p_average_rows_per_iteration, 'TM9', 'NLS_NUMERIC_CHARACTERS=''.,''' ) ); DBMS_SCHEDULER.ENABLE(l_job_name); DBMS_OUTPUT.PUT_LINE( 'Enabled Scheduler job ' || l_job_name || ' to run SIMULATE_COMMERCE_ACTIVITY in the background.' ); END; / CREATE OR REPLACE PROCEDURE list_commerce_activity_jobs AS l_jobs_found PLS_INTEGER := 0; BEGIN DBMS_OUTPUT.PUT_LINE( RPAD('JOB NAME', 32) || RPAD('STATE', 16) || RPAD('ENABLED', 10) || RPAD('RUNS', 8) || RPAD('FAILURES', 10) || 'LAST START' ); DBMS_OUTPUT.PUT_LINE(RPAD('-', 100, '-')); FOR job_rec IN ( SELECT job_name, state, enabled, run_count, failure_count, last_start_date FROM user_scheduler_jobs WHERE job_type = 'STORED_PROCEDURE' AND job_action = 'SIMULATE_COMMERCE_ACTIVITY' ORDER BY job_name ) LOOP l_jobs_found := l_jobs_found + 1; DBMS_OUTPUT.PUT_LINE( RPAD(job_rec.job_name, 32) || RPAD(job_rec.state, 16) || RPAD(CASE WHEN job_rec.enabled = 'TRUE' THEN 'YES' ELSE 'NO' END, 10) || RPAD(TO_CHAR(job_rec.run_count), 8) || RPAD(TO_CHAR(job_rec.failure_count), 10) || NVL( TO_CHAR(job_rec.last_start_date, 'YYYY-MM-DD HH24:MI:SS TZH:TZM'), 'never' ) ); END LOOP; IF l_jobs_found = 0 THEN DBMS_OUTPUT.PUT_LINE('No SIMULATE_COMMERCE_ACTIVITY Scheduler jobs found.'); END IF; END; / CREATE OR REPLACE PROCEDURE stop_commerce_activity_job ( p_job_name IN VARCHAR2 ) AS l_job_name VARCHAR2(128); l_job_count PLS_INTEGER; BEGIN IF p_job_name IS NULL OR TRIM(p_job_name) IS NULL THEN RAISE_APPLICATION_ERROR(-20020, 'p_job_name must not be empty'); END IF; l_job_name := DBMS_ASSERT.SIMPLE_SQL_NAME(UPPER(TRIM(p_job_name))); SELECT COUNT(*) INTO l_job_count FROM user_scheduler_jobs WHERE job_name = l_job_name AND job_type = 'STORED_PROCEDURE' AND job_action = 'SIMULATE_COMMERCE_ACTIVITY'; IF l_job_count = 0 THEN RAISE_APPLICATION_ERROR(-20021, 'No activity Scheduler job named ' || l_job_name); END IF; DBMS_SCHEDULER.DISABLE( name => l_job_name, force => TRUE ); DBMS_OUTPUT.PUT_LINE('Stopped and disabled Scheduler job ' || l_job_name || '.'); END; / CREATE OR REPLACE PROCEDURE remove_commerce_activity_job ( p_job_name IN VARCHAR2 ) AS l_job_name VARCHAR2(128); l_job_count PLS_INTEGER; BEGIN IF p_job_name IS NULL OR TRIM(p_job_name) IS NULL THEN RAISE_APPLICATION_ERROR(-20030, 'p_job_name must not be empty'); END IF; l_job_name := DBMS_ASSERT.SIMPLE_SQL_NAME(UPPER(TRIM(p_job_name))); SELECT COUNT(*) INTO l_job_count FROM user_scheduler_jobs WHERE job_name = l_job_name AND job_type = 'STORED_PROCEDURE' AND job_action = 'SIMULATE_COMMERCE_ACTIVITY'; IF l_job_count = 0 THEN RAISE_APPLICATION_ERROR(-20031, 'No activity Scheduler job named ' || l_job_name); END IF; DBMS_SCHEDULER.DROP_JOB( job_name => l_job_name, force => TRUE ); DBMS_OUTPUT.PUT_LINE('Removed Scheduler job ' || l_job_name || '.'); END; / SHOW ERRORS PROCEDURE create_commerce_activity_job SHOW ERRORS PROCEDURE list_commerce_activity_jobs SHOW ERRORS PROCEDURE stop_commerce_activity_job SHOW ERRORS PROCEDURE remove_commerce_activity_job