Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 当尝试以表格形式游标获取数据时,其工作不正常_Oracle_Plsql_Oracleforms - Fatal编程技术网

Oracle 当尝试以表格形式游标获取数据时,其工作不正常

Oracle 当尝试以表格形式游标获取数据时,其工作不正常,oracle,plsql,oracleforms,Oracle,Plsql,Oracleforms,我想用游标以表格形式10g获取数据,它只显示最后一条记录,也不接受变量p_名称(坏绑定变量)所有其他都被接受p_名称为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; BEGI

我想用游标以表格形式10g获取数据,它只显示最后一条记录,也不接受变量p_名称(坏绑定变量)所有其他都被接受p_名称为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; 
我只希望它以表格形式从表中获取所有数据

这是关于表单的

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
表创建一个数据块,并在输入表单时执行查询

无论如何,您缺少下一条记录。如果没有它,新的光标值将覆盖以前的值

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;
较短的版本是循环的游标
;它使您不用输入和处理一些事情(打开和关闭游标,注意退出循环,声明游标变量)。此外,最好在表单项前面加上它们所属的块(例如,
:block.cid
)-这可能会修复“坏绑定变量”错误:



请注意,
NEXT_RECORD
是一个受限过程,不能从任何触发器调用它;他们中的一些人不允许这样的程序,所以——如果发生这种情况——你必须创建一个变通方法。最简单的一个是我已经建议过的一个——在
c
表上创建一个数据块(没有光标,没有循环)。

谢谢Littlefoot是的,这是最好的,谢谢你的回复,我很喜欢你很多论坛,你做得很好
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;