我建了个序列:
create sequence H_WO_HEAD_SEQ
minvalue 1
maxvalue 999999
start with 21
increment by 1
cache 20
order;建了一个数据表:
create table NEW_ORDER
(
NEW_ORDER_NO VARCHAR2(20) not null,//主键
ORDER_NO VARCHAR2(20) not null//外键(wo-head表的主键)
)现在!我有个sql语句 假如是 :select order_no from table1得到很多order_no ,
我希望一个order_no 配一个H_WO_HEAD_SEQ.nextval 来同步填充在new_order表中!
求大家帮帮忙!如何实现!如果需要触发器!如何写这个触发器!磕头拜谢了!
create sequence H_WO_HEAD_SEQ
minvalue 1
maxvalue 999999
start with 21
increment by 1
cache 20
order;建了一个数据表:
create table NEW_ORDER
(
NEW_ORDER_NO VARCHAR2(20) not null,//主键
ORDER_NO VARCHAR2(20) not null//外键(wo-head表的主键)
)现在!我有个sql语句 假如是 :select order_no from table1得到很多order_no ,
我希望一个order_no 配一个H_WO_HEAD_SEQ.nextval 来同步填充在new_order表中!
求大家帮帮忙!如何实现!如果需要触发器!如何写这个触发器!磕头拜谢了!
不太明白
你要实现什么需求
按你这么说,原表中ORDER_NO对应的NEW_ORDER_NO为空?你要填充一个新id进去,只要不会重复就行了
为什么每次查询都要重新对NEW_ORDER_NO赋值呢?一次性进行更新
update new_order set NEW_ORDER_NO=H_WO_HEAD_SEQ.nextval
where NEW_ORDER_NO is null不行吗
BEFORE INSERT ON table_name
REFERENCING
NEW AS :NEW
FOR EACH ROW
Begin
SELECT SEQname.NEXTVAL
INTO :NEW.FIELDname
FROM DUAL;
End;
自己改下触发器名、表名、序列名
用分析函数 row_number()
考虑重复的话 dense_rank()select order_no,row_number()over(parition by order_no order by order_no) order_new from table_name
create sequence zhai;
select zhai.nextval from dual
connect by rownum<=10还不如用分析函数row_number()over(order by )
触发器是不行的
如果按你说的,每次select都往新表插入数据。不能用触发器,可以用自定义自治事务函数
例子如下
create or replace function func1(ordno in number)return number
as
newno number;
pragma autonomous_transaction;
begin
select H_WO_HEAD_SEQ.nextval into newno from dual;
insert into new_order values(newno,ordno);
commit;
return ordno;
end;然后查询
select func1(order_no) from table1
查询的结果还是order_no,但函数会将查询出现的order_no加上新的序号填充到新表中。这样没查询一次都会在新表里插入记录
如果只需要插入一次,就不用写函数,像shiyiwan那样就可以了