首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

PowerBuilder 中常用 SQL 語句實戰速查手冊

     編輯:關於SqlServer

PowerBuilder (PB) 作為經典的客戶端/服務器 (C/S) 開發工具,其嵌入式 SQL (ESQL) 語法融合了腳本語言靈活性與數據庫操作強大功能。本文系統整理 PB 中 SELECT、INSERT、UPDATE、DELETE、游標、BLOB、動態 SQL、事務控制等核心語句的語法規範、參數綁定、錯誤處理與最佳實踐,為 PB 開發者提供即查即用的參考手冊。

核心語法規範

  • SQL 語句以 分號 (;) 結束,可跨多行無需續行符 &。
  • PB 變量在 SQL 中引用時前綴冒號 (:),如 :emp_id。
  • 字串字面量在 PB 腳本中用雙引號,在 SQL 中用單引號,嵌套時需轉義 (如 ''張% 表示 '張%')。
  • 所有數據庫操作隸屬於事務對象 (默認 SQLCA),需先 CONNECT 後操作,最後 COMMIT 或 ROLLBACK。

1. SELECT 查詢與變量綁定

多表連接查詢

SELECT Employee.Emp_id, Employee.Emp_name, Employee.Emp_salary, Dept.Dept_name
FROM Employee, Dept
WHERE (Emp_name LIKE :ls_name_pattern) AND (Emp_sex = :ls_sex)
  AND Employee.Dept_id = Dept.Dept_id
ORDER BY Employee.Emp_id;

聚合查詢賦值給變量 (INTO 子句)

DECIMAL ld_max_salary
SELECT MAX(Emp_salary) INTO :ld_max_salary FROM Employee;

2. INSERT 插入數據

INTEGER li_emp_nbr
STRING ls_emp_name

li_emp_nbr = Integer(sle_number.Text)
ls_emp_name = sle_name.Text

INSERT INTO Employee (Emp_nbr, Emp_name)
VALUES (:li_emp_nbr, :ls_emp_name)
USING Emp_tran;  -- 指定事務對象,可省略用默認 SQLCA

3. UPDATE 更新數據

UPDATE Employee
SET Emp_name = :sle_Name.Text
WHERE Emp_nbr = :li_emp_nbr;

4. DELETE 刪除數據

DELETE FROM Employee
WHERE Emp_nbr < 100;

5. 事務控制

  • CONNECT:建立連接 (隱含 BEGIN TRANSACTION)。
  • COMMIT:提交事務,DISCONNECT 前自動執行。
  • ROLLBACK:回滾事務。
  • DISCONNECT:斷開連接 (隱含 COMMIT)。

6. 游標操作 (處理多行結果集)

游標生命週期:DECLARE → OPEN → FETCH → (循環 FETCH) → CLOSE。可在 FETCH 後對當前行執行 UPDATE ... WHERE CURRENT OF cursor / DELETE ... WHERE CURRENT OF cursor。

// 聲明游標及宿主變量
STRING ls_emp_name
DECLARE emp_cur CURSOR FOR
SELECT emp_name FROM EMPLOYEE WHERE emp_state = :sle_1.Text;

// 打開游標 (執行 SELECT)
OPEN emp_cur;

// 取第一行
FETCH emp_cur INTO :ls_emp_name;

// 錯誤檢查
IF SQLCA.SQLCode < 0 THEN
    MessageBox("Database Error", SQLCA.SQLErrText)
    RETURN
END IF

// 循環取數據
DO WHILE SQLCA.SQLCode = 0
    ddlb_1.AddItem(ls_emp_name)  // 加入下拉列表
    FETCH emp_cur INTO :ls_emp_name
LOOP

// 關閉游標 (釋放資源)
CLOSE emp_cur;

7. BLOB 數據操作 (長文本/圖片/文檔)

BLOB 操作單次僅能處理一行,多行會報錯。需聲明 BLOB 類型變量作為中介。

讀取 BLOB (SELECTBLOB)

BLOB lblb_emp_pic
SELECTBLOB Emp_pic INTO :lblb_emp_pic
FROM Employee
WHERE Emp_Id = '001'
USING Emp_tran;

IF Emp_tran.SQLCode = 0 THEN
    pb_1.SetPicture(lblb_emp_pic)  // Picture 控件顯示
