Files
programming/Oracle_dataset/online-ecommerce1/oracle_ecommerce_job_management.sql
2026-10-04 10:36:14 +02:00

171 lines
5.7 KiB
SQL

-- 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