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
但是我檢測絕對沒有少。不知道是什么地方出錯,還是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 || ''''
讓我可忙活了半天,我運行的時候,不是這樣報錯,他出現在錯誤去在該游標的上面几行,說一個定義錯誤,但是這明明是正確的。沒法,我只得新建一個文件,一行一行的去試,才把這個問題找出來。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值