运行 带有替换变量的游标

Run a cursor with a substitute variable

我正在尝试 运行 一个带有替代变量的游标。我尝试输入 Pa 并抛出以下错误:

identifier PA must be declared

DECLARE

CURSOR c_emp(p_cad varchar2) IS SELECT * FROM employee
                                WHERE fname LIKE ''||p_cad||'%';  
                                
v_fname employee.fname%TYPE:=&Idemp;  --substitution variable 
v_count INT:=0;
BEGIN
FOR r IN c_emp(v_fname)
LOOP
    dbms_output.put_line('Emp Id: '||r.emp_id);
    dbms_output.put_line('FName: '||r.fname);
    dbms_output.put_line(' ');
    v_count:= v_count+1;
END LOOP;
    dbms_output.put_line('------------------');
    dbms_output.put_line('Total de Empleados: '||v_count);
END;

替换变量的前缀是 & 而不是 $ 所以你的代码应该是:

v_fname employee.fname%TYPE:=&Idemp;

但是,如果你想要一个绑定变量,那么它应该以:

为前缀
v_fname employee.fname%TYPE:=:Idemp;

如果在出现提示时输入 Pa,则需要将替换引用用单引号引起来,以便在解析 PL/SQL 块时使其成为字符串文字:

v_fname employee.fname%TYPE:='&Idemp';

然后将被解析为 ... :='Pa';

如您所见,如果没有引号,它将被解析为 ... :=Pa 并且它会尝试将 Pa 解释为(不带引号的)标识符;因此你得到的错误。


在 PL/SQL 中使用替代变量有点奇怪,尽管它适用于匿名块。替换由客户端(例如 SQL*Plus)在 PL/SQL 和替换值传递给数据库引擎进行解析和执行之前完成。但是,对于您正在做的事情完全使用 PL/SQL 有点奇怪,所以我想这是一个人为的练习。