討論區快速選單
知識庫快速選單
網路投保旅行平安險 網路投保旅行平安險
[ 回上頁 ] [ 討論區發言規則 ]
請問store procedure的字串問題?.
更改我的閱讀文章字型大小
作者 : yangxinde(ymca)
[ 貼文 13 | 人氣 2447 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/10 下午 05:01:52
各位db高手好
請問要怎麼在store procedure中執行用字串組起來的sql命令,
我要建立以下procedure時都會說我的"execute asql;"這行有錯
請問有沒有人可以指導一下,非常感謝

CREATE PROCEDURE test_datadelete(myserial varchar(100) )

RETURNING varchar(100);
DEFINE i_rid,lh int;
DEFINE getserial varchar(100);
define asql varchar(100);

LET lh=LENGTH (myserial);
LET getserial=SUBSTR (myserial,1,lh-1);
LET i_rid=1;
let asql="DELETE FROM test WHERE serial in("|| myserial||")";
execute asql;

RETURN asql;
END PROCEDURE
作者 : gkang(kk) Informix優秀好手貼文超過200則
[ 貼文 264 | 人氣 514 | 評價 1340 | 評價/貼文 5.08 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/10 下午 05:44:47
FYI:

MySQL Forums :: Informix :: Re: Using dynamic SQL in Informix's stored procedure
http://forums.mysql.com/read.php?64,548,643
作者 : yangxinde(ymca)
[ 貼文 13 | 人氣 2447 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/10 下午 07:12:10
感謝kk高手提供的解決方案
但我不懂的是,一定要做
FETCH s1 INTO somecol;
RETURN somecol WITH RESUME;
END FOREACH
這一段嗎?
我想說有沒有方法可以像sql server一樣可以在store procedure
中直接執行那段串起來的命令
在sql server中是 set @temp="xxxx"+變數+"xxx"
exec @temp
就可以在一個store procedure中執行完了
我想說有沒有什麼方式也可以做到這樣,在串完所要的命令字串後,直接下個什麼指令
去執行那個串好的字串???
不知道有沒有人知道?
但還是非常感謝kk高手所提供的方式............

作者 : gkang(kk) Informix優秀好手貼文超過200則
[ 貼文 264 | 人氣 514 | 評價 1340 | 評價/貼文 5.08 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/11 上午 09:03:15
informix 的 spl 限制很多, sql 來自 sybase, sybase 的 store procedure 可以說是很好的程式語言
作者 : gkang(kk) Informix優秀好手貼文超過200則
[ 貼文 264 | 人氣 514 | 評價 1340 | 評價/貼文 5.08 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/11 上午 10:08:03
更正: sorry. 少了些東西

informix 的 spl 限制很多, sql server 的spl來自 sybase, sybase 的 store procedure 可以說是很好的程式語言
作者 : yangxinde(ymca)
[ 貼文 13 | 人氣 2447 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/11 下午 05:08:15
嗯!那這樣問好了
請問各位db高手,我本來是以為只需要簡單的下個
delete from table2 where col1 in(getserial);
不用去搞到什麼prepare

但結果是可以建立,也可以run,但是卻沒有執行這行指令
也就是說他正常的跑完了,但資料卻沒有刪除,有人有試用在store procedure中用in的語法去做select ,update,delete的方式成功過的嗎?
一直卡在這...
作者 : hedge(hedge)
[ 貼文 127 | 人氣 2031 | 評價 290 | 評價/貼文 2.28 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/11 下午 06:13:08
可不可以請問一下

return asql 你接到的字串是什麼呢?!

作者 : gkang(kk) Informix優秀好手貼文超過200則
[ 貼文 264 | 人氣 514 | 評價 1340 | 評價/貼文 5.08 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/11 下午 06:13:52
要不要先試一下
delete from table2 where col1 in(1,2,3,4) ; ( or select, update )在 procedure 中可不可以 work,再測 dynamic SQL,
SQL和dynamic SQL 會不一樣, SPL 也多了些限制


若是要 "getserial" 不知以下的二個 function 是否有幫助
DBINFO ('serial8' option)
Returns the most recently inserted SERIAL8 value

DBINFO ('sqlca.sqlerrd1'option)
Returns the last serial value inserted in a table
作者 : yangxinde(ymca)
[ 貼文 13 | 人氣 2447 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/11 下午 09:42:05
回應hedge高手
我return asql 是為了檢視看我組起來的字串結果為何
看是否是DELETE FROM test WHERE serial in(xx,xx,xx);
那個xx,xx,xx就是我傳進來的變數
我測試的結果是沒錯的就像是在dbaccess中直接下
DELETE FROM test WHERE serial in(xx,xx,xx)
一樣,但在store procedure中卻是不會執行..
作者 : yangxinde(ymca)
[ 貼文 13 | 人氣 2447 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/11 下午 09:49:21
回應 kk 高手
我有試過你說的方法,直接在store procedure寫死
delete from table2 where col1 in(1,2,3,4),執行的結果是可以的
但不知道為何加入個字串變數後,他就不會run了....奇怪..
另外..您提供的二個function,哈~~抱歉,我是個informix新手,看不懂 kk高手寫的是什麼意思,但,還是非常感謝您的熱心幫忙
作者 : gkang(kk) Informix優秀好手貼文超過200則
[ 貼文 264 | 人氣 514 | 評價 1340 | 評價/貼文 5.08 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/11 下午 10:26:33


看來你只傳一個 string 進來
試試看 delete from table2 where col1= var
delete from table where col in ( var ),
而不要用 exec sql

>另外..您提供的二個function,
就忘了吧 !!
作者 : wenliyan(wenli)
[ 貼文 49 | 人氣 5 | 評價 230 | 評價/貼文 4.69 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人yangxinde註記此篇回應為很有道理 2005/3/13 下午 03:40:54
我也進來插花一下
因為你傳進來的是一個變數 str = "xx,xx,xx"
delete from table1 where id in (str) 時
它不會自動轉成
delete from table1 where id in (xx,xx,xx,xx)
而是
delete from table1 where in ("xx,xx,xx,xx")
所以
你必須先將變數的各個數值單獨取出
let str1 = str[1,2]
let str2 = str[3,4]
......
delete from table1 where id in (str1,str2,....)
就能成功
至於如何將各個變數分開取出 要看你的字串組合原則
不知到有沒有回答到你的問題
作者 : yangxinde(ymca)
[ 貼文 13 | 人氣 2447 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/13 下午 05:56:37
感謝 wenli高手的回應
嗯!原來是這樣子
那.再請教一下...informix的strore procedure的字串切割,是要下什麼指令呢?
我所傳進來的字串格式是 "12,13,43,51",像這樣的數字,然後以逗號隔開
那有什麼指令是可以依照逗號去切割的呢?
是否要用什麼freach的方式把傳進來的值切割後,以迴圈的方式去刪除??
作者 : wenliyan(wenli)
[ 貼文 49 | 人氣 5 | 評價 230 | 評價/貼文 4.69 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人yangxinde註記此篇回應為很有道理 2005/3/14 上午 09:56:44
CREATE PROCEDURE test(p_item char(22),p_no decimal(3,0))
DEFINE p_count,p_count1 int;
DEFINE p_number1 int;
DEFINE p_str char(2) ;
SET DEBUG FILE TO "/tmp/test.trace";
TRACE "begin trace";
TRACE ON;
for p_count = 1 to p_no
  let p_count1 = p_count*3;
  let p_number1 = p_count1 -2 ;
  let p_str = substr(p_item,p_number1,2);

end for
TRACE OFF;
return ;
END PROCEDURE;

執行語法 execute procedure test ("12,34,56,78",4)

作者 : yangxinde(ymca)
[ 貼文 13 | 人氣 2447 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/14 下午 12:40:08
非常感謝wenli的sample教學

不好意思...可否再請教,若是我傳入的字串是不規則的長串,有什麼方法可以抓的到嗎?
ex我傳的是 "1,32,150,539,32,1021,9"
這樣的話,substr就無法去判別了
有什麼函數可以去切割組合的嗎?

作者 : wenliyan(wenli)
[ 貼文 49 | 人氣 5 | 評價 230 | 評價/貼文 4.69 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/14 下午 01:26:11
CREATE PROCEDURE test(p_item char(22))
DEFINE p_count,p_count2,p_start,p_len int;
DEFINE p_str char(2) ;
let p_len = length(p_item);
let p_start = 1 ;
let p_count2 = 0 ;
for p_count = 1 to p_len
  let p_str = substr(p_item,p_count,1);
  if p_str = ',' then
     let p_str = substr(p_item,p_start,p_count2);
     ----- sql command
     let p_start = p_start + p_count2 + 1 ;
     let p_count2 = 0;
  else
     let p_count2 = p_count2 + 1 ;
  end if
end for
if p_count2 > 0 then
     let p_str = substr(p_item,p_start,p_count2);
     ------ sql command
end if
return ;
END PROCEDURE;
作者 : yangxinde(ymca)
[ 貼文 13 | 人氣 2447 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/14 下午 02:08:49
非常感謝wenli高手的幫助
我試用了您的procedure,但奇怪的還是不會動
我執行了 execute procedure test('2,32,102')
只是我在你程式的註解 ---------sql command
的地方換成了
if p_count2 > 0 then
     let p_str = substr(p_item,p_start,p_count2);
    DELETE FROM table2 WHERE col1 in ( p_str); <-------這裡
end if

結果是一筆都沒刪掉
嗯!可否請教問另一問題,在informix 的store procedure中真的沒有像sql server的strore procedure
可以直接以組字串的方式去執行命令嗎?
ex :
CREATE PROCEDURE table2_delete(p_item varchar(100))
let aa="DELETE FROM table2 WHERE col1 in(" || p_item || ")";
exec aa;
end procedure

我知道那行exec aa;會錯,只是我想問的是informix有沒有辦法可以用組字串的方式去執行
exec aa 還是 execute aa還是 exec sql aa還是....別種指令?有這種的嗎?


作者 : wenliyan(wenli)
[ 貼文 49 | 人氣 5 | 評價 230 | 評價/貼文 4.69 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/3/14 下午 02:22:18
informix SPL 好像沒有提供 prepare

所以 無法去動態組合 sql string

至於上一段 procedure 我測試是 ok的

請你使用 debug 的方式 display 出來所有的資料
就可以一步一步檢查 有無錯誤
或是其他問題
 板主 : 徵求中
 > Informix 資料庫 - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Informix 資料庫 - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Informix 資料庫
1 kk 1340 
2 哈囉齒齒 430 
3 hedge 290 
4 Chelonia Mydas 250 
5 Foris 250 
6 wenli 200 
7 old cat 160 
8 大頭 140 
9 chyang 100 
10 sansui 90 
Informix 資料庫
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.078125