① 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;