ORACLE
使用中的常见、实用的问题
摘要:这是原来用
ORACLE
的过程中记录下的一些问题,现在翻出来看看,还比较实用,如果以后再次遇到这样的问题的时候,就不用东找西找资料了。
里面包括字段同步问题,单引号问题, EXECUTE IMMEDIATE的使用問題,replace使用問題,數據庫中字段為字符型時生成SQL語句的問題
。
1、
同步表记录问题
有两张表
t1,t2,
有一个相同的字段
,passwd,
我想在更新
t1
表的
passwd
字段时同时更新
t2
的
passwd
字段
,
让他们保存一致
,
同样
,
在更新
t2
的
passwd
的时候同时更新
t1
的
passwd.
我分别做了两个触发器
.
单独对于某张表是可以的
.
但是同时启用两个触发器就会产生变异
.
我想也对
.
这样不就是死循环了吗
?
请问怎样实现这样的功能
.
让两个字段保持一致。
解決
:
没用解决
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
有心得,就用下面這種方式把問題解決了:
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:44PLS-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
||
''''
讓我可忙活了半天,我運行的時候,不是這樣報錯,他出現在錯誤去在該游標的上面几行,說一個定義錯誤,但是這明明是正確的。沒法,我只得新建一個文件,一行一行的去試,才把這個問題找出來。