根据网上语法自学写的存储过程,使用的是DBeaver工具,但是调试过程太痛苦,也不清楚为什么有时候改了报错或者没生效。
注意点:
1.如果怀疑没生效或者不对,可以建个临时表每次往里面插不同数据确认代码是否最新。
2.不知道怎么调试或者输出信息也可以往临时表写入。
3.达梦如果是非自增长的,写法简单些。如果是自增长的,使用for循环隐形变量需要select所有需要的字段才能匹配上。
4.自增长的写入也把字段列全了,没有调查是否可以不写。
5.报错的内容应该是对的,但是行号不对。特别编译对象有问题,基本上不是语法问题,而是执行起来会有问题。
这个是有自增长的:
CREATE OR REPLACE PROCEDURE copyFLEX_SUBSIDY_SET_B(sourceTpye IN varchar2 ,sourceYear IN varchar2 , toType IN varchar2 ,toYear IN varchar2) AS
tempid number DEFAULT 0;--遍历游标
--CURSOR tempCur(tempTpye IN varchar2,tempYear IN varchar2) IS SELECT * FROM "FLEX_SUBSIDY_SET_B" WHERE "YEAR" =tempYear AND "SUBSIDY_TYPE"=tempTpye;
BEGIN--SELECT MAX(id) INTO tempid FROM FLEX_SUBSIDY_SET_B;--清理历史数据DELETE FROM FLEX_SUBSIDY_SET_B WHERE "YEAR" =toYear AND "SUBSIDY_TYPE"=toType;--遍历查询数据--FOR tempdata IN tempCur(sourceTpye,sourceYear) loopFOR tempdata IN (SELECT id,"YEAR",SUBSIDY_TYPE,SET_ADMDVS,SUB_ADD_TYPE,QUOTA_BASIC_AMT,SUB_BASIC_AMT,SUB_BASIC_AMT_OV12,ARMY_SVC_PROP,ARMY_SVC_PROP_OV12,DED_BASIC_YEAR,DED_BASIC_YEAR_OV12,OT_RET_AMT,COMME_ADD_TYPE,COMME_ADD_L1,COMME_ADD_L2,COMME_ADD_L3,PAY_PROP,EXPRESS,BEGIN_TIME,END_TIME,VALID_FLAG,CREATE_TIME,UPDATE_TIME,DED_DESC,PAY_BASIC_DESC FROM FLEX_SUBSIDY_SET_B WHERE "YEAR" =sourceYear AND SUBSIDY_TYPE=sourceTpye) loop--插入数据tempid := tempid+1;INSERT INTO FLEX_SUBSIDY_SET_B("YEAR",SUBSIDY_TYPE,SET_ADMDVS,SUB_ADD_TYPE,QUOTA_BASIC_AMT,SUB_BASIC_AMT,SUB_BASIC_AMT_OV12,ARMY_SVC_PROP,ARMY_SVC_PROP_OV12,DED_BASIC_YEAR,DED_BASIC_YEAR_OV12,OT_RET_AMT,COMME_ADD_TYPE,COMME_ADD_L1,COMME_ADD_L2,COMME_ADD_L3,PAY_PROP,EXPRESS,BEGIN_TIME,END_TIME,VALID_FLAG,CREATE_TIME,UPDATE_TIME,DED_DESC,PAY_BASIC_DESC) values(toYear,toType,tempdata.SET_ADMDVS,tempdata.SUB_ADD_TYPE,tempdata.QUOTA_BASIC_AMT,tempdata.SUB_BASIC_AMT,tempdata.SUB_BASIC_AMT_OV12,tempdata.ARMY_SVC_PROP,tempdata.ARMY_SVC_PROP_OV12,tempdata.DED_BASIC_YEAR,tempdata.DED_BASIC_YEAR_OV12,tempdata.OT_RET_AMT,tempdata.COMME_ADD_TYPE,tempdata.COMME_ADD_L1,tempdata.COMME_ADD_L2,tempdata.COMME_ADD_L3,tempdata.PAY_PROP,tempdata.EXPRESS,toYear||'0101',toYear||'1231',tempdata.VALID_FLAG,tempdata.CREATE_TIME,tempdata.UPDATE_TIME,tempdata.DED_DESC,tempdata.PAY_BASIC_DESC);end loop;
END;
这个是没有自增长的:
CREATE OR REPLACE PROCEDURE copyFLEX_SUBSIDY_SET_TEST(sourceTpye IN varchar2 ,sourceYear IN varchar2 , toType IN varchar2 ,toYear IN varchar2) AS
tempid number DEFAULT 0;--遍历游标
--CURSOR tempCur(tempTpye IN varchar2,tempYear IN varchar2) IS SELECT * FROM "FLEX_SUBSIDY_SET_B_test" WHERE "YEAR" =tempYear AND "SUBSIDY_TYPE"=tempTpye;
BEGINinsert into test_tab values(8,'p_test');--清理历史数据DELETE FROM FLEX_SUBSIDY_SET_B_test WHERE "YEAR" =toYear AND "SUBSIDY_TYPE"=toType;SELECT MAX(id) INTO tempid FROM FLEX_SUBSIDY_SET_B_test;--遍历查询数据--FOR tempdata IN tempCur(sourceTpye,sourceYear) loopFOR tempdata IN (SELECT * FROM FLEX_SUBSIDY_SET_B_test WHERE "YEAR" =sourceYear AND SUBSIDY_TYPE=sourceTpye) loop--插入数据tempid := tempid+1;INSERT INTO FLEX_SUBSIDY_SET_B_test values(tempid,toYear,toType,tempdata.SET_ADMDVS,tempdata.SUB_ADD_TYPE,tempdata.QUOTA_BASIC_AMT,tempdata.SUB_BASIC_AMT,tempdata.SUB_BASIC_AMT_OV12,tempdata.ARMY_SVC_PROP,tempdata.ARMY_SVC_PROP_OV12,tempdata.DED_BASIC_YEAR,tempdata.DED_BASIC_YEAR_OV12,tempdata.OT_RET_AMT,tempdata.COMME_ADD_TYPE,tempdata.COMME_ADD_L1,tempdata.COMME_ADD_L2,tempdata.COMME_ADD_L3,tempdata.PAY_PROP,tempdata.EXPRESS,toYear||'0101',toYear||'1231',tempdata.VALID_FLAG,tempdata.CREATE_TIME,tempdata.UPDATE_TIME,tempdata.DED_DESC,tempdata.PAY_BASIC_DESC);end loop;
END;--EXEC VTPMS."copyFLEX_SUBSIDY_SET"('3','2023','2','2024');
--第一二参数是复制源和年度,第三次参数是复制目标和年度,一三参数:2是灵活就业!!!,3自主就业!!!,二四参数:年度如2024