討論區快速選單
知識庫快速選單
程式設計俱樂部Facebook粉絲團 網路投保旅行平安險 討論區最近新進100則主題
[ 回上頁 ] [ 討論區發言規則 ]
如何實作 Stored Procedure?
更改我的閱讀文章字型大小
作者 : adonisbert(adonisbert) 人氣指數超過10000點
[ 貼文 97 | 人氣 15666 | 評價 10 | 評價/貼文 0.1 | 送出評價 33 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/1/17 下午 06:46:43
各位前輩
可否舉例說明如何使用 Informix 來寫 Stored Procedure?AP 端又該如何來呼叫?Server端又該如何來驗証呢?
謝謝。
作者 : foris(Foris)
[ 貼文 28 | 人氣 7712 | 評價 250 | 評價/貼文 8.93 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人adonisbert註記此篇回應為很有道理 2005/1/17 下午 08:40:38
底下是一個 example

create stock table 可 run

dbaccessdemo7 stores;
---------------------------------------------------------------------------------
CREATE PROCEDURE raise_prices (per_cent INT)
UPDATE stock --increase by percentage
SET unit_price = unit_price +
(unit_price * (per_cent / 100));
END PROCEDURE

-------------------------------------------------------------------------------
SELECT unit_price FROM stock
WHERE manu_code = "HRO";

EXECUTE PROCEDURE raise_prices(5); # 商品單價調高 5/100

SELECT unit_price FROM stock
WHERE manu_code = "HRO";


Foris


作者 : adonisbert(adonisbert) 人氣指數超過10000點
[ 貼文 97 | 人氣 15666 | 評價 10 | 評價/貼文 0.1 | 送出評價 33 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/1/18 上午 10:11:10
謝謝 Foris 的熱心回應,讓我對其有一些基本的概念了 ..

如果我想要編一個不重覆的序號 .. 以年月+流水號 該如何實作呢?

該如何得到系統的日期呢?有無相關函數可用?

序號格式為 -- 0501xxxx (0501表 2005年的一月份)

謝謝。
作者 : foris(Foris)
[ 貼文 28 | 人氣 7712 | 評價 250 | 評價/貼文 8.93 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人adonisbert註記此篇回應為最佳解答 2005/1/19 上午 01:15:22
下列這個範列, 寫的稍為有點亂(好久沒寫 SPL了), 不知道能不能符合您的需求?
這些程式碼我在 ids 9.x 測過沒問題.


create table t1 (c1 char(8));
insert into t1 values("05010001");

create procedure get_serial() returning char(8);

  define p1 char(8);
  define p2 char(4);
  define p3 char(4);
  define p4 char(8);
    
  select max(c1) into p1 from t1
    where c1[1,4] = substring(to_char(current,'%Y%m') from 3 for 4); --抓出table t1 今年這月的最大單號
  
  let p2 = round(p1[5,8] + 1); -- 讓 p2 = 後四碼加上1
 
  let p3=lpad(p1[1,4],4,'0'); --年月
  
  if p2 >=1000 then
  
     let p4 = p3 || lpad(p2,4,'0') ;

   elif p2 >=100 then
     let p4 = p3 || "0" || lpad(p2,4,'0');
 
   elif p2 >=10 then
     let p4 = p3 || "00" || lpad(p2,4,'0');

   elif p2 > 0 then
     let p4=p3 || "000" || lpad(p2,4,'0') ;
   end if

   insert into t1 values(p4);

   return p4;

end procedure

execute procedure get_serial();


Foris
作者 : adonisbert(adonisbert) 人氣指數超過10000點
[ 貼文 97 | 人氣 15666 | 評價 10 | 評價/貼文 0.1 | 送出評價 33 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/1/20 上午 08:18:38
Foris 謝謝您熱心的回應 .. 再請教

Create Procedure ProcedureName 不需要提供 Owner 嗎?也就是 Create Procedure [Owner.]ProcedureName 那在不提供Owner的情況下 .. 是否代表所有的 Account 皆可呼叫該 Stored Procedure 來使用?

另外我在相關文件上看到 Create DBA Procedure .. 這裡的 DBA 是否是指所要 Create 的 Procedure 是在哪一個資料庫底下?若不指定是否會有什麼影響?

謝謝。
作者 : foris(Foris)
[ 貼文 28 | 人氣 7712 | 評價 250 | 評價/貼文 8.93 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人adonisbert註記此篇回應為最佳解答 2005/1/21 上午 12:28:16
1. default可不必指定 owner , 誰create的procedure, 那人便是 owner,
   ex: adonisbert (沒有dba權限), 他可以下 create procedure adonisbert.procname(),
     or create procedure procname()
     但不能下 create procedure informix.procname().
     若你是擁有該DB的 dba 權限才能指定非自己的owner.
    

2. 當 foris create 了一個 procedure , default 系統會把prodecur執行權限e給所有人

   grant execute on "foris".raise_prices to "public" as "foris";

   若foris不讓別的user執行,可下 revoke 指令
   revoke execute on "foris".raise_prices from "public" ;

3. create dba procedure 只有擁有 dba 權限的人才能建立,
   而且 default 不會 grant execute.

希望我的回答對您有所幫助.

Foris
作者 : adonisbert(adonisbert) 人氣指數超過10000點
[ 貼文 97 | 人氣 15666 | 評價 10 | 評價/貼文 0.1 | 送出評價 33 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/1/21 上午 08:06:33
Foris

謝謝您熱心的參與回應,讓我裨益良多 .. 您真的是太強了 ..

就您所提供的 Procedure 寫法是否也可適用於 7.X for Unix 的版本呢?

謝謝。
作者 : foris(Foris)
[ 貼文 28 | 人氣 7712 | 評價 250 | 評價/貼文 8.93 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人adonisbert註記此篇回應為很有道理 2005/1/22 上午 12:24:40
這個範例, 我分別在 ids.7.31.UD5 & ids.9.40.UC3 測過都沒問題.
語法都很標準, 適用於 7.x & 9.x 的各個版本, 不管是 Unix , Linux or Windows. 如果您在那一個ids 版本or 任何平台像 AIX, HP, Linux,windows 等有發現任何問題, 歡迎您告知我.

Foris
作者 : adonisbert(adonisbert) 人氣指數超過10000點
[ 貼文 97 | 人氣 15666 | 評價 10 | 評價/貼文 0.1 | 送出評價 33 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/1/22 上午 10:08:31
Foris 謝謝您熱心的回應 .. 再請教

在 SPL 的語法判斷式上是否支援多重的巢狀判斷式 .. 例如

if XXX='123' then
  -- Other I
  if YYY='456' then
  let ZZ='';
  elif YYY='789'
  let ZZ='00';
  else
  let ZZ='12';
  end if
  -- Other II
  if WWW='555' then
    if EEE='666' then -- Other II-1
    let TT='444';
    else
    let LL='333';
    end if
  end if

end if
作者 : adonisbert(adonisbert) 人氣指數超過10000點
[ 貼文 97 | 人氣 15666 | 評價 10 | 評價/貼文 0.1 | 送出評價 33 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/1/22 下午 06:40:17
再請教 ..

如何轉換不同的型別 -- 例如 Char & decimal or Integer 之間的互換?
作者 : foris(Foris)
[ 貼文 28 | 人氣 7712 | 評價 250 | 評價/貼文 8.93 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人adonisbert註記此篇回應為最佳解答 2005/1/23 上午 01:05:42
1. Informix SPL support 巢狀迴圈
    ex:
     create procedure nest() returning char(4);

   define p1 char(4);
   define p2 integer;
   define p3 char(4);

   let p1 = "1234";
   let p2 = 5678;
   let p3 = 4321;

   if p1 = "1234" then
     if p2 = 5678 then # 巢狀迴圈
     return p1;
     end if
   end if

   return p3;

end procedure

---------------------------------------------------

變數型態的轉換問題

可不需 function 便可直接轉換

例如:
  define p1 char(4);
  define p2 integer;

   let p1 = "1234";
   let p2 = p1 ; #p1和p2變數型態不同但可以直接用let 指令convert


  ex:
   create procedure type_convert() returning char(4),int;

   define p1 char(4);
   define p2 integer;
   define p3 decimal(4,0);

   let p1 = "1111";
   let p2 = 2222;
   let p3 = 3333;

   let p1 = p2;
   let p2 = p3;

   return p1,p2;

end procedure



Foris









作者 : adonisbert(adonisbert) 人氣指數超過10000點
[ 貼文 97 | 人氣 15666 | 評價 10 | 評價/貼文 0.1 | 送出評價 33 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/1/23 下午 04:30:49
Foris 再次謝謝您熱心的回應 .. 再次請教最後兩個疑問 ..

1. 在需要回傳 Stored Procedure 處理完的結果時 .. 會使用 Return 的方式來回傳結果值 .. 而 Returning & Returns 有何不同呢?

2. execute procedure procedure_name(param1, parma2 ..); 這是直接在 Server 執行該命令,所得之結果亦會立即呈現。若今天透過程式來呼叫該 SP 又該如何取得其 Return 的值,而其透過程式所呼叫該 SP 時,所給參數值名稱是否需要和在 SP 上所定義的 param1, param2 相同呢?但因 Return 的變數名稱為其內部所定義時,於程式呼叫端又該如何對應呢?(AP 端是以 Delphi 開發)

謝謝 ..
作者 : foris(Foris)
[ 貼文 28 | 人氣 7712 | 評價 250 | 評價/貼文 8.93 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人adonisbert註記此篇回應為很有道理 2005/1/23 下午 11:35:24
1.
 return & returns 就作用上是沒什麼差別的

2.

stock的sample 可 run dbaccessdemo7 stores -log

底下這個範例執行 procedure 要帶二個值 stock_num, and manu_code ,會回傳該商品貨別號的單價

CREATE PROCEDURE get_price(p_stock_num smallint,p_manu_code char(3))
 returning money;
   
   define rtn_price money(6,2);
   
   select unit_price into rtn_price from stock
     where stock_num = p_stock_num and manu_code = p_manu_code;
   
   return rtn_price;

END PROCEDURE


-----------------------------------------------------------------------

由於我並沒有 delphi 的環境, 本身對 delphi 也不擅長, 所以我用 4gl 的程式說明這個關念,我想這在 odbc 的寫法應該也大同小異

database stores
main

  define p_unit_price money(6,2)
  define prepvar char(100)

  let prepvar = "execute procedure get_price(1,'HRO');" # you will get $270.53
  prepare get_prc from prepvar
  execute get_prc into p_unit_price # the returned value will be put on p_unit_price

  display p_unit_price

end main

----------------------------------------------------------------------
希望我的回答能對您有所幫助

Foris


作者 : adonisbert(adonisbert) 人氣指數超過10000點
[ 貼文 97 | 人氣 15666 | 評價 10 | 評價/貼文 0.1 | 送出評價 33 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/1/24 上午 09:46:10
Foris

嗯 .. 我的意思是說 ~~ 如果是一般的開發工具(例如:delphi, c, php, powerbuilder, vb ..)用來呼叫自行所制定的 SP 時,該如何得知其 Return 的參數(變數)為何呢?像 MS-SQL 在制定其 SP 時,於參數定義的同時就先指定其為 Input or Output .. 但在 Informix 中的定義變數只指定其為何資料型別 ..

而且我們在制定 Return 時只是 Returning char(10) or Return INT .. 而已 .. 只是規範其Return 時的資料型態為何,並沒有指定為何參數,那 AP 呼叫端該如何得知應用什麼參數來接其執行完成時的回傳結果呢?

謝謝。
作者 : yuanlai(lai)
[ 貼文 59 | 人氣 4058 | 評價 500 | 評價/貼文 8.47 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/1/28 下午 04:43:12
//BCB 範例
AnisString xStr("");
Query1->Close();
Query1->SQL->Add("....");
     .
     .
Query1->Open();
xStr = Query1->FieldByName("fieldname")->AsString;
作者 : yuanlai(lai)
[ 貼文 59 | 人氣 4058 | 評價 500 | 評價/貼文 8.47 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/1/28 下午 04:54:35
另一個問題,可否請教 Foris 兄

IDS 安裝於 WIN 2000環境上 ,其OLE DB(ifxoledbc.dll) 需要注意哪些 CONFIG 設定,或使用者權限設定,(ASP)才能正確的連上資料庫,這問題已經困擾了我很久,
希望 Foris 不吝情賜教。
作者 : gkang(kk) Informix優秀好手貼文超過200則
[ 貼文 264 | 人氣 514 | 評價 1340 | 評價/貼文 5.08 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2005/1/28 下午 10:14:12

asp 的環境是以 iis 來啟動的, 要先測試 iis 所使用的環境變數是否可以連到 database server, 再測 ASP,
作者 : besang(bs)
[ 貼文 46 | 人氣 5361 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/9/22 上午 10:36:57
請問高手我寫以下4gl以下
define sp_custno char(10),
     p_prepvar char(100)
     let p_prepvar = "execute procedure QualifyCust_sp('2100912109','f',0);"
     prepare get_prc2 from p_prepvar
     execute get_prc2 using sp_custno
     ### execute get_prc2 into sp_custno <-- 編譯就已經錯誤

ps:回傳一個值 是char(10)
編譯OK
但是執行 出現
Program stopped at "test.4gl", line number 112.
SQL statement error number -201.
A syntax error has occurred.

我又再 asp 或 vb 都可以 , 但是4gl 不行,跟4gl板本有關係馬?
 板主 : 徵求中
 > 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.09375