Речь идет о формах.
Лично я бы избегал курсоров и циклов и просто создавал блок данных на основе таблицы 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
(без курсоров, без циклов).