How can I define user-specific validation for my contracts?

This code is an example of defining user-specific validation for contracts as explained in the topic Defining User-Specific Validation for Contracts: Procedure.

Package Header
DECLARE
l_stmt clob;
BEGIN
L_stmt := 'CREATE OR REPLACE PACKAGE OKC_CUSTOM_VALIDATION_DYD AUTHID CURRENT_USER AS '||'PROCEDURE CUSTOM_VALIDATIONS ( '||'p_contract_id IN NUMBER, p_major_version IN NUMBER, p_sequence_id IN NUMBER ) ; '||
'END OKC_CUSTOM_VALIDATION_DYD ; ';
ADM_DDL.DO_DDL(l_stmt);
END;
Package Body
DECLARE
l_stmt clob;
BEGIN
L_stmt :=
'CREATE OR REPLACE PACKAGE body OKC_CUSTOM_VALIDATION_DYD AS
PROCEDURE CUSTOM_VALIDATIONS(p_contract_id IN NUMBER, p_major_version IN NUMBER, p_sequence_id IN NUMBER ) IS
CURSOR csr_test_val IS
SELECT h.id , h.major_version, h.contract_number, h.contract_number_modifier FROM fusion.okc_k_headers_all_b h
WHERE h.id = p_contract_id AND h.major_version = p_major_version AND 1 = 1 ;
BEGIN
FOR rec_test_val IN csr_test_val
LOOP
INSERT INTO fusion.okc_validate_contract_t
(
SEQUENCE_ID,
DOCUMENT_TYPE,
DOCUMENT_ID,
DOCUMENT_VERSION,
OBJECT_GROUP,
OBJECT_TYPE,
OBJECT_ID,
OBJECT_NAME,
CONTRACT_NUMBER,
CONTRACT_NUMBER_MODIFIER,
ERROR_SEVERITY,
QA_CODE,
MESSAGE_NAME,
MESSAGE_TOKEN1,
MESSAGE_VALUE1 ,
MESSAGE_TOKEN2,
MESSAGE_VALUE2,
MESSAGE_TOKEN3,
MESSAGE_VALUE3,
MESSAGE_TOKEN4 ,
MESSAGE_VALUE4,
MESSAGE_TOKEN5 ,
MESSAGE_VALUE5,
PROBLEM_SHORT_DESC,
PROBLEM_DETAILS,
PROBLEM_DETAILS_SHORT,
SUGGESTION,
REFERENCE_COLUMN1,
REFERENCE_COLUMN2,
REFERENCE_COLUMN3,
REFERENCE_COLUMN4,
REFERENCE_COLUMN5,
OBJECT_VERSION_NUMBER,
CREATION_DATE,
CREATED_BY,
LAST_UPDATED_BY,
LAST_UPDATE_DATE,
LAST_UPDATE_LOGIN
)
VALUES
(
p_sequence_id, --SEQUENCE_ID,
''ECM'', --DOCUMENT_TYPE,
rec_test_val.id, --DOCUMENT_ID,
rec_test_val.major_version, --DOCUMENT_VERSION,
''CONTRACT'', --OBJECT_GROUP,
''HEADER'', --OBJECT_TYPE,
rec_test_val.id, --OBJECT_ID,
rec_test_val.contract_number , --OBJECT_NAME,
rec_test_val.contract_number , --CONTRACT_NUMBER,
rec_test_val.contract_number_modifier , --CONTRACT_NUMBER_MODIFIER,
''E'', -- ERROR_SEVERITY,
''CHECK_CUSTOM_VALIDATION1'', -- QA_CODE,
''OKC_CUSTOM_TEST_VAL1'', -- MESSAGE_NAME DEFINED BY CUSTOMER,
NULL, -- MESSAGE_TOKEN1,
NULL, -- MESSAGE_VALUE1 ,
NULL, -- MESSAGE_TOKEN2,
NULL, -- MESSAGE_VALUE2,
NULL, -- MESSAGE_TOKEN3,
NULL, -- MESSAGE_VALUE3,
NULL, -- MESSAGE_TOKEN4,
NULL, -- MESSAGE_VALUE4,
NULL, -- MESSAGE_TOKEN5 ,
NULL, -- MESSAGE_VALUE5,
NULL, -- PROBLEM_SHORT_DESC,
NULL, -- PROBLEM_DETAILS,
NULL, -- PROBLEM_DETAILS_SHORT,
NULL, -- SUGGESTION,
NULL, -- REFERENCE_COLUMN1,
NULL, -- REFERENCE_COLUMN2,
NULL, -- REFERENCE_COLUMN3,
NULL, -- REFERENCE_COLUMN4,
NULL, -- REFERENCE_COLUMN5,
1, -- OBJECT_VERSION_NUMBER,
SYSTIMESTAMP, --CREATION_DATE,
-1, --CREATED_BY,
-1, -- LAST_UPDATED_BY,
SYSTIMESTAMP, --LAST_UPDATE_DATE,
-1 --LAST_UPDATE_LOGIN
);
commit work;
END LOOP ;
 EXCEPTION
WHEN OTHERS THEN
IF (csr_test_val%ISOPEN) THEN
CLOSE csr_test_val;
END IF;
RAISE ;
END CUSTOM_VALIDATIONS ;
END OKC_CUSTOM_VALIDATION_DYD ; ';
 ADM_DDL.DO_DDL(l_stmt);
END;
/