2015-03-24 3 views
-1

Я создал курсор для процедуры. Я пытаюсь применить флаг к записям в этом курсоре.Создание курсора и процедуры

Create or Replace Procedure Pledges 
(IDdonor In Int) 
is 
Cursor Cur_Pledges is 
Select dd_pledge.iddonor, dd_status.idstatus from dd_donor 
join dd_pledge on dd_donor.iddonor=dd_pledge.iddonor 
join dd_status on dd_pledge.idstatus=dd_status.idstatus; 
Type All_Pledges2 is record(iddonor dd_pledge.iddonor%type, idstatus dd_status.idstatus%type, flag Varchar2(10)); 
Begin 
    For Rec_Pledges in Cur_Pledges LOOP 
    if rec_pledges.idstatus = '10' THEN Flag := 'True'; 
     elsif rec_pledges.idstatus= '20' THEN Flag := 'False'; 
    End if; 
    Insert Into All_Pledges 
    Values(rec_pledges.idddonor, rec_pledges.idstatus, flag); 
    End Loop; 
End; 
+0

Пожалуйста, раскройте сообщение о том, что не работает, результат, который вы получаете (и что вы ожидаете), сообщения об ошибках. Это может снизить пороговое значение для потенциальных ответчиков, нашедших ответ. Не ставьте вещи, как ** Редактировать ** или ** Обновить ** в свой вопрос, когда вы пересматриваете. На этом сайте есть история изменений, те, кто должен видеть различия, могут получить информацию оттуда. – Anthon

ответ

1

Вы неправильно используете переменную типа записи, я сделал изменения, пожалуйста, проверьте ниже, это будет работать:

Create or Replace Procedure Pledges 
(IDdonor In Int) 
is 
Cursor Cur_Pledges is 
Select dd_pledge.iddonor, dd_status.idstatus from dd_donor 
join dd_pledge on dd_donor.iddonor=dd_pledge.iddonor 
join dd_status on dd_pledge.idstatus=dd_status.idstatus; 
Type All_Pledges2 is record(iddonor dd_pledge.iddonor%type, idstatus dd_status.idstatus%type, flag Varchar2(10)); 
-- new change below 
allpledges2 All_Pledges2; 
Begin 
    For Rec_Pledges in Cur_Pledges LOOP 
    if rec_pledges.idstatus = '10' THEN 
     allpledges2.Flag := 'True'; 
     elsif rec_pledges.idstatus= '20' THEN 
     allpledges2.Flag := 'False'; 
    End if; 
    Insert Into All_Pledges 
    Values(rec_pledges.iddonor, rec_pledges.idstatus, allpledges2.flag); 
    End Loop; 
End; 
+0

Изменения были сделаны, как было предложено, но все еще получают ошибку при 'Значения (rec_pledges.iddonor, rec_pledges.idstatus, allpledges2.flag); ' Ошибки, которые я получаю, являются инструкциями SQL игнорируются, а таблица или представление PL/SQL не существует – Luke

+0

Есть ли таблица all_pledges? Если нет, тогда вы должны создать первую. –

0

В то время как вы можете сделать это с помощью петли курсора, вы не должны , Как правило, PL/SQL лучше всего работает, если вы минимизируете количество изменений в контексте и позволяете оптимизатору SQL выполнять свою работу. Эта процедура должна состоять из одного insert заявления:

CREATE OR REPLACE PROCEDURE pledges (iddonor IN INT) IS 
BEGIN 
    INSERT INTO all_pledges 
     SELECT dd_pledge.iddonor, 
      dd_status.idstatus, 
      CASE dd_status.idstatus 
       WHEN '10' THEN 'True' 
       WHEN '20' THEN 'False' 
      END 
     FROM dd_donor 
      JOIN dd_pledge ON dd_donor.iddonor = dd_pledge.iddonor 
      JOIN dd_status ON dd_pledge.idstatus = dd_status.idstatus; 
END pledges; 

Это, вероятно, стоит отметить, что, как написано, параметр iddonor является излишним: так как вы не ссылаться на него в коде, он не служит никакой цели.


Если цель состоит в том, чтобы просто вернуть результаты в другую программу, вы не хотите вставить на все (с помощью таблицы для возврата набора результатов не хороший шаблон в Oracle). Лучший способ справиться с этим, как правило, чтобы открыть реф курсор и вернуть, что:

CREATE OR REPLACE PROCEDURE pledges (iddonor IN INT, 
            all_pledges OUT SYS_REFCURSOR) IS 
BEGIN 
    OPEN all_pledges FOR 
     SELECT dd_pledge.iddonor, 
      dd_status.idstatus, 
      CASE dd_status.idstatus 
       WHEN '10' THEN 'True' 
       WHEN '20' THEN 'False' 
      END 
     FROM dd_donor 
      JOIN dd_pledge ON dd_donor.iddonor = dd_pledge.iddonor 
      JOIN dd_status ON dd_pledge.idstatus = dd_status.idstatus 
     WHERE dd_donor.iddonor = pledges.iddonor; 
END pledges; 

В качестве альтернативы, вы можете вернуть определенный пользователем типа или записать результаты в глобальную временную таблицу.

+0

Спасибо за ответ. Мне нужно создать программу, которая будет использовать donorid как параметр, который будет передан этой программе. Я действительно не хочу создавать таблицу permenant, которую я могу использовать для отображения результатов после завершения курсора – Luke

Смежные вопросы