如何写一个批量插入数据的函数,同时要求对某一字段自动编号.
sxbug 2005-10-08 08:36:14 我开始的做法是作了一个批量增加的函数,然后又对相应的数据表做了一个触发器来实现自动编号.结果发现在函数执行过程中,触发器无法工作.
函数如下:
NewWGPECOSTFunc
(ORIG_MONTH IN STRING,
NEW_MONTH IN STRING,
WTUNITCOST IN NUMBER
)
RETURN NUMBER IS MYTOTAL NUMBER(6);
BEGIN
SELECT COUNT(EMPNO) INTO MYTOTAL FROM WGPECOST
WHERE CHECK_DATE LIKE TO_DATE(NEW_MONTH,'MM/DD/YYYY');
IF MYTOTAL=0 THEN
INSERT INTO WGPECOST (EMPNO, WMETER, PMETER, GMETER, CHECK_DATE, WUNITCOST, PUNITCOST,
GUNITCOST, WMETER_P, PMETER_P, GMETER_P, W_USEVALUE, P_USEVALUE, G_USEVALUE, W_COST,
P_COST, G_COST, M_COST, Y_COST,CHECKER, COSTID )
SELECT CUSTOMERS.CUSTOMERID , 0,0,0, TO_DATE(NEW_MONTH,'MM/DD/YYYY') AS CHECK_DATE,
(SELECT NVL(UNITCOST,0.5) FROM WGPE_UNITCOST WHERE TYPEID='WT'),
(SELECT NVL(UNITCOST,1) FROM WGPE_UNITCOST WHERE TYPEID='GS'),
(SELECT NVL(UNITCOST,0.6) FROM WGPE_UNITCOST WHERE TYPEID='PW'),
NVL(WGPECOST.WMETER,0),NVL(WGPECOST.PMETER,0),NVL(WGPECOST.GMETER,0),
0,0,0,0,0,0,(SELECT UNITCOST FROM WGPE_UNITCOST WHERE TYPEID=(SELECT HOUSE_TYPE
FROM CUSTOMERS WHERE CUSTOMERS.CUSTOMERID=WGPECOST.EMPNO)),
WGPECOST.Y_COST, NVL(WGPECOST.CHECKER,'-'), NVL(WGPECOST.COSTID,'-')
FROM WGPECOST RIGHT OUTER JOIN CUSTOMERS
ON ( WGPECOST.EMPNO = CUSTOMERS.CUSTOMERID )
WHERE WGPECOST.CHECK_DATE LIKE TO_DATE(ORIG_MONTH,'MM/DD/YYYY') OR WGPECOST.CHECK_DATE IS NULL;
END IF;
RETURN(MYTOTAL);
END;
触发器设计如下:
T_INSERT_WGPECOST_NO
declare
myYear Varchar(10);
myTAALIAS Varchar(2);
myYearCount NUMBER(10);
myNewCOSTID Varchar(10);
--seq_val NUMBER(5);
BEGIN
select (to_char(sysdate,'yyyymm')||'%') into myYear from dual;
select count(COSTID) into myYearCount from WGPECOST where COSTID like myYear;
select to_char(sysdate,'yyyymm')||lpad(to_char(myYearCount+1),4,'0') into myNewCOSTID from dual;
if myNewCOSTID<>:new.COSTID then
select to_char(sysdate,'yyyymm')||lpad(to_char(myYearCount+1),4,'0') into :New.COSTID from dual;
end if;
END;
现在我的想法就是,执行函数的时候停止触发器(我不会实现),当函数执行完后恢复触发器.
在函数插入批量数据的同时,生成对应的costid序列编号(我不会实现)
望高手指教
谢谢