ORACLE使用中的常見、實用的問題

摘要:這是原來用ORACLE的過程中記錄下的一些問題,現在翻出來看看,還比較實用,如果以後再次遇到這樣的問題的時候,就不用東找西找資料了。
裏面包括字段同步問題,單引號問題, EXECUTE IMMEDIATE的使用問題,replace使用問題,數據庫中字段為字符型時生成SQL語句的問題
1、 同步表記錄問題
有兩張表t1,t2,有一個相同的字段,passwd,我想在更新t1表的passwd字段時同時更新t2passwd字段,讓他們保存一致,同樣,在更新t2passwd的時候同時更新t1passwd.我分別做了兩個觸發器.單獨對於某張表是可以的.但是同時啓用兩個觸發器就會產生變異.
我想也對.這樣不就是死循環了嗎?請問怎樣實現這樣的功能.讓兩個字段保持一致。
解決:沒用解決
2單引號問題:
這條語句select * from prd_flow_bak where cno='FT0302';可以工作正常。
這條語句select * from prd_flow_bak where cno=FT0302;工作不正常。
但是我的過程中又需要動態生成SQL語句,如
sql1:='select * from prd_flow_bak where cno='||thcur.cno;只能得到工作不正常的語句。
注:thcur.cno為用cursor取得的字段名。
這裏我試了是不能夠這麼寫的:
sql1:='select * from prd_flow_bak where cno=''||thcur.cno||''';
它不像在JAVA程序中,在JAVA程序中就好辦,因為它是以雙引號為包含。
請問這裏怎麼寫纔能夠得到上面可以正常工作的語句
 
解決:
sql1:='select * from prd_flow_bak where cno='||''''||thcur.cno||'''';
 
3、 EXECUTE IMMEDIATE的使用問題
這是一條根據條件動態生成的SQL語句(無錯):
insertSQL:='insert into Customer2To3_M values(';
insertSQL:=insertSQL||''''||currentCNO||''''||',';
insertSQL:=insertSQL||to_date(to_char(dateIntBegin),'YYYYMMDD')||',';
insertSQL:=insertSQL||''''||''''||','||avgSalaryOfThisDay;
insertSQL:=insertSQL||','||''''||to_char(to_date(to_char(dateIntBegin),'YYYYMMDD'),'Day')||''''||')';
使用下面的這樣執行會出錯:
execute immediate insertSQL;
報錯:
ORA-00917: missing comma
但是我檢測絕對沒有少。不知道是什麼地方出錯,還是DML語句不可以這樣使用。但是從不少資料看都可以這樣使用的,後來實在沒法,到CSDN上一搜,在這裏找到一篇文章: http://blog.csdn.net/zhujjcn/archive/2005/02/04/280749.aspx
有心得,就用下面這種方式把問題解決了:
execute immediate 'insert into Customer2To3_M values(:1,:2,:3,:4,:5)'
using currentCNO,to_date(to_char(dateInt),'YYYYMMDD'),totalORDNO,avgSalaryOfThisDay,to_char(to_date(to_char(dateInt),'YYYYMMDD'),'Day');
注: 根據我的理解,其中的數字表示的是字段的該中的位置。
 
4、 replace使用問題
我在匿名塊中這樣使用:
replace(insertSQL,'kkk','ttt');
可是去給我報以這樣的錯誤
8:51:44 PLS-00221: 'REPLACE' is not a procedure or is undefined
明明是有這個函數為什麼會出現這種情況呢,真的讓我頭痛。
我試了一下這樣:
insertSQL:=replace(insertSQL,'kkk','ttt');
正常運行,呵呵。
 
5、數據庫中字段為字符型時生成SQL語句的問題
在任何一種高級語言中,如果要操作表中字段是字符型的,那麼就一定要在該字兩邊加上單引號,這一點也是我們很多人都會去注意的。所以,給了我一種心理,就是在所有的操作字符類型的時候都要加上單引號。
但是在ORACLE的遊標中就不用(肯定還有其它的情況,我沒有遇上)
如下面這個復雜的遊標:
cursor c1(startDateOfThisMonth in varchar2,endDateOfThisMonth in varchar2,nowDateOfThisMonth in varchar2,paraCNO in varchar2)
is
select ordno,pro_fr,pro_to,QTY,CNO from prd_flow_bak
where pro_fr>=to_date(startDateOfThisMonth,'YYYYMMDD')
and pro_to<to_date(endDateOfThisMonth,'YYYYMMDD')
and cno=paraCNO    --就是這裏,在表中為字符型
and (to_date(nowDateOfThisMonth,'YYYYMMDD') between pro_fr and pro_to);
剛開始的時候,我把這裏寫成這樣:
and cno=''''||paraCNO||''''
讓我可忙活了半天,我運行的時候,不是這樣報錯,他出現在錯誤去在該遊標的上面幾行,說一個定義錯誤,但是這明明是正確的。沒法,我只得新建一個文件,一行一行的去試,才把這個問題找出來。
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章