END IF

寫入 BLOB (UPDATEBLOB)

INTEGER li_file_handle
BLOB lblb_emp_pic

// 以流模式讀取文件
li_file_handle = FileOpen("c:\emp_100.bmp", StreamMode!)
IF li_file_handle <> -1 THEN
    FileRead(li_file_handle, lblb_emp_pic)
    FileClose(li_file_handle)

    UPDATEBLOB Employee
    SET Emp_pic = :lblb_emp_pic
    WHERE Emp_Id = '001';

    IF SQLCA.SQLNRows > 0 THEN
        COMMIT USING Emp_tran;
    ELSE
        ROLLBACK USING Emp_tran;
    END IF
END IF

8. 動態 SQL (運行時構建/執行 SQL)

適用於表名、列名、WHERE 條件動態變化的場景。核心對象:事務對象 (SQLCA)、動態描述區 (SQLDA - 輸入/輸出參數描述)。

格式 1:EXECUTE IMMEDIATE (無參數、無結果集的 DDL/DML)

STRING ls_sql
ls_sql = "CREATE TABLE Employee (" + &
    "emp_id CHAR(6) NOT NULL," + &
    "emp_nbr INTEGER NOT NULL," + &
    "dept_id INTEGER NOT NULL," + &
    "emp_fname CHAR(10) NOT NULL," + &
    "emp_lname CHAR(20) NOT NULL)"

EXECUTE IMMEDIATE :ls_sql;

// 等價於
EXECUTE IMMEDIATE "DROP TABLE Employee" USING My_trans;

格式 2:PREPARE + EXECUTE (帶參數、可重複執行)

INTEGER li_dept_id = 156
STRING ls_dept_name
SetNull(ls_dept_name)

CONNECT USING My_trans;

// 預編譯 (參數用 ? 佔位)
PREPARE SQLCA FROM "INSERT INTO Dept VALUES (?, ?)";

// 執行並綁定參數
EXECUTE SQLCA USING :li_dept_id, :ls_dept_name;

格式 3:DECLARE 動態游標 (帶參數、返回結果集)

DECLARE dyn_cur DYNAMIC CURSOR FOR SQLCA;
PREPARE SQLCA FROM "SELECT * FROM Employee WHERE Dept_id = ? AND Salary > ?";
OPEN DYNAMIC dyn_cur USING :li_dept_id, :ld_min_salary;
FETCH dyn_cur INTO :ls_emp_id, :ls_emp_name, :ld_salary;
...
CLOSE dyn_cur;

9. 錯誤處理模板 (每個數據庫操作後必檢)

IF SQLCA.SQLCode < 0 THEN
    MessageBox("DB Error", "Code: " + String(SQLCA.SQLCode) + "~r~n" + SQLCA.SQLErrText)
    ROLLBACK USING SQLCA;  -- 或指定事務對象
    RETURN
END IF

-- 針對 UPDATE/DELETE/INSERT 可檢查影響行數
IF SQLCA.SQLNRows = 0 THEN
    -- 未找到匹配行,業務邏輯判斷
END IF

10. 性能與規範建議

  1. 盡用綁定變量 (:var) 而非字串拼接,防注入、利用計劃緩存。
  2. 游標用畢即 CLOSE,釋放服務器鎖與內存。
  3. 大批量操作 改用 EXECUTE IMMEDIATE 批量 DML 或外部工具 (bcp/BULK INSERT)。
  4. 事務保持最短:CONNECT → 操作 → COMMIT/ROLLBACK,避免長事務阻塞。
  5. 動態 SQL 僅作最後手段,靜態 SQL 可被 PB 編譯器檢查語法、優化計劃。

總結

PowerBuilder ESQL 以 冒號綁定變量、分號終止、事務對象管理、游標逐行處理、BLOB 專用語句、動態 SQL 多格式支援 為核心特徵。掌握 DECLARE/OPEN/FETCH/CLOSE 游標循環範式、SELECTBLOB/UPDATEBLOB 雙向流操作、PREPARE/EXECUTE 參數化動態執行三大進階模式,並將 SQLCA.SQLCode 檢查內化為肌肉記憶,即可駕馭 PB 數據庫開發的 95% 場景。記住:靜態優於動態、綁定優於拼接、簡潔優於花哨。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved