Skip to main content

不專業。Delphi5 x Oracle Stored Procedure

這次遇到Delphi要使用Oracle Stored Procedure的案例
需要Procedure輸出多個參數

上網GOOGLE各方及參考後,稍微記錄一下用法
先附上參考連結跟參考內容,如有侵犯到智財或版權的地方或問題,請告知,會立刻拿掉參考內容哦
最後則是實際撰寫的範例

這邊用的方法是透過TStoredProc元件


[Delphi使用TStoredProc的步驟]
參考來源:https://www.cyut.edu.tw/~rcchen/courses/delphi/html/topic/topic10/topic10.html
參考重點及內容:
❗放置TstoredProc元件到Form上。
❗設定屬性DatabaseName來決定要連結的資料庫。
❗從屬性StoredProcName中挑選出要使用的Stored Procedure的名稱。
❗使用TstoredProc的方法ExecProc即可執行該Stored Procedure。

❗傳參數的方法:共有三種
  ➠design time時設定屬性params。
  ➠runtime時指定其相對應的參數:SroredProc1.Params[0].AsString:=Edit1.Text;
  ➠runtime時以對照名稱的方式指定:SroredProc1.ParamByName(‘Custno’).AsString := Edit1.Text;
 
❗使用prepare增加執行速度:如果使用次數超過一次
  ➠StoredProc1.Params[0].AsString := Edit1.text;
  ➠StoredProc1.Prepare;
  ➠StoredProc1.ExecProc;


[Stored Procedure寫法]
這邊參考到了兩個網址
參考一:https://matthung0807.blogspot.com/2017/08/oracle-stored-procedures.html
參考重點 
❗了解Stored Procedure基本架構語法。
參考內容:
CREATE OR REPLACE PROCEDURE MY_PROCEDURE2
(param1 VARCHAR2,
 param2 VARCHAR2,
 param3 NUMBER
)
IS
BEGIN
  DBMS_OUTPUT.put_line (param1);
  DBMS_OUTPUT.put_line (param2);
  DBMS_OUTPUT.put_line (param3);
END MY_PROCEDURE2;

定義Procedure參數時必須給定參數名稱,資料型態,而Mode和預設值則是選擇性的。
在此範例中參數僅定義名稱及資料型態,MODE及預設值皆空白。MODE若為空白的話則預設為IN。另外建立PROCEDURE時參數的資料型態不用指明長度。
由於這個Procedure有參數,所以執行時要帶入參數,例如
EXEC MY_PROCEDURE2('hello', 'world', 999);


參考二:http://limitedcode.blogspot.com/2014/08/plsql-procedure-function.html
參考重點:
❗了解Stored Procedure基本架構語法 及 參數的存取層級 →因為我需要輸出多個結果。
參考內容:
Procedure程式語法架構:
CREATE OR REPLACE PROCEDURE procedure_name
(       --參數宣告區
        parameter1 MODE DATATYPE [DEFAULT expression],
        parameter2 MODE DATATYPE [DEFAULT expression],
        ...
)
IS
[       --local變數宣告區
        variable1 DATATYPE;
        variable2 DATATYPE;
]
BEGIN
        statements
END;

在上面語法架構中有幾點需要注意:
MODE:
MODE為參數的存取層級,有IN,OUT, IN OUT三種;IN的參數代表Read Only,該參數值只能讀取,任何有修改的動作會發生錯誤;OUT參數代表Write Only,該參數在傳入時不能有初始化動作,在Procedure內才進行初始化與給值;IN OUT參數則擁有IN參數與OUT參數的特性


[以下為實際執行的範例]
🔺執行步驟:
  ➠在DataAccess的頁籤上找到TstoredProc元件,放置到Form上。
  ➠設定屬性DatabaseName來決定要連結的資料庫。
  ➠從屬性StoredProcName中挑選出要使用的Stored Procedure的名稱(例如下面的範例為text_PROCEDUREname )。

