这条线是什么"使用MIN_NBR"对Q_STR打开C_1;意思?在这种情况下使用绑定变量意味着什么

时间:2016-06-23 11:38:22

标签: sql oracle

CREATE OR REPLACE
PROCEDURE SELECT_12(
    MIN_NBR    NUMBER ,
FIELD_NAME VARCHAR2 )
IS
TYPE cur_type
IS
  REF
  CURSOR;
    C_1 CUR_TYPE;
    QUERY_STR  VARCHAR2(1000);
    FIRST_NAME VARCHAR(1000);
  BEGIN
    Q_STR:= 'SELECT BORR_FST_NM from OCN_DM_DDS.' || field_name ||' WHERE MIN_NBR = :MINNBR';

OPEN C_1 FOR Q_STR USING MIN_NBR;
LOOP
  FETCH C_1 INTO FIRST_NAME;
EXIT
  WHEN C_1%NOTFOUND;


    DBMS_OUTPUT.PUT_LINE(FIRST_NAME);
  END LOOP;
  NULL;
END SELECT_12;

在使用MIN_NBR进行Q_STR的OPEN C_1行中发生了什么?什么打开"使用绑定变量"意思?

2 个答案:

答案 0 :(得分:2)

动态SQL语句包括:

WHERE MIN_NBR = :MINNBR

冒号表示绑定变量;它可以被称为任何东西,但它通常被命名为匹配列名称或更有用的PL / SQL局部变量将用于设置它。

执行动态语句时;

OPEN C_1 FOR Q_STR USING MIN_NBR;

有两个阶段。首先,它由优化器解析,决定最有效的方式来完成查询,此时它仍然使用绑定变量占位符而不是该列的特定值。因此,它可以决定它可以使用的索引,例如,无论实际值如何。 (它有点复杂,但这是要点)。

然后它实际运行查询,使用它已经知道它需要的计划,但使用您提供的特定值。它来自using部分 - PL / SQL MIN_NBR变量的值用于查找所需的实际行。

所以虽然它类似于:

SELECT BORR_FST_NM from OCN_DM_DDS.field_name WHERE MIN_NBR = fixed_value

绑定变量允许将同一计划用于多个查询。

当绑定值发生变化时,可以使用相同的计划 - Oracle不必进行“硬解析”'为了弄清楚如何最好地做到这一点,它进行了一次软解析,确认它之前已经看过相同的查询,并使用现有的计划。这节省了一些时间。它还会阻止SQL缓存填充大量几乎完全相同的查询。

答案 1 :(得分:0)

在动态sql中,您有MIN_NBR = :MINNBR',其中:MINNBR是绑定变量。您需要将值传递给绑定变量,以便在运行时使查询起作用 - 这就是USING MIN_NBR部分正在执行的操作。

这就是说MIN_NBR变量的值传递给:MINNBR绑定变量。