P********R 发帖数: 1691 | 1 Oracle trigger procedure中生成的数据如何送到stored procedure中?
表orderitems有四列:orderid, detail, partid, qty.
比如在主程序中接收三个变量:
v_Orderid ORDERS.orderid%TYPE := &2;
v_Partid INVENTORY.partid%TYPE := &3;
v_Qty ORDERITEMS.qty%TYPE := &4;
然后用:
AddLineItemSP(v_Orderid, v_Partid, v_Qty);
语句激活stored procedure并将三个值赋给i_Orderid, i_partid, i_Qty:
CREATE OR REPLACE PROCEDURE AddLineItemSP (
i_Orderid IN ORDERITEMS.orderid %TYPE,
i_Partid IN ORDERITEMS.partid %TYPE,
i_Qty IN ORDERITEMS.qty %TYPE)
IS
stored procedure中有插入命令:
INSERT INTO ORDERITEMS (orderid, detail, partid, qty)
VALUES (i_Orderid, v_Newdetail, i_Partid, i_Qty);
因为表ORDERITEMS有四列,用trigger procedure的:
BEFORE INSERT ON ORDERITEMS
FOR EACH ROW
自动在stored procedure执行INSERT之前生成另一个变量detail的值:
SELECT NVL(MAX(detail), 0) + 1
INTO v_Newdetail
FROM ORDERITEMS
WHERE orderid = v_Orderid;
然后stored procedure再自动执行INSERT命令,插入数据。
请问:
1. 这个trigger里生成的v_Newdetail值会由AddLineItemSP自动接收并在执行INSERT命
令时自动加入?还是要另定义一个变量?
2. 整个思路有没有问题
谢谢! |
c*****d 发帖数: 6045 | 2 你把问题说复杂了,这件事和AddLineItemSP没太大关系
就是insert trigger的问题
不要用SELECT NVL(MAX(detail), 0) + 1
如果你没锁表,两个用户同时插入数据,你这个是有问题的
改用sequence |
P********R 发帖数: 1691 | 3 还没学到sequence。 :(
我觉得把SELCT NVL(MAX(dteail), 0) + 1
放到主程序里去就会简单很多,但要求就是要用SELECT 在trigger里。
我调试了一下,改来改去的,结果不是说AddLineItemSP invalid, 就是说插入了NULL
(detail), 所以我想知道是不是trigger传数值回AddLineItemSP时出了问题。
【在 c*****d 的大作中提到】 : 你把问题说复杂了,这件事和AddLineItemSP没太大关系 : 就是insert trigger的问题 : 不要用SELECT NVL(MAX(detail), 0) + 1 : 如果你没锁表,两个用户同时插入数据,你这个是有问题的 : 改用sequence
|
B*****g 发帖数: 34098 | 4 http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.
NULL
【在 P********R 的大作中提到】 : 还没学到sequence。 :( : 我觉得把SELCT NVL(MAX(dteail), 0) + 1 : 放到主程序里去就会简单很多,但要求就是要用SELECT 在trigger里。 : 我调试了一下,改来改去的,结果不是说AddLineItemSP invalid, 就是说插入了NULL : (detail), 所以我想知道是不是trigger传数值回AddLineItemSP时出了问题。
|
P********R 发帖数: 1691 | |
c*****d 发帖数: 6045 | 6 作为新手,你可以把这个简化成几个步骤
1. 写一个trigger,这个trigger能够在用户执行insert INTO ORDERITEMS (orderid,
partid, qty)的时候自动产生一个新的detail,现在可以先用max+1,以后学了
sequence可以修改
2. 上面这个trigger实现了,并测试之后写存储过程,存储过程其实就是简化了insert
语句,只要提供i_Orderid, i_partid, i_Qty |
P********R 发帖数: 1691 | 7 谢谢!
就是这样做的,但好象trigger自动产生的新的detail不能在INSERT的时候读取。
在trigger里用了:
SELECT NVL(MAX(detail), 0) + 1
INTO v_Newdetail
FROM ORDERITEMS
WHERE orderid = v_Orderid;
:new.detail = v_Newdetail;
,
insert
【在 c*****d 的大作中提到】 : 作为新手,你可以把这个简化成几个步骤 : 1. 写一个trigger,这个trigger能够在用户执行insert INTO ORDERITEMS (orderid, : partid, qty)的时候自动产生一个新的detail,现在可以先用max+1,以后学了 : sequence可以修改 : 2. 上面这个trigger实现了,并测试之后写存储过程,存储过程其实就是简化了insert : 语句,只要提供i_Orderid, i_partid, i_Qty
|
c*****d 发帖数: 6045 | 8 你还是没看明白我上面说的
不管用户执行insert INTO ORDERITEMS (orderid,partid,qty)
还是insert INTO ORDERITEMS (orderid,detail,partid,qty)
或者说不管用户有没有提供detail
trigger都要忽略detail,然后改用max+1
不用trigger返回任何value
【在 P********R 的大作中提到】 : 谢谢! : 就是这样做的,但好象trigger自动产生的新的detail不能在INSERT的时候读取。 : 在trigger里用了: : SELECT NVL(MAX(detail), 0) + 1 : INTO v_Newdetail : FROM ORDERITEMS : WHERE orderid = v_Orderid; : :new.detail = v_Newdetail; : : ,
|
c*****d 发帖数: 6045 | 9 以上是思路,这个是答案(如果必须用max+1)
create table emp (id number, name varchar2(20));
insert into emp values(1,'coolbid');
commit;
create or replace trigger trg_bir_emp
before insert on emp
referencing new as new old as old
for each row
begin
select max(id)+1 into :new.id from emp;
end;
/
insert into emp (name) values('beijing');
commit; |
B*****g 发帖数: 34098 | 10 你这是用toad写的吧,嘿嘿
【在 c*****d 的大作中提到】 : 以上是思路,这个是答案(如果必须用max+1) : create table emp (id number, name varchar2(20)); : insert into emp values(1,'coolbid'); : commit; : create or replace trigger trg_bir_emp : before insert on emp : referencing new as new old as old : for each row : begin : select max(id)+1 into :new.id from emp;
|
|
|
c*****d 发帖数: 6045 | 11 更好的方法是用sequence
create sequence seq_emp_id start with 3 incrmented by 1;
create or replace trigger trg_bir_emp
before insert on emp
referencing new as new old as old
for each row
begin
select seq_emp_id.nextval into :new.id from dual;
end;
/
insert into emp (name) values('id not provided');
insert into emp (name) values(100,'id provided');
select * from emp; |
c*****d 发帖数: 6045 | 12 不是,手写的
为啥让你以为是toad写的?我写的太工整了像是toad格式化以后的?
【在 B*****g 的大作中提到】 : 你这是用toad写的吧,嘿嘿
|
B*****g 发帖数: 34098 | 13 你这样教我觉得不行,lz的问题是一口想把2个问题都解决,这样容易乱。
很显然问题应该分几步走:
1 写一个trigger,insert时自动加一个固定值(比如说1)
2 在1的基础上把那个固定值换成变量
新手写程序切记不要想一次把功能都写出来,要迭代式的开发
【在 c*****d 的大作中提到】 : 更好的方法是用sequence : create sequence seq_emp_id start with 3 incrmented by 1; : create or replace trigger trg_bir_emp : before insert on emp : referencing new as new old as old : for each row : begin : select seq_emp_id.nextval into :new.id from dual; : end; : /
|
B*****g 发帖数: 34098 | 14 DBA会写code是DB developer的悲哀
【在 c*****d 的大作中提到】 : 不是,手写的 : 为啥让你以为是toad写的?我写的太工整了像是toad格式化以后的?
|
c*****d 发帖数: 6045 | 15 en,你把我在5楼的步骤1细化为2步,这样对lz更清晰
我非常同意你说的迭代式开发
【在 B*****g 的大作中提到】 : 你这样教我觉得不行,lz的问题是一口想把2个问题都解决,这样容易乱。 : 很显然问题应该分几步走: : 1 写一个trigger,insert时自动加一个固定值(比如说1) : 2 在1的基础上把那个固定值换成变量 : 新手写程序切记不要想一次把功能都写出来,要迭代式的开发
|
c*****d 发帖数: 6045 | 16 也没啥悲哀的,哥开始也是做DEV的,后来发现更喜欢DBA才转过来的
【在 B*****g 的大作中提到】 : DBA会写code是DB developer的悲哀
|
B*****g 发帖数: 34098 | 17 圡
【在 c*****d 的大作中提到】 : 也没啥悲哀的,哥开始也是做DEV的,后来发现更喜欢DBA才转过来的
|
c*****d 发帖数: 6045 | 18 为啥说我圡
【在 B*****g 的大作中提到】 : 圡
|
B*****g 发帖数: 34098 | 19 DEV的出路,走DBA基本上是中下品。
上品是dev-lead-manager-director-cxo
中品是dev-architect
中下品是dev-dba 和 dev-dev
下品是dev-qa
【在 c*****d 的大作中提到】 : 为啥说我圡
|
d*****8 发帖数: 402 | 20 Beijing, 请教个问题,最近公司内换组从db developer 升到sr developer 。查了下
新老板手下同事两个 db developer 一个有七八年db dev经验,一个本公司三年经验哈
佛毕业的。。。汗 有点压力啊,因为我入行来这个公司还不到三年。 想知道sr 跟普
通 developer 有什么区别我需要怎么在新组立住脚啊
★ 发自iPhone App: ChineseWeb 7.8
【在 B*****g 的大作中提到】 : DEV的出路,走DBA基本上是中下品。 : 上品是dev-lead-manager-director-cxo : 中品是dev-architect : 中下品是dev-dba 和 dev-dev : 下品是dev-qa
|