运行 带有替换变量的游标
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 有点奇怪,所以我想这是一个人为的练习。
我正在尝试 运行 一个带有替代变量的游标。我尝试输入 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 有点奇怪,所以我想这是一个人为的练习。