В то время как вы можете сделать это с помощью петли курсора, вы не должны , Как правило, 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;
В качестве альтернативы, вы можете вернуть определенный пользователем типа или записать результаты в глобальную временную таблицу.
Пожалуйста, раскройте сообщение о том, что не работает, результат, который вы получаете (и что вы ожидаете), сообщения об ошибках. Это может снизить пороговое значение для потенциальных ответчиков, нашедших ответ. Не ставьте вещи, как ** Редактировать ** или ** Обновить ** в свой вопрос, когда вы пересматриваете. На этом сайте есть история изменений, те, кто должен видеть различия, могут получить информацию оттуда. – Anthon