【问题标题】:when trying cursor fetching data in tabular form its not working properly尝试以表格形式获取数据的游标时,它无法正常工作
【发布时间】:2020-01-21 11:32:16
【问题描述】:

我只想用光标以表格形式 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; 

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

【问题讨论】:

    标签: oracle plsql oracleforms


    【解决方案1】:

    这是关于表单的。

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

    无论如何,你错过了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) - 这可能会修复“错误绑定变量”错误:

    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 是一个受限过程,不能从any触发器调用;其中一些不允许这样的程序,所以 - 如果发生这种情况 - 你将不得不创建一个解决方法。最简单的是我已经建议的那个——在c 表上创建的一个数据块(没有游标,没有循环)。

    【讨论】:

    • 感谢 Littlefoot 是的,'for' 是最好的,感谢您的回复,我做到了,我是您许多论坛的粉丝,您做得很好
    【解决方案2】:
    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多