【问题标题】:PL/SQL can you help me understand this PL/SQL code?PL/SQL 你能帮我理解这个 PL/SQL 代码吗?
【发布时间】: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 中看到哪个是变量,哪个是列。

标签: sql plsql


【解决方案1】:

这里有很好的解释:

http://www.dba-oracle.com/t_plsql_dbms_sql_bind_variable.htm

它只是将“max_salary”的值分配给sal 变量。这用于动态 SQL 过程。

代码正在执行这个查询(sal = max_salary = 10000):

DELETE FROM employees WHERE salary > 10000

最后显示删除了多少条记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多