使用替代变量运行游标

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 有点奇怪,所以我想这是一个人为的练习。

【讨论】:

以上是关于使用替代变量运行游标的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE 11G在存储过程里面遍历游标, 调用job任务定时运行

SQL优化技巧-批处理替代游标

Oracle游标和游标变量的区别

oracle调优 浅析有效的游标管理

使用游标作为返回变量

替代 sql 游标