【发布时间】:2021-11-14 07:02:33
【问题描述】:
我在 PL/SQL 中有这段关于 DBMS_SQL 用法的代码;当我分配字符串 sqlString 时,":sal" 做了什么?
DECLARE
sqlString VARCHAR2(100);
c INTEGER;
rows_processed INTEGER;
max_salary INTEGER;
BEGIN
max_salary := 10000;
sqlString := 'DELETE FROM employees WHERE salary > :sal';
c := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(c, sqlString, DBMS_SQL.NATIVE);
DBMS_SQL.BIND_VARIABLE(c, ':sal', max_salary);
rows_processed := DBMS_SQL.EXECUTE(c);
DBMS_OUTPUT.PUT_LINE('Impiegati cancellati: ' || rows_processed);
DBMS_SQL.CLOSE_CURSOR(c);
END;
【问题讨论】:
-
它是一个绑定参数。将其视为包含值的占位符。当调用 dbms_sql.execute 时,:sal 参数将填充 max_salary 的值。
-
附带说明:如果我没有遗漏什么,这里根本不需要动态 SQL。您可以直接发出
DELETE FROM employees WHERE salary > max_salary,这仍将使用绑定变量,因为这是 PL/SQL 使 SQL 引擎知道其变量的方式。然后,您将使用SQL%ROWCOUNT获得已处理的行数。为 PL/SQL 变量使用一些前缀被认为是一种很好的风格,例如v_max_salary。因此我们可以很容易地在DELETE FROM employees WHERE salary > v_max_salary中看到哪个是变量,哪个是列。