使用替代变量运行游标
Posted
技术标签:
【中文标题】使用替代变量运行游标【英文标题】:Run a cursor with a substitute variable 【发布时间】:2020-11-14 09:59:35 【问题描述】:我正在尝试。我尝试输入Pa
并抛出以下错误:
必须声明标识符 PA
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;
【问题讨论】:
【参考方案1】:替换变量的前缀是&
而不是$
,因此您的代码应该是:
v_fname employee.fname%TYPE:=&Idemp;
但是,如果你想要一个绑定变量,那么它应该以:
为前缀
v_fname employee.fname%TYPE:=:Idemp;
【讨论】:
为什么替换变量在这种情况下不起作用?【参考方案2】:如果您在提示时输入Pa
,则需要将替换引用括在单引号中,以便在解析 PL/SQL 块时使其成为字符串文字:
v_fname employee.fname%TYPE:='&Idemp';
然后将被解析为... :='Pa';
正如您所拥有的那样,如果没有引号,它将被解析为 ... :=Pa
并且它会尝试将 Pa
解释为(未引用的)标识符;因此你得到的错误。
在 PL/SQL 中使用替换变量有点奇怪,尽管它适用于匿名块。替换由客户端(例如 SQL*Plus)在 PL/SQL 以替换值传递给数据库引擎以进行解析和执行之前完成。但是,在你所做的事情上完全使用 PL/SQL 有点奇怪,所以我想这是一个人为的练习。
【讨论】:
以上是关于使用替代变量运行游标的主要内容,如果未能解决你的问题,请参考以下文章