這次遇到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的地方打上這一行
其他參考連結:
需要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。
會得到DBMS_OUTPUT.Put_Line 的結果 應該會是 Hello-3。
其他參考連結:
Comments
Post a Comment