游标中的 PL/SQL 变量是否与绑定参数有效相同?

Gol*_*rol 4 oracle plsql cursor parameterbinding bind-variables

我听说使用绑定变量(可以)更有效,因为对于具有不同绑定值的后续调用,查询本身仍然相同,因此不再需要对其进行解析。

我理解为什么固定值会出现这种情况。在下面的游标中,该值固定为 1。如果我有一个相同的不同游标,除了 1 变为 2,这是一个不同的查询。清到此为止。

declare
  cursor C_CURSOR is 
    select * from TESTTABLE pt where pt.ID = 1;
Run Code Online (Sandbox Code Playgroud)

但我想知道在游标内使用 PL/SQL 变量时是否也是这种情况。它们是否被扩展为一个固定值,或者它们是否被解释为绑定变量。

我已经进行了广泛的搜索,但到处都可以找到有关文字的示例,如上述情况,但没有明确解释 PL/SQL 变量的使用。

换句话说,在下面的两个片段中,第二个可能更有效,还是它们本质上相同?

直接在游标中使用 PL/SQL 变量:

declare
  V_TEST integer := 1;

  cursor C_CURSOR is 
    select * 
    from 
      TESTTABLE pt
    where
      pt.ID = V_TEST;

begin
  for r in C_CURSOR loop
    null;
  end loop;
end;
Run Code Online (Sandbox Code Playgroud)

使用绑定变量:

declare
  V_TEST int := 1;

  cursor C_CURSOR(B_TEST int) is 
    select * 
    from 
      TESTTABLE pt
    where
      pt.ID = B_TEST;

begin
  for r in C_CURSOR(V_TEST) loop
    null;
  end loop;
end;
Run Code Online (Sandbox Code Playgroud)

Lal*_*r B 5

首先,好问题。

我想做一个小报价:

对 PL/SQL 变量的每个引用实际上都是一个绑定变量。

话说回来,

PL/SQL 本身负责处理与绑定变量有关的大部分问题,以至于您编写的大多数代码已经在您不知情的情况下使用了绑定变量。以下面的 PL/SQL 代码为例:

create or replace procedure dsal(p_empno in number)
as
  begin
    update emp
    set sal=sal*2
    where empno = p_empno;
    commit;
  end;
/
Run Code Online (Sandbox Code Playgroud)

现在您可能认为必须用绑定变量替换 p_empno。然而,好消息是每个对 PL/SQL 变量的引用实际上都是一个绑定变量。

来源