PB從入坑到放棄(六)動態SQL應用

来源:https://www.cnblogs.com/xiezhr/archive/2023/08/07/17612892.html
-Advertisement-
Play Games

### 寫在前面 > 動態 `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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文地址:https://zhanglei.blog.csdn.net/article/details/121673288 [toc] ## 一、前言 應用中某些模塊需要組件化,組件化後的工程最後會做二進位化處理,打包成`.framework`文件。 今天簡單聊一下在主工程或其他組件中是如何訪問自製 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 1. 場景 前端構建完上線,用戶還停留還在老頁面,用戶不知道網頁重新部署了,跳轉頁面的時候有時候js連接hash變了導致報錯跳不過去,並且用戶體驗不到新功能。 2. 解決方案 每次打包寫入一個json文件,或者對比生成的script的sr ...
  • 實現一個項目匹配多個端,使用vue.config自帶的page 實現多個頁面切換。官網介紹:https://cli.vuejs.org/zh/config/#pages 在創建的vue項目中找到 vue.config.js中 添加page 沒有就在根目錄下創建vue.config.js const ...
  • # 1 HTML5新特性 ## 1.1 概述 HTML5 的新增特性主要是針對於以前的不足,增加了一些新的標簽、新的表單和新的表單屬性等。 這些新特性都有相容性問題,基本是 **IE9+ 以上版本的瀏覽器**才支持,如果不考慮相容性問題,可以大量使用這些新特性。 ## 1.2 語義化標簽 (★★) ...
  • 系統要求 C/S架構的單體桌面應用,可以滿足客戶個性化需求,易於升級和維護。相比於一代Winform,界面要求美觀,控制項豐富可定製。 解決方案 依托.Net6開發平臺,採用模塊化思想設計(即分而治之的策略),每個模塊採用DDD分層設計。前端選用WPF + Prism框架,後端選用ABP + EF框架 ...
  • ### 歡迎訪問我的GitHub > 這裡分類和彙總了欣宸的全部原創(含配套源碼):[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) ### 本篇概覽 - 本篇是《quarkus依賴註入》的第九篇 ...
  • import os import pandas as pd def md5(string:str=''): import hashlib md5 = hashlib.md5() md5.update(string.encode('utf-8')) return md5.hexdigest() # I ...
  • 註釋是在執行時被忽略的文本。 註釋可用於解釋代碼,使其更易讀。 註釋還可用於在測試替代代碼時防止代碼執行。 Go支持單行或多行註釋。 ## Go單行註釋 單行註釋以兩個正斜杠(`//`)開頭。 在`//`和行尾之間的任何文本都將被編譯器忽略(不會被執行)。 示例 ```Go // This is a ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...