如何写一个批量插入数据的函数,同时要求对某一字段自动编号.

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序列编号(我不会实现)
望高手指教
谢谢

...全文
456 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
rolandzhang 2005-10-10
  • 打赏
  • 举报
回复
去流水号,你自己编个程序,每次去max+1的值就可以了。前台后台都行
SInoyew 2005-10-10
  • 打赏
  • 举报
回复
嗯,触发器里用序列不错。
zxbyhcsdn 2005-10-10
  • 打赏
  • 举报
回复
那么看看在触发器中用序列啦!!
waterfirer 2005-10-10
  • 打赏
  • 举报
回复
可以的,是不是别的地方的问题啊?
SQL> select * from e;

C1 C2
---------- ----------
1 11
1 22
2 33
2 44
2 55
3 66
2 33

已选择7行。

SQL> insert into e (select 3,testa.nextval from f);

已创建4行。

SQL> select * from e;

C1 C2
---------- ----------
1 11
1 22
2 33
2 44
2 55
3 66
2 33
3 477
3 478
3 479
3 480

已选择11行。

SQL>
sxbug 2005-10-10
  • 打赏
  • 举报
回复
还是不行

批量插入数据,是不是不能使用 序列 ?????
waterfirer 2005-10-10
  • 打赏
  • 举报
回复
select to_char(sysdate,'yyyymm')||lpad(to_char(WGPECOST_SQUENCE.nextval),4,'0') from dual
换成to_char(sysdate,'yyyymm')||lpad(to_char(WGPECOST_SQUENCE.nextval),4,'0')
sxbug 2005-10-10
  • 打赏
  • 举报
回复
我试了插入一条记录这样写没有问题,
插入一批数据这样写好象不行.
sxbug 2005-10-09
  • 打赏
  • 举报
回复
大家费心了
关键问题是用序列不行。
我通过函数生成一批数据,这些数据有一个costid的子段,这个子段的编码是这样的年份-流水号,如:2004-0001等。我的触发器就用于生成这样的序号。
现在的问题是 函数执行的时候,触发器无法工作。
hevin 2005-10-09
  • 打赏
  • 举报
回复
当然是一样的。就是不知道27个“9”能不能做最大值,改天试一试。
sasacat 2005-10-09
  • 打赏
  • 举报
回复
这个啊,哈哈哈

从哪开始不一样吗?反正ID值是不见人的:)
hevin 2005-10-09
  • 打赏
  • 举报
回复
sasacat(傻傻猫) 争取解释一下各个字段的含义,呵呵。

PS:有没有必要从61开始,最小值又设为1啊?
sasacat 2005-10-09
  • 打赏
  • 举报
回复
那我就勤劳一下吧:)

创建序列:

create sequence SEQ
minvalue 1
maxvalue 999999999999999999999999999
start with 61
increment by 1
cache 30
order;

使用:

insert into tname values(序列名.nextval,其他字段值)
hevin 2005-10-09
  • 打赏
  • 举报
回复
好长,

Oracle的自动编号用序列来实现,可以在触发器中调用或在插入时调用,具体你可以上网搜一下"Oracle 序列".
sxbug 2005-10-09
  • 打赏
  • 举报
回复
我做了一个序列和一个完整的函数,函数代码如下:
(ORIG_MONTH IN STRING,
NEW_MONTH IN STRING
)
RETURN NUMBER IS MYTOTAL NUMBER(6);
BEGIN
EXECUTE IMMEDIATE ('ALTER TRIGGER T_INSERT_WGPECOST_NO DISABLE');
SELECT COUNT(EMPNO) INTO MYTOTAL FROM WGPECOST
WHERE CHECK_DATE LIKE TO_DATE(NEW_MONTH,'MM/DD/YYYY');
IF MYTOTAL=0 THEN
--select WGPECOST_SQUENCE.nextval into MYTOTAL from dual;
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,'-'),
(select to_char(sysdate,'yyyymm')||lpad(to_char(WGPECOST_SQUENCE.nextval),4,'0') from dual) AS 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;
EXECUTE IMMEDIATE ('ALTER TRIGGER T_INSERT_WGPECOST_NO ENABLE');
RETURN(MYTOTAL);
END;


在这个函数中使用序列部分,无法编译通过,是不是不能在插入批量数据时使用序列功能??????
waterfirer 2005-10-09
  • 打赏
  • 举报
回复
序列上面已经有例子了,
insert into tableA (select a,b,year || SEQ.nextval from tableB)
sxbug 2005-10-09
  • 打赏
  • 举报
回复
如何实现呢?
waterfirer 2005-10-09
  • 打赏
  • 举报
回复
不用触发器,在函数的insert里用序列

684

社区成员

发帖
与我相关
我的任务
社区描述
智能路由器通常具有独立的操作系统,包括OpenWRT、eCos、VxWorks等,可以由用户自行安装各种应用,实现网络和设备的智能化管理。
linuxpython 技术论坛(原bbs)
社区管理员
  • 智能路由器社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