由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Database版 - 求教:Oracle trigger 中生成的数据如何送到stored procedure中?
相关主题
请教sql server temptable # 和 ##德州招SQL Developer
面试回来发考题2stored procedure running 很慢的问题
Stored Procedure / Trigger - 谢谢trigger vs. log ?
Why does this Stored procedure fail ?database triggers
如何让SQL 2005 CLR Trigger返回结果给Stored Procedure用?oracle trigger question
求建议,要面没有project经验,但自学了的东西 (转载)No Need for trigger Re: oracle trigger question
SQL server stored procedure 求助SQL debug step into a store procedure from another one (转载)
why this Trigger hang the Process *** thanks thankshow to include record deleted date into trigger?
相关话题的讨论汇总
话题: orderid话题: insert话题: partid话题: qty话题: procedure
进入Database版参与讨论
1 (共1页)
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
5
谢谢!

【在 B*****g 的大作中提到】
: http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.
:
: NULL

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;

相关主题
求建议,要面没有project经验,但自学了的东西 (转载)德州招SQL Developer
SQL server stored procedure 求助stored procedure running 很慢的问题
why this Trigger hang the Process *** thanks thankstrigger vs. log ?
进入Database版参与讨论
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

1 (共1页)
进入Database版参与讨论
相关主题
how to include record deleted date into trigger?如何让SQL 2005 CLR Trigger返回结果给Stored Procedure用?
Trigger questions求建议,要面没有project经验,但自学了的东西 (转载)
面试问题How would you improve table insert performance? (give five or more ideas)SQL server stored procedure 求助
大家帮忙看看一个sql server set option 的问题why this Trigger hang the Process *** thanks thanks
请教sql server temptable # 和 ##德州招SQL Developer
面试回来发考题2stored procedure running 很慢的问题
Stored Procedure / Trigger - 谢谢trigger vs. log ?
Why does this Stored procedure fail ?database triggers
相关话题的讨论汇总
话题: orderid话题: insert话题: partid话题: qty话题: procedure