🔺Delphi程式碼:
  Form1.StoredProc1.ParamByName('A').AsString := 'Hello';
  Form1.StoredProc1.ParamByName('B') :=Edit2.Text;
  Form1.StoredProc1.ParamByName('C') := Edit3.Text;t;
  Form1.StoredProc1.Prepare;
  Form1.StoredProc1.ExecProc;
  showmessage(Form1.StoredProc1.ParamByName('D').value );
  showmessage(Form1.StoredProc1.ParamByName('E').value );

 也可寫成
  Form1.StoredProc1.Params[0].AsString :=  'Hello';
  Form1.StoredProc1.Params[1].AsString :=Edit2.Text;
  Form1.StoredProc1.Params[2].AsString := Edit3.Text;t;
  Form1.StoredProc1.Prepare;
  Form1.StoredProc1.ExecProc;
  showmessage(Form1.StoredProc1.Params[3].value);
  showmessage(Form1.StoredProc1.Params[4].value);

🔺Procedure程式碼範例:
CREATE OR REPLACE PROCEDURE text_PROCEDUREname (A varchar2, B varchar2, C varchar2, D OUT varchar2, E OUT number)   IS
    /*參數宣告*/
    /*例:*/
    x  TableNmae.Colunm%TYPE;
    y  Number(1);
    z   Number(1);
BEGIN
      /*程式碼*/
     /*實際上我在這裡面的程式碼呼叫了Packages,取得需要的值*/
   
     /*例:*/
     y := 1;
     z := 2;
     D := A;
     E := y+z;
 
    /*如果你想要在Toad先測試Procedure輸出的值,可以先加上這一行*/
    /*DBMS_OUTPUT.Put_Line(D || '-' || E);*/

END text_PROCEDUREname ;


如果你想先在Toad先測試Procedure輸出的值,可以在執行SQL的地方打上這一行
EXEC text_PROCEDUREname ('Hello', 'bb', 'cc');
會得到DBMS_OUTPUT.Put_Line 的結果 應該會是 Hello-3。


其他參考連結:

Comments

Popular posts from this blog

我的救命靈藥。預防感冒的家庭常備藥

身為一位只要水分不足或講太多話就會喉嚨不適 甚至誘發感冒徵兆的人 身邊總是要常備一些良藥 (其實水就是最好的良藥阿) 以下就來介紹各種可舒緩喉嚨不適的產品,也順便介紹幾個其他類型我覺得也不錯的商品

不專業。Delphi x 電子發票證明聯 x ESC/POS指令 x WP-T810出據機 x 熱感紙列印

這幾年遇到政府推動電子發票 千辛萬苦之後,總算是解決了問題 日後會找時間做個完整的紀錄,目前先分享一些指令,也會慢慢將註解補期 關於ESC/POS指令,我找了非常多範本,統整如下 大至分為ASCII、16進位hex 以及10進位DEC 如果遇到沒有反應的指令,我就會直接換另一種方式(例如ASCII沒反應就換成16進位hex) 交叉寫,當然是很不好的示範,總而言之 各指令範例如下      //ResetPrinter------------------------------------------------------------      ResetPrinter_ASCII =  chr(27) + '@';      // 設定位置(置中、靠右、靠左)------------------------------------      AlignLeft_ASCII    = chr(27) + 'a' + chr(00); // Align Text to the Left      AlignCenter_ASCII  = chr(27) + 'a' + chr(01); // Align center.      AlignRight_ASCII   = chr(27) + 'a' + chr(02); // Align Right      decSelectAlignLeft = AnsiChar(27) + 'a' + AnsiChar(0);      decSelectAlignCenter = AnsiChar(27) + 'a' + AnsiChar(1);      decSelectAlignRight = AnsiChar(27) + 'a' + AnsiChar(2);          hexSelectAlignLeft = AnsiChar($1B) + 'a' + AnsiChar($0);      hexSelectAlignCenter = AnsiChar($1B) + 'a' + AnsiChar($1);      h

ORACLE SQL自訂排序(order by decode)

SELECT ID,description FROM A ORDER BY ID 11     台中市 13     彰化縣 14     南投縣 21     台北市 22     新北市 23     基隆市 24     桃園縣 25     新竹縣 26     新竹市 27     苗栗縣 SELECT ID,description FROM A ORDER BY  decode (ID, '21',  1 , '22',  2 , '23',  3 , '24',  4 ), ID 21     台北市 22     新北市 23     基隆市 24     桃園縣 11     台中市 13     彰化縣 25     新竹縣 26     新竹市 27     苗栗縣 註解: T ranslate ID  '21' into the value 1, ID '22'  into the value 2