当尝试以表格形式获取游标数据时,它无法正常工作

when trying cursor fetching data in tabular form its not working properly

我只想用表格形式的游标获取数据 10g 它只显示最后一条记录并且也不接受变量 p_name(错误的绑定变量)所有其他都被接受 p_name 是 varchar2 其他都是数字当 运行 plsql

时此代码工作正常

我写了这段代码

DECLARE  
c_id C.CID%TYPE;
c_name C.P_NAME%TYPE;
c_ro C.RO%TYPE;
C_TR C.TR%TYPE;
CURSOR c_customers is  
  SELECT all CID, P_name, RO, TR FROM C;  
BEGIN  
    OPEN c_customers;  
   LOOP
   FETCH c_customers into c_id, C_name, c_RO, C_TR;  
   EXIT WHEN c_customers%notfound;
   :CID := C_ID;
   --:P_NAME := C_NAME;
   :RO := C_RO;
  :TR := C_TR;  
   END LOOP;  
   CLOSE c_customers;  
END; 

我只是希望它以表格形式从 table 中获取所有数据

declare 
c_empno emp.empno%type;
c_ename emp.ename%type;
c_job emp.job%type;
c_deptno emp.deptno%type;
c_stat varchar2(10):='test';
l_stat varchar2(10);
cursor c_emp_data is select empno, ename, job, deptno, c_stat
  from emp;
  Begin
  Open c_emp_Data;
  loop
  fetch c_emp_Data into c_empno, c_ename, c_job, c_deptno, l_stat;
  dbms_output.put_line(c_empno||' '||c_ename||c_job||c_deptno||l_stat);
  exit when c_emp_data%notfound;
  end loop;
  end;

这是关于表格的。

就我个人而言,我会避免使用游标和循环,而只是根据 c table 创建一个数据块并在输入表单时执行查询。

无论如何,你错过了NEXT_RECORD。没有它,新的光标值会覆盖以前的值。

DECLARE  
  c_id   C.CID%TYPE;
  c_name C.P_NAME%TYPE;
  c_ro   C.RO%TYPE;
  C_TR   C.TR%TYPE;

  CURSOR c_customers is  
    SELECT all CID, P_name, RO, TR FROM C;  

BEGIN  
   OPEN c_customers;  
   LOOP
     FETCH c_customers into c_id, C_name, c_RO, C_TR;  
     EXIT WHEN c_customers%notfound;

     :CID    := C_ID;
     :P_NAME := C_NAME;
     :RO     := C_RO;
     :TR     := C_TR;  

     NEXT_RECORD;         --> this is missing
   END LOOP;  
   CLOSE c_customers;  
END;

一个较短的版本是游标 FOR 循环;它使您免于键入和处理几件事(打开和关闭游标,注意退出循环,声明游标变量)。此外,最好在表单项之前加上它们所属的块(例如 :block.cid)——这可能会修复 "bad bind variable" 错误:

BEGIN  
   FOR cur_r in (select cid, p_name, ro, tr from c)
   LOOP
     :block.CID    := cur_r.cid;
     :block.P_NAME := cur_R.p_NAME;
     :block.RO     := cur_r.RO;
     :block.TR     := cur_r.TR;  

     NEXT_RECORD;         --> this is missing
   END LOOP;  
END;

请注意,NEXT_RECORD 是一个受限过程,不能从 任何 触发器调用;他们中的一些不允许这样的过程 - 如果发生这种情况 - 你将不得不创建一个解决方法。最简单的是我已经建议的那个——在 c table 上创建的数据块(没有游标,没有循环)。