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行中发生了什么?什么打开"使用绑定变量"意思?
答案 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
绑定变量。