① ORACLE存储过程同步表数据出现重复,存储过程如下
你这个不仅仅是重复,而且是大量重复吧。
你的游标那里设定的是一个集合,也就是select form_id as formid from cc_busi_form。
我们假设他有三个值,0,1,2
那么在下面循环时(for i in formid loop),我们假设每次读取一个值,第一次读取0,那么后面的语句就变为
insert into cc_busi_form select form.*,'hx' from cc_busi_form@LINK_HX form where form.form_id<>0
也就是说form.form_id=1或2是插入的。
第二次i.formid=1,那么form.form_id=0或2是插入的,这时form.form_id=2这部分就重复了。
第三次i.formid=2,那么form.form_id=0或1是插入的,这时form.form_id=0和1这两部分就都重复了。也就是说你插入的数据是原来数据的二倍的量。
你的formid越多,重复的量也就越大,大概是(formid的个数-1)倍(如果每个formid都不同,那么就是它,如果有重复,那么会有一定出入)。
其实没必要用游标,直接用子查询就行 not in 或者not exsit,当然,我不知道你的业务逻辑,具体的还要你自己看。
② oracle 同名(PULBIC SYNONYM)知道的大侠进来帮帮小女子呢!
select OWNER, OBJECT_ID,object_name, OBJECT_TYPE, LAST_DDL_TIME
from all_objects
where object_name = 'SP的名字';
看看是否有重名的对象,调用的时候最好指定用户,rcotrpr1.SP的名字,这样写
③ oracle怎样存储文件,能存储哪些文件
默认情况下
数据文件 *.dbf
控制文件 *.ctl
日志文件 *.log
参数文件 *.ora
跟踪文件 *.trc
警告文件 *.log
exp文件 *.dmp
④ oracle数据库如何存储数据
利用逻辑数据库 和物理数据库 来存储 其中 逻辑数据库主要包括表 ,段,区,oracle数据块。物理数据块 包括 数据文件,联机重做日志文件等
⑤ 同名的oracle数据库名
tnsnames.ora当中通过host、listener端口号和sid来区分。
如果是简单连接的话 则是
sqlplus scott/[email protected]:1521/orcl
sqlplus scott/[email protected]:1521/orcl
⑥ 关于Oracle的存储过程
1.基本结构
CREATE OR REPLACE PROCEDURE 存储过程名字
(
参数1 IN NUMBER,
参数2 IN NUMBER
) IS
变量1 INTEGER :=0;
变量2 DATE;
BEGIN
END 存储过程名字
2.SELECT INTO STATEMENT
将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
例子:
BEGIN
SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;
EXCEPTION
WHEN NO_DATA_FOUND THEN
xxxx;
END;
...
3.IF 判断
IF V_TEST=1 THEN
BEGIN
do something
END;
END IF;
4.while 循环
WHILE V_TEST=1 LOOP
BEGIN
XXXX
END;
END LOOP;
5.变量赋值
V_TEST := 123;
6.用for in 使用cursor
...
IS
CURSOR cur IS SELECT * FROM xxx;
BEGIN
FOR cur_result in cur LOOP
BEGIN
V_SUM :=cur_result.列名1+cur_result.列名2
END;
END LOOP;
END;
7.带参数的cursor
CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;
OPEN C_USER(变量值);
LOOP
FETCH C_USER INTO V_NAME;
EXIT FETCH C_USER%NOTFOUND;
do something
END LOOP;
CLOSE C_USER;
⑦ 创建oracle 过程时提示 名称已由现有对象使用
这种情况是因为数据库中已经存在同名的存储过程或者其他对象(object)等造成。
解决方法:
1、确定原有名称的存储过程是否有用,如果有用,可为自己的新存储过程重新定义名称。
2、如果确定原有的存储过程无用,在创建新的同名存储过程时可用create or replace 来解决。
如,目前数据库中存在一个叫P_TEST的存储过程,如果确定无用,执行时可按如下方法:
⑧ oracle的存储过称
procere salrem_insert_03
(
ps_wlbh in varchar2,
ps_sjsl in varchar2
)is
pwlbh varchar2(200);
owlbh varchar2(200);
osjsl varchar2(200);
psjsl varchar2(200);
i number;
begin
i:=0;
owlbh:=ps_wlbh;
osjsl:=ps_sjsl;
loop
i:=instr(owlbh,',');
if i=0 then
exit;
pwlbh:=substr(owlbh,1,'i:-1');
owlbh:=substr(owlbh,'i:');
i:=instr(osjsl,',');
psjsl:=substr(osjsl,1,'i:-1');
osjsl:=substr(osjsl,'i:');
update sald003 set sjsl=psjsl where wlbh=pwlbh;
-- 加了提交的操作,和退出循环的操作.
commit;
break;
end if;
end loop;
end salrem_insert_03;