帮忙改一下这个过程:要求:当v_cn值为0时,则sales表的cn值为系统缺省值。
当v_cn值不为0时,则sales表的cn值为v_cn。
CREATE OR REPLACE PROCEDURE sales_insert (
v_ctid IN NUMBER,
v_ctno IN NUMBER,
v_customer IN VARCHAR2,
v_ctmold IN VARCHAR2,
v_model IN VARCHAR2,
v_item IN VARCHAR2,
v_edate IN DATE,
v_eunit IN VARCHAR2,
v_eucontract IN VARCHAR2,
v_cn IN NUMBER,
v_hk IN NUMBER,
v_hk_er IN NUMBER,
v_us IN NUMBER,
v_us_er IN NUMBER
)
IS
BEGIN
UPDATE sales
SET ctno = v_ctno,
customer = v_customer,
ctmold = v_ctmold,
model = v_model,
item = v_item,
edate = v_edate,
eunit = v_eunit,
eucontract = v_eucontract,
cn = v_cn,
hk = v_hk,
hk_er = v_hk_er,
us = v_us,
us_er = v_us_er
WHERE ctid = v_ctid; IF SQL%NOTFOUND
THEN
INSERT INTO sales
(ctid, ctno, customer, ctmold, model,
item, edate, eunit, eucontract, cn, hk,
hk_er, us, us_er
)
VALUES (test_seq.NEXTVAL, v_ctno, v_customer, v_ctmold, v_model,
v_item, v_edate, v_eunit, v_eucontract, v_cn, v_hk,
v_hk_er, v_us, v_us_er
);
END IF; COMMIT;
END sales_insert;
/
解决方案 »
- oracle database.zip不能解压
- sql 优化
- oracle10g中创建视图失败
- 执行计划吗?
- 一个简单的触发器,请问这样写对吗?
- oracle 存储过程?
- 正版的ORACLE8i的盘,现在在任何机子上安装不上,以前用该盘装过ORACLE,不是盘的问题,我试了几个ORACLE的盘在几个不同的机子上,都安装
- Oracle有没有类似于SQL SERVER的MS Profiler监视器的工具?可以监视操作后台的sql语句。
- 求救:在P4机器上如何安装Oracle8i数据库
- 将一个含有子分区的数据imp到另一个数据库中,该如何操作?
- TO:duanzilin(寻) .waterfirer(水清) 帮忙再改一下这个过程.
- 事务、异常与回滚问题
v_ctid IN NUMBER,
v_ctno IN NUMBER,
v_customer IN VARCHAR2,
v_ctmold IN VARCHAR2,
v_model IN VARCHAR2,
v_item IN VARCHAR2,
v_edate IN DATE,
v_eunit IN VARCHAR2,
v_eucontract IN VARCHAR2,
v_cn IN NUMBER,
v_hk IN NUMBER,
v_hk_er IN NUMBER,
v_us IN NUMBER,
v_us_er IN NUMBER
)
IS
BEGIN
UPDATE sales
SET ctno = v_ctno,
customer = v_customer,
ctmold = v_ctmold,
model = v_model,
item = v_item,
edate = v_edate,
eunit = v_eunit,
eucontract = v_eucontract,
cn = v_cn,
hk = v_hk,
hk_er = v_hk_er,
us = v_us,
us_er = v_us_er
WHERE ctid = v_ctid; IF SQL%NOTFOUND
THEN
if v_cn=0 then
INSERT INTO sales
(ctid, ctno, customer, ctmold, model,
item, edate, eunit, eucontract, hk,
hk_er, us, us_er
)
VALUES (test_seq.NEXTVAL, v_ctno, v_customer, v_ctmold, v_model,
v_item, v_edate, v_eunit, v_eucontract, v_hk,
v_hk_er, v_us, v_us_er
);
else
INSERT INTO sales
(ctid, ctno, customer, ctmold, model,
item, edate, eunit, eucontract, cn, hk,
hk_er, us, us_er
)
VALUES (test_seq.NEXTVAL, v_ctno, v_customer, v_ctmold, v_model,
v_item, v_edate, v_eunit, v_eucontract, v_cn, v_hk,
v_hk_er, v_us, v_us_er
);
end if;
END IF; COMMIT;
END sales_insert;
/
而是v_cn,v_hk,v_hk_er,v_us,v_us_er五个字段,那岂不把过程写得长长长的?
INSERT ON sales FOR EACH ROW
BEGIN
if :new.cn=0 then
:new.cn:=default;
end if;
if :new.hk=0 then
:new.hk:=default;
end if;
...
END;
INSERT ON sales FOR EACH ROW
BEGIN
if :new.hk_er=0 then
:new.hk_er:=default;
end if;
if :new.us_er=0 then
:new.us_er:=default;
end if;
END;
不行,提示如下错误:
PLS-00103: 出现符号 "DEFAULT"在需要下列之一时:
( - + case mod new not
null <an identifier> <a double-quoted delimited-identifier>
<a bind variable> avg count current exists max min prior sql
stddev sum
2 (
3 col1 NUMBER default 10,
4 col2 VARCHAR2(20),
5 col3 VARCHAR(20)
6 )
7 /Table createdSQL>
SQL> INSERT ALL
2 WHEN a = 0 THEN --这里走这个分支,col1插入的是默认值10
3 INTO t(col2,col3) VALUES(b,c)
4 ELSE
5 INTO t(col1,col2,col3) VALUES(a,b,c)
6 SELECT 0 a,1 b,2 c FROM dual;1 row insertedSQL>
SQL> INSERT ALL
2 WHEN a = 0 THEN
3 INTO t(col2,col3) VALUES(b,c)
4 ELSE -这里走这个分支,col1插入的是3
5 INTO t(col1,col2,col3) VALUES(a,b,c)
6 SELECT 3 a,4 b,5 c FROM dual;1 row insertedSQL> commit;Commit completeSQL> select * from t; COL1 COL2 COL3
---------- -------------------- --------------------
10 1 2
3 4 5insert all 主要用来同时往多个表插入数据的,不过这里刚好也可以用到
WHEN a = 0 THEN
INTO t(col2,col3) VALUES(b,c)
WHEN b = 0 THEN
INTO t(col1,col3) VALUES(a,c)
WHEN c = 0 THEN
INTO t(col1,col2) VALUES(a,b)
ELSE
INTO t(col1,col2,col3) VALUES(a,b,c)
SELECT 3 a,4 b,5 c FROM dual;
v_ctid IN NUMBER,
v_ctno IN NUMBER,
v_hk_er IN NUMBER,
v_us_er IN NUMBER
)
IS
BEGIN
UPDATE sales
SET ctno = v_ctno,
hk_er = v_hk_er,
us_er = v_us_er
WHERE ctid = v_ctid; IF SQL%NOTFOUND
THEN
INSERT ALL
WHEN v_hk_er = 0 THEN
INTO sales(ctid, ctno,us_er) VALUES(test_seq.NEXTVAL, v_ctno,v_us_er)
WHEN v_us_er = 0 THEN
INTO sales(ctid, ctno,hk_er) VALUES(test_seq.NEXTVAL, v_ctno,v_hk_er)
else INTO sales
(ctid, ctno, hk_er, us_er)
VALUES (test_seq.NEXTVAL, v_ctno, v_hk_er, v_us_er);
END IF; COMMIT;
END sales_insert;
/
WHEN p_hk_er = 0 THEN
INTO sales(ctid, ctno,us_er) VALUES(p_tid, p_tno,p_us_er)
WHEN p_us_er = 0 THEN
INTO sales(ctid, ctno,hk_er) VALUES(p_tid, p_tno,p_hk_er)
else INTO sales(ctid, ctno, hk_er, us_er) VALUES (p_tid, p_tno,p_hk_er,p_us_er)
select test_seq.NEXTVAL p_tid,v_ctno p_tno,v_us_er p_us_er,v_hk_er p_hk_er from dual;-- 必须加上这个子查询语句
WHEN p_hk_er = 0 THEN --因为这里判断的子查询里列名,不是程序里的变量,跟程序没关系
INTO sales(ctid, ctno,us_er) VALUES(p_tid, p_tno,p_us_er)
WHEN p_us_er = 0 THEN
INTO sales(ctid, ctno,hk_er) VALUES(p_tid, p_tno,p_hk_er)
else INTO sales(ctid, ctno, hk_er, us_er) VALUES (p_tid, p_tno,p_hk_er,p_us_er)
select test_seq.NEXTVAL p_tid,v_ctno p_tno,v_us_er p_us_er,v_hk_er p_hk_er from dual;--这里用duan表构造子查询,每个变量为1列并各赋一个别名,在上面判断的时候用
v_ctid IN NUMBER,
v_ctno IN NUMBER,
v_hk_er IN NUMBER,
v_us_er IN NUMBER
)
IS
BEGIN
UPDATE sales
SET ctno = v_ctno,
hk_er = v_hk_er,
us_er = v_us_er
WHERE ctid = v_ctid; IF SQL%NOTFOUND
THEN
INSERT ALL
WHEN p_hk_er = 0 THEN
INTO sales(ctid, ctno,us_er) VALUES(p_tid, p_tno,p_us_er)
WHEN p_us_er = 0 THEN
INTO sales(ctid, ctno,hk_er) VALUES(p_tid, p_tno,p_hk_er)
else INTO sales(ctid, ctno, hk_er, us_er) VALUES (p_tid, p_tno,p_hk_er,p_us_er)
select test_seq.NEXTVAL p_tid,v_ctno p_tno,v_us_er p_us_er,v_hk_er p_hk_er from dual;
END IF; COMMIT;
END sales_insert2;
/
v_ctid IN NUMBER,
v_ctno IN NUMBER,
v_hk_er IN NUMBER,
v_us_er IN NUMBER
)
IS
v_seq number;
BEGIN
UPDATE sales
SET ctno = v_ctno,
hk_er = v_hk_er,
us_er = v_us_er
WHERE ctid = v_ctid; IF SQL%NOTFOUND
THEN
select test_seq.NEXTVAL into v_seq from dual;--这里给v_seq 赋值 INSERT ALL
WHEN p_hk_er = 0 THEN
INTO sales(ctid, ctno,us_er) VALUES(p_tid, p_tno,p_us_er)
WHEN p_us_er = 0 THEN
INTO sales(ctid, ctno,hk_er) VALUES(p_tid, p_tno,p_hk_er)
else INTO sales(ctid, ctno, hk_er, us_er) VALUES (p_tid, p_tno,p_hk_er,p_us_er)
select v_seq p_tid,v_ctno p_tno,v_us_er p_us_er,v_hk_er p_hk_er from dual;
END IF; COMMIT;
END sales_insert2;
把我那段触发器的内容加进来试试
CREATE OR REPLACE PROCEDURE sales_insert (
v_ctid IN NUMBER,
v_ctno IN NUMBER,
v_customer IN VARCHAR2,
v_ctmold IN VARCHAR2,
v_model IN VARCHAR2,
v_item IN VARCHAR2,
v_edate IN DATE,
v_eunit IN VARCHAR2,
v_eucontract IN VARCHAR2,
v_cn IN NUMBER,
v_hk IN NUMBER,
v_hk_er IN NUMBER,
v_us IN NUMBER,
v_us_er IN NUMBER
)
IS
BEGIN
UPDATE sales
SET ctno = v_ctno,
customer = v_customer,
ctmold = v_ctmold,
model = v_model,
item = v_item,
edate = v_edate,
eunit = v_eunit,
eucontract = v_eucontract,
cn = v_cn,
hk = v_hk,
hk_er = v_hk_er,
us = v_us,
us_er = v_us_er
WHERE ctid = v_ctid; IF SQL%NOTFOUND
THEN
if v_cn=0 then
v_cn:=default;
end if;
if v_hk=0 then
v_hk:=default;
end if;
...
INSERT INTO sales
(ctid, ctno, customer, ctmold, model,
item, edate, eunit, eucontract, cn, hk,
hk_er, us, us_er
)
VALUES (test_seq.NEXTVAL, v_ctno, v_customer, v_ctmold, v_model,
v_item, v_edate, v_eunit, v_eucontract, v_cn, v_hk,
v_hk_er, v_us, v_us_er
);
END IF; COMMIT;
END sales_insert;
/
waterfirer(水清) 谢谢你们2位了,我的分都不知道怎么给才好.谢谢你们了.
CREATE OR REPLACE PROCEDURE sales_insert2(v_ctid IN NUMBER,
v_ctno IN NUMBER,
v_hk_er IN NUMBER,
v_us_er IN NUMBER) IS
vp_ctid NUMBER;
BEGIN
UPDATE sales SET ctno = v_ctno, hk_er = v_hk_er, us_er = v_us_er WHERE ctid = v_ctid; IF SQL%NOTFOUND THEN
--先插入记录,各个字段均为默认值
INSERT INTO sales(ctid) VALUES (test_seq.NEXTVAL) RETURNING ctid INTO vp_ctid;
--再更新记录,如果传入的变量不为0则更新为传入的变量值,否则不变,仍为默认
UPDATE sales
SET ctno = decode(v_ctno, 0,ctno , v_ctno),
hk_er = decode(v_hk_er,0, hk_er, v_hk_er),
us_er = decode(v_us_er, 0, us_er, v_us_er)
WHERE ctid = vp_ctid;
END IF; COMMIT;
END sales_insert2;
我差点把楼主误导了,多亏了duanzilin(寻),:)