### 寫在前面 > 動態 `SQL` 語句是部分或者整個 `SQL` 語句在運行時才能確定,可以更好的與用戶進行交互,大大提高了`SQL`的靈活性 ### 一、執行SQL語句 #### 1.1 執行無入參SQL ① 語法 ```sql EXECUTE IMMEDIATE SQLStatement ...
寫在前面
動態
SQL
語句是部分或者整個SQL
語句在運行時才能確定,可以更好的與用戶進行交互,大大提高了SQL
的靈活性
一、執行SQL語句
1.1 執行無入參SQL
① 語法
EXECUTE IMMEDIATE SQLStatement {USING TransactionObject} ;
② 說明
SQLStatement
--> 有效SQL語句字元串TransactionObject
-->事務對象名 省略時使用SQLCA
③ 舉個慄子
刪除員工信息表emp
string sql = "drop table emp"
EXECUTE IMMEDIATE :sql USING SQLCA;
1.2 執行帶參數SQL
① 語法
PREPARE DynamicStagingArea FROM SQLStatement
{USING TransactionObject} ;
EXECUTE DynamicStagingAreaUSING {ParameterList} ;
②說明
-
DynamicStagingArea
-->預設全局變數是SQLSA
-
SQLStatement
-->有效的SQL語句,其中? 代表需要傳入的參數。執行時問號被 EXECUTE 語句中的 USING 子句所代表的值
取代 -
TransactionObject
-->事務對象名,大括弧表示該子句可以省略,省略時使用SQLCA
-
ParameterList
-->參數列表,可以是變數、常量或者控制項的屬性,各參數對應於SQLStatement
中的問號
③ 舉個慄子
Ⅰ 刪除員工編號56的員工信息
Int li_empno = 56
PREPARE SQLSA FROM "DELETE FROM emp WHERE empno=?" ;
EXECUTE SQLSA USING :li_empno ;
Ⅱ 新增一個員工信息
Prepare SQLSA from
"insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (?, ?, ?, ?, ?, ?, ?, ?)"
execute SQLSA using :ls_empno, :ls_ename, :ls_job, :ls_mgr, :ld_hiredate, :ld_sal, :ls_comm, :ls_deptno;
二 、使用游標
資料庫中的游標可以看作是一個指針,它指向查詢語句返回的結果集中的當前行。通過游標,我們可以逐行處理結果集
2.1 語法
① do while 語法
//定義游標
string test
//聲明游標
declare test cursor for select 欄位名 from 表名 where 條件 using sqlca;
//打開游標
open test;
//獲取數據
fetch test into:欄位名變數;
do while sqlca.sqlcode = 0
//在這裡寫你的業務
//再次獲取數據
fetch test into:欄位名變數;
loop
//關閉游標
close test;
② for 語法
long ll_count = 10
//定義游標
string test
//聲明游標
declare test cursor for select 欄位名 from 表名 where 表達式 using sqlca;
//打開游標
open test;
for i=1 to ll_count
//獲取數據
fetch test into :變數名;
//在這裡寫你的業務
next
//關閉游標
close test;
2.2 舉個慄子
上面具體說了游標的兩種實現語法,接下來我們就分別用兩種語法實現向下拉框中添加數據的功能
① 使用do while 語法向下拉框中添加員工信息
string ls_empno,ls_ename
ddlb_1.Reset () //重置下拉列表
DECLARE cur_empinfo CURSOR FOR
select empno,ename from emp;
Open cur_empinfo; // 打開游標
If SQLCA.SqlCode = -1 Then //判斷打開游標是否失敗,失敗則彈出提示信息
messagebox ('提示信息'+SQLCA.SqlErrText)
Return -1
End If
Fetch cur_empinfo Into :ls_empno,:ls_ename;
ddlb_1.SetRedraw(False) //禁止下拉列表刷新
Do While SQLCA.SqlCode = 0
ddlb_1.AddItem (ls_empno+'-'+ls_ename) //向下拉列表添加數據
Fetch cur_empinfo Into :ls_empno,:ls_ename;
Loop
ddlb_1.SetRedraw(True) //刷新下拉列表
Close cur_empinfo; //關閉游標
② 使用for 語法向下拉框中添加員工信息
long ll_count = 10
string ls_empno,ls_ename
//定義游標
string cur_empinfo
//聲明游標
declare cur_empinfo cursor for select empno,ename from emp where deptno = '20' using sqlca;
//打開游標
open cur_empinfo;
for i=1 to ll_count
//獲取數據
fetch test into :ls_empno,:ls_ename;
//在這裡寫你的業務
ddlb_1.AddItem (ls_empno+'-'+ls_ename) //向下拉列表添加數據
next
//關閉游標
close cur_empinfo;
註: 使用游標過程中,打開了游標,業務處理完之後一定要關閉游標
三 、調用存儲過程
存儲過程是一組預編譯的SQL代碼塊,它將一些複雜操作封裝起來,並存儲在資料庫中。
由於存儲過程在資料庫中進行了預編譯,並且能被多個客戶端重覆調用,可以減少網路開銷,提高執行效率
3.1 調用格式
// 定義過程調用
// prc_Test 表示資料庫中存儲過程名稱
// ls_a,ls_b 表示存儲過程中的in類型入參
Declare my_proce Procedure For prc_Test(:ls_a,:ls_b);
// 執行過程,這裡是不需要其他參數的
Execute my_proce ;
// 調用過程出現錯誤處理
If SQLCA.SQLCode <> 0 Then
End If
// 獲取出參值,也就是OUT的變數,如果沒有out類型的變數,這句也就不需要了
Fetch my_proce Into :ls_ReturnName;
// 獲取數據出現錯誤處理
If SQLCA.SQLCode <> 0 Then
End If
// 關閉調用
Close my_proce ;
3.2 舉個慄子
① PB調用無入參存儲過程
Ⅰ 創建存儲過程
Create Or Replace Procedure prc_getEmplname(v_name Out Varchar2) As
--存儲過程,有一個out類型參數,無入參
Begin
v_name := 'Jone';
End;
Ⅱ 調用存儲過程
Declare my_proce Procedure For p_get_name;
//或者
Declare my_proce Procedure For p_get_name();
② PB調用有入參存儲過程
Ⅰ 創建存儲過程
我們來創建一個存儲過程,根據部門編號和員工姓名給該員工漲1000塊錢工資
CREATE OR REPLACE Procedure prc_incr_sal(pra_deptno in Varchar2,
pra_ename in varchar2,
pra_code out NUMBER, --執行代碼
pra_errmsg out VARCHAR2) As
Begin
pra_code :=1;
pra_errmsg :='';
begin
update emp set sal=sal+1000 where deptno = pra_deptno and ename =pra_ename;
EXCEPTION
WHEN OTHERS THEN
pra_code := -1;
pra_errmsg := '更新員工薪水失敗!'||SQLERRM;
END;
End prc_incr_sal;
Ⅱ 調用存儲過程
string ls_deptno
string ls_ename
int li_AppCode
string ls_err
ls_deptno = "20"
ls_ename = "XIEZHR"
DECLARE my_prc PROCEDURE FOR PRC_INCR_SAL
(:ls_deptno, //員工編號
:ls_ename //員工姓名
);
EXECUTE my_prc;
// 執行存儲過程報錯處理
IF SQLCA.SQLCode < 0 THEN
ls_err = SQLCA.SQLErrText
GOTO prcErr
END if
//獲取存儲過程出參數據
FETCH my_prc Into :li_AppCode, :ls_err ;
//獲取出參數據失敗處理
IF SQLCA.SQLCode < 0 THEN GOTO prcErr
IF li_AppCode < 0 THEN GOTO prcErr
//關閉存儲過程
CLOSE my_prc;
return 0
prcErr:
rollback;
messagebox('錯誤信息',)
四、小結
通過前面的三小節內容,相信你已經學會了在PB中怎麼執行動態SQL
語句?PB怎麼調用資料庫中存儲過程?
PB怎麼通過游標對SQL
語句查詢出的包含多條結果集的處理。這幾種場景在PB中都是經常使用的。
以上就是本期的全部內容,希望對你有所幫助 (●'◡'●)
我們下期再見~ ヾ(•ω•`)o
本文來自博客園,作者:xiezhr,轉載請註明原文鏈接:https://www.cnblogs.com/xiezhr/p/17612892.html