при попытке выбора курсором данных в табличной форме он не работает должным образом - PullRequest
1 голос
/ 20 сентября 2019

Я хочу просто получить данные с помощью курсора в табличной форме. 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; 

я просто хочу получить все данные из таблицы в табличной форме

с наилучшими пожеланиями для ответа

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Речь идет о формах.

Лично я бы избегал курсоров и циклов и просто создавал блок данных на основе таблицы 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 loop;это избавляет вас от необходимости набирать и обрабатывать несколько вещей (открытие и закрытие курсора, уделение внимания выходу из цикла, объявление переменных курсора).Кроме того, это хорошая идея, чтобы предшествовать элементам формы с блоком, к которому они принадлежат (например, :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 (без курсоров, без циклов).

0 голосов
/ 20 сентября 2019
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;
...