Request API Functions
The Request API provides functions for creating and managing metadata change requests, request lines, and their properties within EPMware's workflow system.
Package: EW_REQUEST
Usage: ew_request.<function_name>
Overview
The Request API enables: - Request creation and management - Request line operations - Property updates - Status management - Bulk operations - Request validation
Core Request Functions
Create Request
create_request
Creates a new request header.
FUNCTION create_request(
p_request_name IN VARCHAR2,
p_request_type IN VARCHAR2 DEFAULT 'STANDARD',
p_description IN VARCHAR2 DEFAULT NULL,
p_priority IN VARCHAR2 DEFAULT 'MEDIUM',
p_due_date IN DATE DEFAULT NULL
) RETURN NUMBER; -- Returns request_id
Parameters:
- p_request_name - Name/title of request
- p_request_type - Type of request
- p_description - Request description
- p_priority - Priority (HIGH, MEDIUM, LOW)
- p_due_date - Request due date
Example:
DECLARE
l_request_id NUMBER;
BEGIN
l_request_id := ew_request.create_request(
p_request_name => 'Q1 Account Updates',
p_request_type => 'HIERARCHY_CHANGE',
p_description => 'Quarterly account structure updates',
p_priority => 'HIGH',
p_due_date => SYSDATE + 7
);
DBMS_OUTPUT.PUT_LINE('Created request: ' || l_request_id);
END;
Get Request Information
get_request_status
Returns the current status of a request.
Example:
DECLARE
l_status VARCHAR2(50);
BEGIN
l_status := ew_request.get_request_status(p_request_id => 12345);
IF l_status = 'APPROVED' THEN
-- Process approved request
process_approved_request(12345);
END IF;
END;
get_request_info
Returns complete request information.
Example:
DECLARE
l_request_info ew_request.request_rec;
BEGIN
l_request_info := ew_request.get_request_info(p_request_id => 12345);
DBMS_OUTPUT.PUT_LINE('Request: ' || l_request_info.request_name);
DBMS_OUTPUT.PUT_LINE('Status: ' || l_request_info.status);
DBMS_OUTPUT.PUT_LINE('Created: ' || l_request_info.created_date);
END;
Request Line Functions
Create Request Lines
create_request_line
Creates a single request line for member operations.
FUNCTION create_request_line(
p_request_id IN NUMBER,
p_app_dimension_id IN NUMBER,
p_action_code IN VARCHAR2,
p_member_name IN VARCHAR2,
p_parent_name IN VARCHAR2 DEFAULT NULL,
p_new_name IN VARCHAR2 DEFAULT NULL
) RETURN NUMBER; -- Returns request_line_id
Parameters:
- p_request_id - Parent request ID
- p_app_dimension_id - Application-dimension ID
- p_action_code - Action to perform (CMC, REN, DM, etc.)
- p_member_name - Member name
- p_parent_name - Parent for create/move operations
- p_new_name - New name for rename operations
Example:
DECLARE
l_request_id NUMBER := 12345;
l_line_id NUMBER;
BEGIN
-- Create new member
l_line_id := ew_request.create_request_line(
p_request_id => l_request_id,
p_app_dimension_id => 100,
p_action_code => 'CMC',
p_member_name => 'NewAccount',
p_parent_name => 'TotalRevenue'
);
-- Rename member
l_line_id := ew_request.create_request_line(
p_request_id => l_request_id,
p_app_dimension_id => 100,
p_action_code => 'REN',
p_member_name => 'OldName',
p_new_name => 'NewName'
);
-- Delete member
l_line_id := ew_request.create_request_line(
p_request_id => l_request_id,
p_app_dimension_id => 100,
p_action_code => 'DM',
p_member_name => 'ObsoleteAccount'
);
END;
create_request_lines_bulk
Creates multiple request lines in a single operation.
PROCEDURE create_request_lines_bulk(
p_request_id IN NUMBER,
p_app_dimension_id IN NUMBER,
p_action_codes IN ew_global.g_value_tbl,
p_member_names IN ew_global.g_value_tbl,
p_parent_names IN ew_global.g_value_tbl DEFAULT NULL
);
Example:
DECLARE
l_request_id NUMBER := 12345;
l_actions ew_global.g_value_tbl;
l_members ew_global.g_value_tbl;
l_parents ew_global.g_value_tbl;
BEGIN
-- Prepare arrays
l_actions(1) := 'CMC'; l_members(1) := 'Account1'; l_parents(1) := 'Parent1';
l_actions(2) := 'CMC'; l_members(2) := 'Account2'; l_parents(2) := 'Parent1';
l_actions(3) := 'CMC'; l_members(3) := 'Account3'; l_parents(3) := 'Parent2';
-- Bulk create
ew_request.create_request_lines_bulk(
p_request_id => l_request_id,
p_app_dimension_id => 100,
p_action_codes => l_actions,
p_member_names => l_members,
p_parent_names => l_parents
);
END;
Get Request Line Information
get_req_line_id
Retrieves request line ID based on criteria.
FUNCTION get_req_line_id(
p_request_id IN NUMBER,
p_app_dimension_id IN NUMBER,
p_member_name IN VARCHAR2,
p_action_code IN VARCHAR2
) RETURN NUMBER;
Example:
DECLARE
l_line_id NUMBER;
BEGIN
l_line_id := ew_request.get_req_line_id(
p_request_id => 12345,
p_app_dimension_id => 100,
p_member_name => 'Revenue',
p_action_code => 'CMC'
);
IF l_line_id IS NOT NULL THEN
-- Update line properties
update_line_properties(l_line_id);
END IF;
END;
get_request_line_status
Returns the status of a specific request line.
Property Operations
Add/Update Properties
add_property_to_line
Adds or updates a property value for a request line.
PROCEDURE add_property_to_line(
p_request_line_id IN NUMBER,
p_property_name IN VARCHAR2,
p_property_value IN VARCHAR2
);
Example:
DECLARE
l_line_id NUMBER := 54321;
BEGIN
-- Add account properties
ew_request.add_property_to_line(
p_request_line_id => l_line_id,
p_property_name => 'ACCOUNT_TYPE',
p_property_value => 'REVENUE'
);
ew_request.add_property_to_line(
p_request_line_id => l_line_id,
p_property_name => 'CONSOLIDATION',
p_property_value => '+'
);
ew_request.add_property_to_line(
p_request_line_id => l_line_id,
p_property_name => 'DATA_STORAGE',
p_property_value => 'STORE'
);
END;
bulk_update_properties
Updates multiple properties at once.
PROCEDURE bulk_update_properties(
p_request_line_id IN NUMBER,
p_property_names IN ew_global.g_value_tbl,
p_property_values IN ew_global.g_value_tbl
);
Example:
DECLARE
l_line_id NUMBER := 54321;
l_prop_names ew_global.g_value_tbl;
l_prop_values ew_global.g_value_tbl;
BEGIN
-- Prepare property arrays
l_prop_names(1) := 'ACCOUNT_TYPE'; l_prop_values(1) := 'EXPENSE';
l_prop_names(2) := 'TIME_BALANCE'; l_prop_values(2) := 'FLOW';
l_prop_names(3) := 'SKIP_VALUE'; l_prop_values(3) := 'MISSING';
l_prop_names(4) := 'EXCHANGE_RATE'; l_prop_values(4) := 'AVG';
-- Bulk update
ew_request.bulk_update_properties(
p_request_line_id => l_line_id,
p_property_names => l_prop_names,
p_property_values => l_prop_values
);
END;
Request Management
Submit Request
submit_request
Submits a request to workflow for approval.
Example:
BEGIN
-- Validate first
ew_request.submit_request(
p_request_id => 12345,
p_validate_only => 'Y'
);
-- If validation passes, submit
ew_request.submit_request(
p_request_id => 12345,
p_validate_only => 'N'
);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Submit failed: ' || SQLERRM);
END;
Cancel Request
cancel_request
Cancels a request and all its lines.
Example:
Clone Request
clone_request
Creates a copy of an existing request.
FUNCTION clone_request(
p_source_request_id IN NUMBER,
p_new_request_name IN VARCHAR2
) RETURN NUMBER; -- Returns new request_id
Example:
DECLARE
l_new_request_id NUMBER;
BEGIN
l_new_request_id := ew_request.clone_request(
p_source_request_id => 12345,
p_new_request_name => 'Q2 Account Updates (Copy)'
);
DBMS_OUTPUT.PUT_LINE('Cloned request: ' || l_new_request_id);
END;
Advanced Features
Request Templates
Create requests from templates:
DECLARE
l_request_id NUMBER;
l_template_name VARCHAR2(100) := 'MONTHLY_ACCOUNT_UPDATES';
BEGIN
-- Create request from template
l_request_id := ew_request.create_from_template(
p_template_name => l_template_name,
p_request_name => 'January Account Updates',
p_parameters => 'PERIOD=JAN-2025;ENTITY=US_CORP'
);
-- Template automatically creates standard lines
DBMS_OUTPUT.PUT_LINE('Created request ' || l_request_id || ' from template');
END;
Batch Request Processing
Process multiple requests together:
DECLARE
TYPE t_request_ids IS TABLE OF NUMBER;
l_requests t_request_ids := t_request_ids(12345, 12346, 12347);
l_success_count NUMBER := 0;
l_error_count NUMBER := 0;
BEGIN
FOR i IN 1..l_requests.COUNT LOOP
BEGIN
ew_request.submit_request(p_request_id => l_requests(i));
l_success_count := l_success_count + 1;
EXCEPTION
WHEN OTHERS THEN
l_error_count := l_error_count + 1;
log_error('Failed to submit request ' || l_requests(i));
END;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Submitted: ' || l_success_count ||
', Failed: ' || l_error_count);
END;
Request Validation
Comprehensive validation before submission:
DECLARE
l_request_id NUMBER := 12345;
l_validation_errors ew_global.g_value_tbl;
BEGIN
-- Validate request
l_validation_errors := ew_request.validate_request(p_request_id => l_request_id);
IF l_validation_errors.COUNT > 0 THEN
DBMS_OUTPUT.PUT_LINE('Validation errors found:');
FOR i IN 1..l_validation_errors.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(i || ': ' || l_validation_errors(i));
END LOOP;
ELSE
-- Safe to submit
ew_request.submit_request(p_request_id => l_request_id);
END IF;
END;
Request Line Examples
Complex Hierarchy Changes
DECLARE
l_request_id NUMBER;
l_line_id NUMBER;
BEGIN
-- Create request
l_request_id := ew_request.create_request(
p_request_name => 'Restructure Operating Expenses'
);
-- Move existing members
l_line_id := ew_request.create_request_line(
p_request_id => l_request_id,
p_app_dimension_id => 100,
p_action_code => 'ZC', -- Move as child
p_member_name => 'Marketing',
p_parent_name => 'Sales_Marketing'
);
-- Create new parent
l_line_id := ew_request.create_request_line(
p_request_id => l_request_id,
p_app_dimension_id => 100,
p_action_code => 'CMC',
p_member_name => 'Sales_Marketing',
p_parent_name => 'Operating_Expenses'
);
-- Create shared member
l_line_id := ew_request.create_request_line(
p_request_id => l_request_id,
p_app_dimension_id => 100,
p_action_code => 'ISMC', -- Insert shared member
p_member_name => 'Marketing',
p_parent_name => 'Total_Marketing'
);
-- Submit for approval
ew_request.submit_request(p_request_id => l_request_id);
END;
Property Updates with Validation
DECLARE
l_request_id NUMBER;
l_line_id NUMBER;
l_valid VARCHAR2(1);
BEGIN
-- Create request for property updates
l_request_id := ew_request.create_request(
p_request_name => 'Update Account Properties'
);
-- For each account needing update
FOR rec IN (SELECT member_name FROM accounts_to_update) LOOP
-- Create update line
l_line_id := ew_request.create_request_line(
p_request_id => l_request_id,
p_app_dimension_id => 100,
p_action_code => 'UPD', -- Update
p_member_name => rec.member_name
);
-- Validate and add properties
l_valid := validate_account_type(rec.member_name);
IF l_valid = 'Y' THEN
ew_request.add_property_to_line(
p_request_line_id => l_line_id,
p_property_name => 'ACCOUNT_TYPE',
p_property_value => get_account_type(rec.member_name)
);
ELSE
-- Mark line with error
ew_request.update_line_status(
p_request_line_id => l_line_id,
p_status => 'ERROR',
p_error_message => 'Invalid account type'
);
END IF;
END LOOP;
END;
Error Handling
Request Creation Errors
BEGIN
l_request_id := ew_request.create_request(
p_request_name => 'Test Request'
);
EXCEPTION
WHEN ew_request.duplicate_request THEN
-- Handle duplicate name
l_request_id := ew_request.create_request(
p_request_name => 'Test Request ' || TO_CHAR(SYSDATE, 'YYYYMMDD_HH24MISS')
);
WHEN OTHERS THEN
log_error('Request creation failed: ' || SQLERRM);
RAISE;
END;
Line Creation Errors
BEGIN
l_line_id := ew_request.create_request_line(...);
EXCEPTION
WHEN ew_request.invalid_action_code THEN
DBMS_OUTPUT.PUT_LINE('Invalid action code specified');
WHEN ew_request.member_not_found THEN
DBMS_OUTPUT.PUT_LINE('Member does not exist');
WHEN ew_request.duplicate_line THEN
DBMS_OUTPUT.PUT_LINE('Line already exists for this member/action');
END;
Performance Optimization
Bulk Operations
-- Use bulk operations for better performance
DECLARE
TYPE t_members IS TABLE OF VARCHAR2(255);
l_members t_members;
BEGIN
-- Collect members to process
SELECT member_name
BULK COLLECT INTO l_members
FROM source_table
WHERE process_flag = 'Y';
-- Process in bulk
ew_request.create_lines_for_members(
p_request_id => l_request_id,
p_members => l_members,
p_action => 'CMC'
);
END;
Request Caching
-- Cache request info for repeated access
DECLARE
g_request_cache ew_request.request_rec;
FUNCTION get_cached_request(p_request_id NUMBER)
RETURN ew_request.request_rec IS
BEGIN
IF g_request_cache.request_id != p_request_id THEN
g_request_cache := ew_request.get_request_info(p_request_id);
END IF;
RETURN g_request_cache;
END;
BEGIN
-- Use cached info
FOR i IN 1..100 LOOP
l_request := get_cached_request(12345);
-- Process using cached data
END LOOP;
END;
Best Practices
-
Validate Before Submission
-
Use Meaningful Names
-
Handle All Action Codes
-
Clean Up Failed Requests