如果 child table 在 Oracle 中有一个 sysdate 记录,则限制在 master table 中插入数据
Restrict inserting data in master table if child table has one record for the sysdate in Oracle
我有一个 stored-procedure
可以在 Master table 和 child table 中插入记录。逻辑是 child table 当前可以有多个条目。但是由于有时有多个条目,如果我们尝试使用两个不同的浏览器插入相同的记录,则会在 child table.
中发生重复
甚至我们想要该记录的多个条目而不是重复的条目。
下面是我的table信息。
TBL_FIBER_INV_JOBS
硕士table
TBL_FIBER_INV_JOB_PROGRESS
Child table
下面还有 SP 和 table 描述。
PROCEDURE INS_WORKFLOW
(
PSPAN_ID IN TBL_FIBER_INV_JOBS.SPAN_ID%TYPE,
PLINK_ID IN TBL_FIBER_INV_JOBS.LINK_ID%TYPE,
PCREATED_BY IN TBL_FIBER_INV_JOBS.CREATED_BY%TYPE,
PMAINTENANCEZONECODE IN TBL_FIBER_INV_JOBS.MAINTENANCEZONECODE%TYPE,
PMAINTENANCEZONENAME IN TBL_FIBER_INV_JOBS.MAINTENANCEZONENAME%TYPE,
PMAINT_ZONE_NE_SPAN_LENGTH IN TBL_FIBER_INV_JOBS.MAINT_ZONE_NE_SPAN_LENGTH%TYPE,
PSTATUS_ID IN TBL_FIBER_INV_JOB_PROGRESS.STATUS_ID%TYPE,
PHOTO_OFFERED_DATE IN NVARCHAR2,
PAPPROV_REJECT_REMARK IN TBL_FIBER_INV_JOB_PROGRESS.APPROV_REJECT_REMARK%TYPE,
PISABDMISSING IN TBL_FIBER_INV_JOB_PROGRESS.ISABDMISSING%TYPE,
PHOTO_OFFERED_LENGTH IN TBL_FIBER_INV_JOB_PROGRESS.HOTO_OFFERED_LENGTH%TYPE,
PUMS_GROUP_ASS_BY_ID IN TBL_FIBER_INV_JOB_PROGRESS.UMS_GROUP_ASS_BY_ID%TYPE,
PUMS_GROUP_ASS_BY_NAME IN TBL_FIBER_INV_JOB_PROGRESS.UMS_GROUP_ASS_BY_NAME%TYPE,
PUMS_GROUP_ASS_TO_ID IN TBL_FIBER_INV_JOB_PROGRESS.UMS_GROUP_ASS_TO_ID%TYPE,
PUMS_GROUP_ASS_TO_NAME IN TBL_FIBER_INV_JOB_PROGRESS.UMS_GROUP_ASS_TO_NAME%TYPE,
PSPAN_TYPE IN TBL_FIBER_INV_JOBS.SPAN_TYPE%TYPE,
POUTMSG OUT NVARCHAR2
)
AS
PJOB_PROGRESS_ID NUMBER:=0;
PJOB_ID NUMBER :=0;
PCNT_JOBID NUMBER :=-1;
PNELENGTH NUMBER:=0;
PUGLENGTH NUMBER:=0;
PARLENGTH NUMBER:=0;
BEGIN
--execute immediate 'alter session set nls_date_format = ''DD/MM/YYYY''';
IF PSPAN_TYPE = 'INTRACITY' OR PSPAN_TYPE = 'ENTERPRISE' THEN
BEGIN
SELECT COUNT(JOB_ID) INTO PCNT_JOBID
FROM TBL_FIBER_INV_JOBS
WHERE LINK_ID = PLINK_ID
AND MAINTENANCEZONECODE = PMAINTENANCEZONECODE;
SELECT ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH,
ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY IS NULL OR RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS UG_LEN
,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS AR_LEN
INTO PNELENGTH,PUGLENGTH,PARLENGTH
FROM NE.MV_SPAN@DB_LINK_NE_VIEWER
--FROM APP_FTTX.span@sat
WHERE RJ_INTRACITY_LINK_ID = PLINK_ID
AND INVENTORY_STATUS_CODE = 'IPL'
AND RJ_MAINTENANCE_ZONE_CODE = PMAINTENANCEZONECODE
GROUP BY RJ_INTRACITY_LINK_ID,RJ_MAINTENANCE_ZONE_CODE;
END;
ELSIF PSPAN_TYPE = 'INTERCITY' THEN
BEGIN
SELECT COUNT(JOB_ID) INTO PCNT_JOBID
FROM TBL_FIBER_INV_JOBS
WHERE SPAN_ID = PSPAN_ID
AND MAINTENANCEZONECODE = PMAINTENANCEZONECODE;
---CR981 implemenation
IF LENGTH(PSPAN_ID) = 9 THEN
BEGIN
SELECT ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH,
ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY IS NULL OR RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS UG_LEN
,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS AR_LEN
INTO PNELENGTH,PUGLENGTH,PARLENGTH
FROM NE.MV_SPAN@DB_LINK_NE_VIEWER
--FROM APP_FTTX.span@sat
WHERE RJ_INTRACITY_LINK_ID = PSPAN_ID
AND INVENTORY_STATUS_CODE = 'IPL'
AND RJ_MAINTENANCE_ZONE_CODE = PMAINTENANCEZONECODE
GROUP BY RJ_INTRACITY_LINK_ID,RJ_MAINTENANCE_ZONE_CODE;
END;
ELSE
BEGIN
SELECT ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH,
ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY IS NULL OR RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS UG_LEN
,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS AR_LEN
INTO PNELENGTH,PUGLENGTH,PARLENGTH
FROM NE.MV_SPAN@DB_LINK_NE_VIEWER
--FROM APP_FTTX.span@sat
WHERE RJ_SPAN_ID = PSPAN_ID
AND INVENTORY_STATUS_CODE = 'IPL'
AND (NOT REGEXP_LIKE (RJ_INTRACITY_LINK_ID,'_(9)','i') OR RJ_INTRACITY_LINK_ID IS NULL)
AND RJ_MAINTENANCE_ZONE_CODE = PMAINTENANCEZONECODE
GROUP BY RJ_SPAN_ID,RJ_MAINTENANCE_ZONE_CODE;
END;
END IF;
END;
END IF;
IF PCNT_JOBID = 0 THEN
BEGIN
INSERT
INTO TBL_FIBER_INV_JOBS
(
SPAN_ID,
LINK_ID,
CREATED_BY,
MAINTENANCEZONECODE,
MAINTENANCEZONENAME,
MAINT_ZONE_NE_SPAN_LENGTH,
SPAN_TYPE,
FSA_UG,
FSA_AERIAL
)
VALUES
(
PSPAN_ID,
PLINK_ID,
PCREATED_BY,
PMAINTENANCEZONECODE,
PMAINTENANCEZONENAME,
--PMAINT_ZONE_NE_SPAN_LENGTH,
PNELENGTH,
PSPAN_TYPE,
PUGLENGTH,
PARLENGTH
)RETURNING JOB_ID INTO PJOB_ID;
IF PJOB_ID > 0 THEN
BEGIN
INSERT
INTO TBL_FIBER_INV_JOB_PROGRESS
(
JOB_ID,
STATUS_ID,
HOTO_OFFERED_DATE,
APPROV_REJECT_REMARK,
ISABDMISSING,
HOTO_OFFERED_LENGTH,
NE_SPAN_LENGTH,
CREATED_BY,
UMS_GROUP_ASS_BY_ID,
UMS_GROUP_ASS_BY_NAME,
UMS_GROUP_ASS_TO_ID,
UMS_GROUP_ASS_TO_NAME,
UMS_GROUP_ASS_TO_DATE,
MODIFIED_BY,
MODIFIED_DATE,
APPROVED_BY,
APPROVED_DATE,
FSA_UG,
FSA_AERIAL
)
VALUES
(
PJOB_ID,
PSTATUS_ID,
TO_DATE(PHOTO_OFFERED_DATE,'DD/MM/YYYY'),
PAPPROV_REJECT_REMARK,
PISABDMISSING,
PHOTO_OFFERED_LENGTH,
--PMAINT_ZONE_NE_SPAN_LENGTH,
PNELENGTH,
PCREATED_BY,
PUMS_GROUP_ASS_BY_ID,
PUMS_GROUP_ASS_BY_NAME,
PUMS_GROUP_ASS_TO_ID,
PUMS_GROUP_ASS_TO_NAME,
SYSDATE,
PCREATED_BY,
SYSDATE,
PCREATED_BY,
SYSDATE,
-- PUG_LENGTH,
-- PAR_LENGTH
PUGLENGTH,
PARLENGTH
)RETURNING JOB_PROGRESS_ID INTO PJOB_PROGRESS_ID;
END;
END IF;
IF PJOB_PROGRESS_ID > 0 THEN
BEGIN
POUTMSG := 'SUCCESS|'||PJOB_PROGRESS_ID;
COMMIT;
END;
ELSE
BEGIN
POUTMSG := 'FAILED|Record not created';
ROLLBACK;
END;
END IF;
END;
ELSE
BEGIN
POUTMSG := 'EXISTS|Record already exists';
END;
END IF;
EXCEPTION
WHEN OTHERS THEN
ERROR_CODE := SQLCODE;
ERROR_MESSAGE := SUBSTR(SQLERRM, 1, 200);
ROLLBACK;
POUTMSG := 'ERROR|Error ocurred on record creation';
PKG_FIBER_HOTO_COMP_TEST.INS_ERRORLOG(PCREATED_BY,PSPAN_ID||PLINK_ID,'DB : INS_WORKFLOW',ERROR_CODE||' : '||ERROR_MESSAGE);
END INS_WORKFLOW;
下面还有table描述
TBL_FIBER_INV_JOBS
Name Null Type
--------------------------- -------- --------------
JOB_ID NOT NULL NUMBER PK
SPAN_ID NVARCHAR2(100)
LINK_ID NVARCHAR2(100)
CREATED_BY NVARCHAR2(200)
CREATED_DATE NOT NULL DATE
MAINTENANCEZONECODE NVARCHAR2(50)
MAINTENANCEZONENAME NVARCHAR2(100)
MAINT_ZONE_NE_SPAN_LENGTH NUMBER
SPAN_TYPE NVARCHAR2(20)
JOB_FLAG NUMBER
MISSING_ABD_LENGTH NUMBER(38,10)
REOFFERFLAG VARCHAR2(10)
FSA_ID NVARCHAR2(8)
FSA_COMMON NUMBER
FSA_UG NUMBER
FSA_AERIAL NUMBER
FSA_MDU NUMBER
MISSING_ABD_UG NUMBER
MISSING_ABD_AR NUMBER
CALCULATED_LENGTH NUMBER
RJ_CONSTRUCTION_METHODOLOGY NUMBER
TBL_FIBER_INV_JOB_PROGRESS
Name Null Type
--------------------- -------- --------------
JOB_PROGRESS_ID NOT NULL NUMBER
JOB_ID NUMBER FK
STATUS_ID NUMBER
HOTO_OFFERED_DATE DATE
HOTO_ACCEPTENCE_DATE DATE
LIT_ACCEPTENCE_DATE DATE
APPROVED_BY NVARCHAR2(200)
APPROVED_DATE DATE
REJECTED_BY NVARCHAR2(200)
REJECTED_DATE DATE
APPROV_REJECT_REMARK NVARCHAR2(255)
DELAY_REASON NVARCHAR2(255)
ISABDMISSING NUMBER
HOTO_OFFERED_LENGTH NUMBER
LIT_OFFERED_LENGTH NUMBER
HOTO_ACTUAL_LENGTH NUMBER
LIT_ACTUAL_LENGTH NUMBER
ABD_COMPLETED_LENGTH NUMBER
NE_SPAN_LENGTH NUMBER
CREATED_BY NVARCHAR2(200)
CREATED_DATE NOT NULL DATE
MODIFIED_BY NVARCHAR2(200)
MODIFIED_DATE DATE
UMS_GROUP_ASS_BY_ID NUMBER
UMS_GROUP_ASS_BY_NAME NVARCHAR2(200)
UMS_GROUP_ASS_TO_ID NUMBER
UMS_GROUP_ASS_TO_NAME NVARCHAR2(200)
UMS_GROUP_ASS_TO_DATE DATE
JOB_PROGRESS_FLAG NOT NULL NUMBER
HOTO_OFFER_LEN_UPD_BY NVARCHAR2(200)
FSA_COMMON NUMBER
FSA_UG NUMBER
FSA_AERIAL NUMBER
FSA_MDU NUMBER
FSA_UG_ACTUAL NUMBER
FSA_AERIAL_ACTUAL NUMBER
FSA_MDU_ACTUAL NUMBER
我会尝试看看这个解决方案是否符合您的要求。关键因素:
- 我删除了所有不需要的开始结束块。当你想控制那些块上的异常时,你只需要指定块。
- 如果 child 存在于已插入的 parent 中,则它已由事务级别 READ UNCOMMITTED 控制。因此,当 child 存在于 parent created_date
时,我可以计算 child 中相同 P_JOBID 的记录
- 我在该列上使用了 to_char,因为我不知道您有哪些 NLS_DATE 设置。
如有任何疑问,请告诉我。
更新
只要使用 SERVEROUPUT ON 或 DBMS_OUTPUT.ENABLE 执行过程并且会话配置为捕获输出,就可以显示消息。
PROCEDURE INS_WORKFLOW
(
PSPAN_ID IN TBL_FIBER_INV_JOBS.SPAN_ID%TYPE,
PLINK_ID IN TBL_FIBER_INV_JOBS.LINK_ID%TYPE,
PCREATED_BY IN TBL_FIBER_INV_JOBS.CREATED_BY%TYPE,
PMAINTENANCEZONECODE IN TBL_FIBER_INV_JOBS.MAINTENANCEZONECODE%TYPE,
PMAINTENANCEZONENAME IN TBL_FIBER_INV_JOBS.MAINTENANCEZONENAME%TYPE,
PMAINT_ZONE_NE_SPAN_LENGTH IN TBL_FIBER_INV_JOBS.MAINT_ZONE_NE_SPAN_LENGTH%TYPE,
PSTATUS_ID IN TBL_FIBER_INV_JOB_PROGRESS.STATUS_ID%TYPE,
PHOTO_OFFERED_DATE IN NVARCHAR2,
PAPPROV_REJECT_REMARK IN TBL_FIBER_INV_JOB_PROGRESS.APPROV_REJECT_REMARK%TYPE,
PISABDMISSING IN TBL_FIBER_INV_JOB_PROGRESS.ISABDMISSING%TYPE,
PHOTO_OFFERED_LENGTH IN TBL_FIBER_INV_JOB_PROGRESS.HOTO_OFFERED_LENGTH%TYPE,
PUMS_GROUP_ASS_BY_ID IN TBL_FIBER_INV_JOB_PROGRESS.UMS_GROUP_ASS_BY_ID%TYPE,
PUMS_GROUP_ASS_BY_NAME IN TBL_FIBER_INV_JOB_PROGRESS.UMS_GROUP_ASS_BY_NAME%TYPE,
PUMS_GROUP_ASS_TO_ID IN TBL_FIBER_INV_JOB_PROGRESS.UMS_GROUP_ASS_TO_ID%TYPE,
PUMS_GROUP_ASS_TO_NAME IN TBL_FIBER_INV_JOB_PROGRESS.UMS_GROUP_ASS_TO_NAME%TYPE,
PSPAN_TYPE IN TBL_FIBER_INV_JOBS.SPAN_TYPE%TYPE,
POUTMSG OUT NVARCHAR2
)
AS
PJOB_PROGRESS_ID NUMBER:=0;
PJOB_ID NUMBER :=0;
PCNT_JOBID NUMBER :=-1;
PNELENGTH NUMBER:=0;
PUGLENGTH NUMBER:=0;
PARLENGTH NUMBER:=0;
VCOUNTERCHILD PLS_INTEGER;
BEGIN
--execute immediate 'alter session set nls_date_format = ''DD/MM/YYYY''';
IF ( PSPAN_TYPE = 'INTRACITY' OR PSPAN_TYPE = 'ENTERPRISE' )
THEN
SELECT COUNT(JOB_ID) INTO PCNT_JOBID
FROM TBL_FIBER_INV_JOBS
WHERE LINK_ID = PLINK_ID
AND MAINTENANCEZONECODE = PMAINTENANCEZONECODE;
SELECT ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH,
ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY IS NULL OR RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS UG_LEN
,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS AR_LEN
INTO PNELENGTH,PUGLENGTH,PARLENGTH
FROM NE.MV_SPAN@DB_LINK_NE_VIEWER
--FROM APP_FTTX.span@sat
WHERE RJ_INTRACITY_LINK_ID = PLINK_ID
AND INVENTORY_STATUS_CODE = 'IPL'
AND RJ_MAINTENANCE_ZONE_CODE = PMAINTENANCEZONECODE
GROUP BY RJ_INTRACITY_LINK_ID,RJ_MAINTENANCE_ZONE_CODE;
ELSIF PSPAN_TYPE = 'INTERCITY'
THEN
SELECT COUNT(JOB_ID) INTO PCNT_JOBID
FROM TBL_FIBER_INV_JOBS
WHERE SPAN_ID = PSPAN_ID
AND MAINTENANCEZONECODE = PMAINTENANCEZONECODE;
---CR981 implemenation
IF LENGTH(PSPAN_ID) = 9
THEN
SELECT ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH,
ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY IS NULL OR RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS UG_LEN
,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS AR_LEN
INTO PNELENGTH,PUGLENGTH,PARLENGTH
FROM NE.MV_SPAN@DB_LINK_NE_VIEWER
--FROM APP_FTTX.span@sat
WHERE RJ_INTRACITY_LINK_ID = PSPAN_ID
AND INVENTORY_STATUS_CODE = 'IPL'
AND RJ_MAINTENANCE_ZONE_CODE = PMAINTENANCEZONECODE
GROUP BY RJ_INTRACITY_LINK_ID,RJ_MAINTENANCE_ZONE_CODE;
ELSE
SELECT ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH,
ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY IS NULL OR RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS UG_LEN
,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS AR_LEN
INTO PNELENGTH,PUGLENGTH,PARLENGTH
FROM NE.MV_SPAN@DB_LINK_NE_VIEWER
--FROM APP_FTTX.span@sat
WHERE RJ_SPAN_ID = PSPAN_ID
AND INVENTORY_STATUS_CODE = 'IPL'
AND (NOT REGEXP_LIKE (RJ_INTRACITY_LINK_ID,'_(9)','i') OR RJ_INTRACITY_LINK_ID IS NULL)
AND RJ_MAINTENANCE_ZONE_CODE = PMAINTENANCEZONECODE
GROUP BY RJ_SPAN_ID,RJ_MAINTENANCE_ZONE_CODE;
END IF;
END IF;
IF PCNT_JOBID = 0
THEN
INSERT
INTO TBL_FIBER_INV_JOBS
(
SPAN_ID,
LINK_ID,
CREATED_BY,
MAINTENANCEZONECODE,
MAINTENANCEZONENAME,
MAINT_ZONE_NE_SPAN_LENGTH,
SPAN_TYPE,
FSA_UG,
FSA_AERIAL
)
VALUES
(
PSPAN_ID,
PLINK_ID,
PCREATED_BY,
PMAINTENANCEZONECODE,
PMAINTENANCEZONENAME,
--PMAINT_ZONE_NE_SPAN_LENGTH,
PNELENGTH,
PSPAN_TYPE,
PUGLENGTH,
PARLENGTH
)RETURNING JOB_ID INTO PJOB_ID;
IF PJOB_ID > 0
THEN
SELECT COUNT(*) INTO VCOUNTERCHILD FROM
TBL_FIBER_INV_JOB_PROGRESS c INNER JOIN TBL_FIBER_INV_JOBS p
ON c.job_id=p.job_id and c.job_id = PJOB_ID and
to_char(p.CREATED_DATE,'dd/mm/yyyy') = to_char(sysdate,'dd/mm/yyyy')
and nvl(c.span_id,'XXX') = nvl(p.span_id,'XXX') and
nvl(c.MAINTENANCEZONECODE,'XXX') = nvl(p.MAINTENANCEZONECODE,'XXX') ;
-- if the child is not there we insert
if VCOUNTERCHILD = 0
then
insert INTO TBL_FIBER_INV_JOB_PROGRESS
(
JOB_ID,
STATUS_ID,
HOTO_OFFERED_DATE,
APPROV_REJECT_REMARK,
ISABDMISSING,
HOTO_OFFERED_LENGTH,
NE_SPAN_LENGTH,
CREATED_BY,
UMS_GROUP_ASS_BY_ID,
UMS_GROUP_ASS_BY_NAME,
UMS_GROUP_ASS_TO_ID,
UMS_GROUP_ASS_TO_NAME,
UMS_GROUP_ASS_TO_DATE,
MODIFIED_BY,
MODIFIED_DATE,
APPROVED_BY,
APPROVED_DATE,
FSA_UG,
FSA_AERIAL
)
VALUES
(
PJOB_ID,
PSTATUS_ID,
TO_DATE(PHOTO_OFFERED_DATE,'DD/MM/YYYY'),
PAPPROV_REJECT_REMARK,
PISABDMISSING,
PHOTO_OFFERED_LENGTH,
--PMAINT_ZONE_NE_SPAN_LENGTH,
PNELENGTH,
PCREATED_BY,
PUMS_GROUP_ASS_BY_ID,
PUMS_GROUP_ASS_BY_NAME,
PUMS_GROUP_ASS_TO_ID,
PUMS_GROUP_ASS_TO_NAME,
SYSDATE,
PCREATED_BY,
SYSDATE,
PCREATED_BY,
SYSDATE,
-- PUG_LENGTH,
-- PAR_LENGTH
PUGLENGTH,
PARLENGTH
)RETURNING JOB_PROGRESS_ID INTO PJOB_PROGRESS_ID;
end if;
END IF;
IF PJOB_PROGRESS_ID > 0
THEN
POUTMSG := 'SUCCESS|'||PJOB_PROGRESS_ID;
COMMIT;
ELSE
POUTMSG := 'WARNING|Record not created - Already a child record for job id '||PJOB_ID||' ';
-- I will remove the rollback. Here it does not make sense as you don't need to rollback the whole transaction
-- ROLLBACK;
dbms_output.put_line ( POUTMSG );
END IF;
ELSE
POUTMSG := 'EXISTS|Record already exists';
END IF;
EXCEPTION
WHEN OTHERS THEN
ERROR_CODE := SQLCODE;
ERROR_MESSAGE := SUBSTR(SQLERRM, 1, 200);
ROLLBACK;
POUTMSG := 'ERROR|Error ocurred on record creation';
PKG_FIBER_HOTO_COMP_TEST.INS_ERRORLOG(PCREATED_BY,PSPAN_ID||PLINK_ID,'DB : INS_WORKFLOW',ERROR_CODE||' : '||ERROR_MESSAGE);
END INS_WORKFLOW;
我有一个 stored-procedure
可以在 Master table 和 child table 中插入记录。逻辑是 child table 当前可以有多个条目。但是由于有时有多个条目,如果我们尝试使用两个不同的浏览器插入相同的记录,则会在 child table.
甚至我们想要该记录的多个条目而不是重复的条目。
下面是我的table信息。
TBL_FIBER_INV_JOBS
硕士table
TBL_FIBER_INV_JOB_PROGRESS
Child table
下面还有 SP 和 table 描述。
PROCEDURE INS_WORKFLOW
(
PSPAN_ID IN TBL_FIBER_INV_JOBS.SPAN_ID%TYPE,
PLINK_ID IN TBL_FIBER_INV_JOBS.LINK_ID%TYPE,
PCREATED_BY IN TBL_FIBER_INV_JOBS.CREATED_BY%TYPE,
PMAINTENANCEZONECODE IN TBL_FIBER_INV_JOBS.MAINTENANCEZONECODE%TYPE,
PMAINTENANCEZONENAME IN TBL_FIBER_INV_JOBS.MAINTENANCEZONENAME%TYPE,
PMAINT_ZONE_NE_SPAN_LENGTH IN TBL_FIBER_INV_JOBS.MAINT_ZONE_NE_SPAN_LENGTH%TYPE,
PSTATUS_ID IN TBL_FIBER_INV_JOB_PROGRESS.STATUS_ID%TYPE,
PHOTO_OFFERED_DATE IN NVARCHAR2,
PAPPROV_REJECT_REMARK IN TBL_FIBER_INV_JOB_PROGRESS.APPROV_REJECT_REMARK%TYPE,
PISABDMISSING IN TBL_FIBER_INV_JOB_PROGRESS.ISABDMISSING%TYPE,
PHOTO_OFFERED_LENGTH IN TBL_FIBER_INV_JOB_PROGRESS.HOTO_OFFERED_LENGTH%TYPE,
PUMS_GROUP_ASS_BY_ID IN TBL_FIBER_INV_JOB_PROGRESS.UMS_GROUP_ASS_BY_ID%TYPE,
PUMS_GROUP_ASS_BY_NAME IN TBL_FIBER_INV_JOB_PROGRESS.UMS_GROUP_ASS_BY_NAME%TYPE,
PUMS_GROUP_ASS_TO_ID IN TBL_FIBER_INV_JOB_PROGRESS.UMS_GROUP_ASS_TO_ID%TYPE,
PUMS_GROUP_ASS_TO_NAME IN TBL_FIBER_INV_JOB_PROGRESS.UMS_GROUP_ASS_TO_NAME%TYPE,
PSPAN_TYPE IN TBL_FIBER_INV_JOBS.SPAN_TYPE%TYPE,
POUTMSG OUT NVARCHAR2
)
AS
PJOB_PROGRESS_ID NUMBER:=0;
PJOB_ID NUMBER :=0;
PCNT_JOBID NUMBER :=-1;
PNELENGTH NUMBER:=0;
PUGLENGTH NUMBER:=0;
PARLENGTH NUMBER:=0;
BEGIN
--execute immediate 'alter session set nls_date_format = ''DD/MM/YYYY''';
IF PSPAN_TYPE = 'INTRACITY' OR PSPAN_TYPE = 'ENTERPRISE' THEN
BEGIN
SELECT COUNT(JOB_ID) INTO PCNT_JOBID
FROM TBL_FIBER_INV_JOBS
WHERE LINK_ID = PLINK_ID
AND MAINTENANCEZONECODE = PMAINTENANCEZONECODE;
SELECT ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH,
ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY IS NULL OR RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS UG_LEN
,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS AR_LEN
INTO PNELENGTH,PUGLENGTH,PARLENGTH
FROM NE.MV_SPAN@DB_LINK_NE_VIEWER
--FROM APP_FTTX.span@sat
WHERE RJ_INTRACITY_LINK_ID = PLINK_ID
AND INVENTORY_STATUS_CODE = 'IPL'
AND RJ_MAINTENANCE_ZONE_CODE = PMAINTENANCEZONECODE
GROUP BY RJ_INTRACITY_LINK_ID,RJ_MAINTENANCE_ZONE_CODE;
END;
ELSIF PSPAN_TYPE = 'INTERCITY' THEN
BEGIN
SELECT COUNT(JOB_ID) INTO PCNT_JOBID
FROM TBL_FIBER_INV_JOBS
WHERE SPAN_ID = PSPAN_ID
AND MAINTENANCEZONECODE = PMAINTENANCEZONECODE;
---CR981 implemenation
IF LENGTH(PSPAN_ID) = 9 THEN
BEGIN
SELECT ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH,
ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY IS NULL OR RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS UG_LEN
,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS AR_LEN
INTO PNELENGTH,PUGLENGTH,PARLENGTH
FROM NE.MV_SPAN@DB_LINK_NE_VIEWER
--FROM APP_FTTX.span@sat
WHERE RJ_INTRACITY_LINK_ID = PSPAN_ID
AND INVENTORY_STATUS_CODE = 'IPL'
AND RJ_MAINTENANCE_ZONE_CODE = PMAINTENANCEZONECODE
GROUP BY RJ_INTRACITY_LINK_ID,RJ_MAINTENANCE_ZONE_CODE;
END;
ELSE
BEGIN
SELECT ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH,
ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY IS NULL OR RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS UG_LEN
,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS AR_LEN
INTO PNELENGTH,PUGLENGTH,PARLENGTH
FROM NE.MV_SPAN@DB_LINK_NE_VIEWER
--FROM APP_FTTX.span@sat
WHERE RJ_SPAN_ID = PSPAN_ID
AND INVENTORY_STATUS_CODE = 'IPL'
AND (NOT REGEXP_LIKE (RJ_INTRACITY_LINK_ID,'_(9)','i') OR RJ_INTRACITY_LINK_ID IS NULL)
AND RJ_MAINTENANCE_ZONE_CODE = PMAINTENANCEZONECODE
GROUP BY RJ_SPAN_ID,RJ_MAINTENANCE_ZONE_CODE;
END;
END IF;
END;
END IF;
IF PCNT_JOBID = 0 THEN
BEGIN
INSERT
INTO TBL_FIBER_INV_JOBS
(
SPAN_ID,
LINK_ID,
CREATED_BY,
MAINTENANCEZONECODE,
MAINTENANCEZONENAME,
MAINT_ZONE_NE_SPAN_LENGTH,
SPAN_TYPE,
FSA_UG,
FSA_AERIAL
)
VALUES
(
PSPAN_ID,
PLINK_ID,
PCREATED_BY,
PMAINTENANCEZONECODE,
PMAINTENANCEZONENAME,
--PMAINT_ZONE_NE_SPAN_LENGTH,
PNELENGTH,
PSPAN_TYPE,
PUGLENGTH,
PARLENGTH
)RETURNING JOB_ID INTO PJOB_ID;
IF PJOB_ID > 0 THEN
BEGIN
INSERT
INTO TBL_FIBER_INV_JOB_PROGRESS
(
JOB_ID,
STATUS_ID,
HOTO_OFFERED_DATE,
APPROV_REJECT_REMARK,
ISABDMISSING,
HOTO_OFFERED_LENGTH,
NE_SPAN_LENGTH,
CREATED_BY,
UMS_GROUP_ASS_BY_ID,
UMS_GROUP_ASS_BY_NAME,
UMS_GROUP_ASS_TO_ID,
UMS_GROUP_ASS_TO_NAME,
UMS_GROUP_ASS_TO_DATE,
MODIFIED_BY,
MODIFIED_DATE,
APPROVED_BY,
APPROVED_DATE,
FSA_UG,
FSA_AERIAL
)
VALUES
(
PJOB_ID,
PSTATUS_ID,
TO_DATE(PHOTO_OFFERED_DATE,'DD/MM/YYYY'),
PAPPROV_REJECT_REMARK,
PISABDMISSING,
PHOTO_OFFERED_LENGTH,
--PMAINT_ZONE_NE_SPAN_LENGTH,
PNELENGTH,
PCREATED_BY,
PUMS_GROUP_ASS_BY_ID,
PUMS_GROUP_ASS_BY_NAME,
PUMS_GROUP_ASS_TO_ID,
PUMS_GROUP_ASS_TO_NAME,
SYSDATE,
PCREATED_BY,
SYSDATE,
PCREATED_BY,
SYSDATE,
-- PUG_LENGTH,
-- PAR_LENGTH
PUGLENGTH,
PARLENGTH
)RETURNING JOB_PROGRESS_ID INTO PJOB_PROGRESS_ID;
END;
END IF;
IF PJOB_PROGRESS_ID > 0 THEN
BEGIN
POUTMSG := 'SUCCESS|'||PJOB_PROGRESS_ID;
COMMIT;
END;
ELSE
BEGIN
POUTMSG := 'FAILED|Record not created';
ROLLBACK;
END;
END IF;
END;
ELSE
BEGIN
POUTMSG := 'EXISTS|Record already exists';
END;
END IF;
EXCEPTION
WHEN OTHERS THEN
ERROR_CODE := SQLCODE;
ERROR_MESSAGE := SUBSTR(SQLERRM, 1, 200);
ROLLBACK;
POUTMSG := 'ERROR|Error ocurred on record creation';
PKG_FIBER_HOTO_COMP_TEST.INS_ERRORLOG(PCREATED_BY,PSPAN_ID||PLINK_ID,'DB : INS_WORKFLOW',ERROR_CODE||' : '||ERROR_MESSAGE);
END INS_WORKFLOW;
下面还有table描述
TBL_FIBER_INV_JOBS
Name Null Type
--------------------------- -------- --------------
JOB_ID NOT NULL NUMBER PK
SPAN_ID NVARCHAR2(100)
LINK_ID NVARCHAR2(100)
CREATED_BY NVARCHAR2(200)
CREATED_DATE NOT NULL DATE
MAINTENANCEZONECODE NVARCHAR2(50)
MAINTENANCEZONENAME NVARCHAR2(100)
MAINT_ZONE_NE_SPAN_LENGTH NUMBER
SPAN_TYPE NVARCHAR2(20)
JOB_FLAG NUMBER
MISSING_ABD_LENGTH NUMBER(38,10)
REOFFERFLAG VARCHAR2(10)
FSA_ID NVARCHAR2(8)
FSA_COMMON NUMBER
FSA_UG NUMBER
FSA_AERIAL NUMBER
FSA_MDU NUMBER
MISSING_ABD_UG NUMBER
MISSING_ABD_AR NUMBER
CALCULATED_LENGTH NUMBER
RJ_CONSTRUCTION_METHODOLOGY NUMBER
TBL_FIBER_INV_JOB_PROGRESS
Name Null Type
--------------------- -------- --------------
JOB_PROGRESS_ID NOT NULL NUMBER
JOB_ID NUMBER FK
STATUS_ID NUMBER
HOTO_OFFERED_DATE DATE
HOTO_ACCEPTENCE_DATE DATE
LIT_ACCEPTENCE_DATE DATE
APPROVED_BY NVARCHAR2(200)
APPROVED_DATE DATE
REJECTED_BY NVARCHAR2(200)
REJECTED_DATE DATE
APPROV_REJECT_REMARK NVARCHAR2(255)
DELAY_REASON NVARCHAR2(255)
ISABDMISSING NUMBER
HOTO_OFFERED_LENGTH NUMBER
LIT_OFFERED_LENGTH NUMBER
HOTO_ACTUAL_LENGTH NUMBER
LIT_ACTUAL_LENGTH NUMBER
ABD_COMPLETED_LENGTH NUMBER
NE_SPAN_LENGTH NUMBER
CREATED_BY NVARCHAR2(200)
CREATED_DATE NOT NULL DATE
MODIFIED_BY NVARCHAR2(200)
MODIFIED_DATE DATE
UMS_GROUP_ASS_BY_ID NUMBER
UMS_GROUP_ASS_BY_NAME NVARCHAR2(200)
UMS_GROUP_ASS_TO_ID NUMBER
UMS_GROUP_ASS_TO_NAME NVARCHAR2(200)
UMS_GROUP_ASS_TO_DATE DATE
JOB_PROGRESS_FLAG NOT NULL NUMBER
HOTO_OFFER_LEN_UPD_BY NVARCHAR2(200)
FSA_COMMON NUMBER
FSA_UG NUMBER
FSA_AERIAL NUMBER
FSA_MDU NUMBER
FSA_UG_ACTUAL NUMBER
FSA_AERIAL_ACTUAL NUMBER
FSA_MDU_ACTUAL NUMBER
我会尝试看看这个解决方案是否符合您的要求。关键因素:
- 我删除了所有不需要的开始结束块。当你想控制那些块上的异常时,你只需要指定块。
- 如果 child 存在于已插入的 parent 中,则它已由事务级别 READ UNCOMMITTED 控制。因此,当 child 存在于 parent created_date 时,我可以计算 child 中相同 P_JOBID 的记录
- 我在该列上使用了 to_char,因为我不知道您有哪些 NLS_DATE 设置。
如有任何疑问,请告诉我。
更新
只要使用 SERVEROUPUT ON 或 DBMS_OUTPUT.ENABLE 执行过程并且会话配置为捕获输出,就可以显示消息。
PROCEDURE INS_WORKFLOW
(
PSPAN_ID IN TBL_FIBER_INV_JOBS.SPAN_ID%TYPE,
PLINK_ID IN TBL_FIBER_INV_JOBS.LINK_ID%TYPE,
PCREATED_BY IN TBL_FIBER_INV_JOBS.CREATED_BY%TYPE,
PMAINTENANCEZONECODE IN TBL_FIBER_INV_JOBS.MAINTENANCEZONECODE%TYPE,
PMAINTENANCEZONENAME IN TBL_FIBER_INV_JOBS.MAINTENANCEZONENAME%TYPE,
PMAINT_ZONE_NE_SPAN_LENGTH IN TBL_FIBER_INV_JOBS.MAINT_ZONE_NE_SPAN_LENGTH%TYPE,
PSTATUS_ID IN TBL_FIBER_INV_JOB_PROGRESS.STATUS_ID%TYPE,
PHOTO_OFFERED_DATE IN NVARCHAR2,
PAPPROV_REJECT_REMARK IN TBL_FIBER_INV_JOB_PROGRESS.APPROV_REJECT_REMARK%TYPE,
PISABDMISSING IN TBL_FIBER_INV_JOB_PROGRESS.ISABDMISSING%TYPE,
PHOTO_OFFERED_LENGTH IN TBL_FIBER_INV_JOB_PROGRESS.HOTO_OFFERED_LENGTH%TYPE,
PUMS_GROUP_ASS_BY_ID IN TBL_FIBER_INV_JOB_PROGRESS.UMS_GROUP_ASS_BY_ID%TYPE,
PUMS_GROUP_ASS_BY_NAME IN TBL_FIBER_INV_JOB_PROGRESS.UMS_GROUP_ASS_BY_NAME%TYPE,
PUMS_GROUP_ASS_TO_ID IN TBL_FIBER_INV_JOB_PROGRESS.UMS_GROUP_ASS_TO_ID%TYPE,
PUMS_GROUP_ASS_TO_NAME IN TBL_FIBER_INV_JOB_PROGRESS.UMS_GROUP_ASS_TO_NAME%TYPE,
PSPAN_TYPE IN TBL_FIBER_INV_JOBS.SPAN_TYPE%TYPE,
POUTMSG OUT NVARCHAR2
)
AS
PJOB_PROGRESS_ID NUMBER:=0;
PJOB_ID NUMBER :=0;
PCNT_JOBID NUMBER :=-1;
PNELENGTH NUMBER:=0;
PUGLENGTH NUMBER:=0;
PARLENGTH NUMBER:=0;
VCOUNTERCHILD PLS_INTEGER;
BEGIN
--execute immediate 'alter session set nls_date_format = ''DD/MM/YYYY''';
IF ( PSPAN_TYPE = 'INTRACITY' OR PSPAN_TYPE = 'ENTERPRISE' )
THEN
SELECT COUNT(JOB_ID) INTO PCNT_JOBID
FROM TBL_FIBER_INV_JOBS
WHERE LINK_ID = PLINK_ID
AND MAINTENANCEZONECODE = PMAINTENANCEZONECODE;
SELECT ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH,
ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY IS NULL OR RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS UG_LEN
,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS AR_LEN
INTO PNELENGTH,PUGLENGTH,PARLENGTH
FROM NE.MV_SPAN@DB_LINK_NE_VIEWER
--FROM APP_FTTX.span@sat
WHERE RJ_INTRACITY_LINK_ID = PLINK_ID
AND INVENTORY_STATUS_CODE = 'IPL'
AND RJ_MAINTENANCE_ZONE_CODE = PMAINTENANCEZONECODE
GROUP BY RJ_INTRACITY_LINK_ID,RJ_MAINTENANCE_ZONE_CODE;
ELSIF PSPAN_TYPE = 'INTERCITY'
THEN
SELECT COUNT(JOB_ID) INTO PCNT_JOBID
FROM TBL_FIBER_INV_JOBS
WHERE SPAN_ID = PSPAN_ID
AND MAINTENANCEZONECODE = PMAINTENANCEZONECODE;
---CR981 implemenation
IF LENGTH(PSPAN_ID) = 9
THEN
SELECT ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH,
ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY IS NULL OR RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS UG_LEN
,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS AR_LEN
INTO PNELENGTH,PUGLENGTH,PARLENGTH
FROM NE.MV_SPAN@DB_LINK_NE_VIEWER
--FROM APP_FTTX.span@sat
WHERE RJ_INTRACITY_LINK_ID = PSPAN_ID
AND INVENTORY_STATUS_CODE = 'IPL'
AND RJ_MAINTENANCE_ZONE_CODE = PMAINTENANCEZONECODE
GROUP BY RJ_INTRACITY_LINK_ID,RJ_MAINTENANCE_ZONE_CODE;
ELSE
SELECT ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH,
ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY IS NULL OR RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS UG_LEN
,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS AR_LEN
INTO PNELENGTH,PUGLENGTH,PARLENGTH
FROM NE.MV_SPAN@DB_LINK_NE_VIEWER
--FROM APP_FTTX.span@sat
WHERE RJ_SPAN_ID = PSPAN_ID
AND INVENTORY_STATUS_CODE = 'IPL'
AND (NOT REGEXP_LIKE (RJ_INTRACITY_LINK_ID,'_(9)','i') OR RJ_INTRACITY_LINK_ID IS NULL)
AND RJ_MAINTENANCE_ZONE_CODE = PMAINTENANCEZONECODE
GROUP BY RJ_SPAN_ID,RJ_MAINTENANCE_ZONE_CODE;
END IF;
END IF;
IF PCNT_JOBID = 0
THEN
INSERT
INTO TBL_FIBER_INV_JOBS
(
SPAN_ID,
LINK_ID,
CREATED_BY,
MAINTENANCEZONECODE,
MAINTENANCEZONENAME,
MAINT_ZONE_NE_SPAN_LENGTH,
SPAN_TYPE,
FSA_UG,
FSA_AERIAL
)
VALUES
(
PSPAN_ID,
PLINK_ID,
PCREATED_BY,
PMAINTENANCEZONECODE,
PMAINTENANCEZONENAME,
--PMAINT_ZONE_NE_SPAN_LENGTH,
PNELENGTH,
PSPAN_TYPE,
PUGLENGTH,
PARLENGTH
)RETURNING JOB_ID INTO PJOB_ID;
IF PJOB_ID > 0
THEN
SELECT COUNT(*) INTO VCOUNTERCHILD FROM
TBL_FIBER_INV_JOB_PROGRESS c INNER JOIN TBL_FIBER_INV_JOBS p
ON c.job_id=p.job_id and c.job_id = PJOB_ID and
to_char(p.CREATED_DATE,'dd/mm/yyyy') = to_char(sysdate,'dd/mm/yyyy')
and nvl(c.span_id,'XXX') = nvl(p.span_id,'XXX') and
nvl(c.MAINTENANCEZONECODE,'XXX') = nvl(p.MAINTENANCEZONECODE,'XXX') ;
-- if the child is not there we insert
if VCOUNTERCHILD = 0
then
insert INTO TBL_FIBER_INV_JOB_PROGRESS
(
JOB_ID,
STATUS_ID,
HOTO_OFFERED_DATE,
APPROV_REJECT_REMARK,
ISABDMISSING,
HOTO_OFFERED_LENGTH,
NE_SPAN_LENGTH,
CREATED_BY,
UMS_GROUP_ASS_BY_ID,
UMS_GROUP_ASS_BY_NAME,
UMS_GROUP_ASS_TO_ID,
UMS_GROUP_ASS_TO_NAME,
UMS_GROUP_ASS_TO_DATE,
MODIFIED_BY,
MODIFIED_DATE,
APPROVED_BY,
APPROVED_DATE,
FSA_UG,
FSA_AERIAL
)
VALUES
(
PJOB_ID,
PSTATUS_ID,
TO_DATE(PHOTO_OFFERED_DATE,'DD/MM/YYYY'),
PAPPROV_REJECT_REMARK,
PISABDMISSING,
PHOTO_OFFERED_LENGTH,
--PMAINT_ZONE_NE_SPAN_LENGTH,
PNELENGTH,
PCREATED_BY,
PUMS_GROUP_ASS_BY_ID,
PUMS_GROUP_ASS_BY_NAME,
PUMS_GROUP_ASS_TO_ID,
PUMS_GROUP_ASS_TO_NAME,
SYSDATE,
PCREATED_BY,
SYSDATE,
PCREATED_BY,
SYSDATE,
-- PUG_LENGTH,
-- PAR_LENGTH
PUGLENGTH,
PARLENGTH
)RETURNING JOB_PROGRESS_ID INTO PJOB_PROGRESS_ID;
end if;
END IF;
IF PJOB_PROGRESS_ID > 0
THEN
POUTMSG := 'SUCCESS|'||PJOB_PROGRESS_ID;
COMMIT;
ELSE
POUTMSG := 'WARNING|Record not created - Already a child record for job id '||PJOB_ID||' ';
-- I will remove the rollback. Here it does not make sense as you don't need to rollback the whole transaction
-- ROLLBACK;
dbms_output.put_line ( POUTMSG );
END IF;
ELSE
POUTMSG := 'EXISTS|Record already exists';
END IF;
EXCEPTION
WHEN OTHERS THEN
ERROR_CODE := SQLCODE;
ERROR_MESSAGE := SUBSTR(SQLERRM, 1, 200);
ROLLBACK;
POUTMSG := 'ERROR|Error ocurred on record creation';
PKG_FIBER_HOTO_COMP_TEST.INS_ERRORLOG(PCREATED_BY,PSPAN_ID||PLINK_ID,'DB : INS_WORKFLOW',ERROR_CODE||' : '||ERROR_MESSAGE);
END INS_WORKFLOW;