Я работаю над приложением и принял решение, что все запросы будут процедурами.Я надеюсь получить прирост производительности и простоту обслуживания, сделав это таким образом.Наши администраторы баз данных также выразили заинтересованность в том, чтобы сделать это таким образом.
У меня есть таблица HR, в которой операции выполняются каждый вечер, а любые изменения записываются во вторичную таблицу.Мы не проводим аудит, эти записи об изменениях хранятся до следующего запуска и показывают пользователям произошедшие изменения.
Чтобы сократить вопрос, я сократил количество столбцов в HR.
Идентификатор таблицы HR, GROUP_NAME и GROUP_LEVEL.Таблица Drill имеет ID и TYPEVALUE.
CREATE OR REPLACE PROCEDURE DOCSADM.DRILL_RECORD_POSITION (
RECORD_TYPE IN VARCHAR2,
OUT_ID OUT VARCHAR2,
OUT_GROUP_NAME OUT VARCHAR2,
OUT_GROUP_LEVEL OUT VARCHAR2
) AS
BEGIN
SELECT HR.ID, HR.GROUP_NAME, HR.GROUP_LEVEL
INTO OUT_ID, OUT_GROUP_NAME, OUT_GROUP_LEVEL
FROM HR_POSITION HR JOIN DRILL_POSITION DP ON (HR.ID = DP.ID) WHERE DP.TYPEVALUE = RECORD_TYPE;
END DRILL_RECORD_POSITION;
Процедура компилируется без проблем.Прежде чем выполнять всю работу в приложении, связанную с процедурой и извлекать значения, которые в этом случае в конечном итоге будут отображаться в представлении или на веб-странице, я хотел создать небольшой небольшой скрипт, который будет вызывать процедуру, а затем отображать результаты так,Я могу проверить в Oracle.
Петли
BEGIN
for t in (DRILL_RECORD_POSITION('D', V1,V5,V6))
loop
--dbms_output.put_line(t.V1 || t.V5 || t.V6);
dbms_output.put_line(t.OUT_ID);
end loop;
END;
/
КУРСОРЫ
DECLARE
V1 HR_POSITION.ID%TYPE;
V5 HR_POSITION.GROUP_NAME%TYPE;
V6 HR_POSITION.GROUP_LEVEL%TYPE;
CURSOR T_CUR IS DRILL_RECORD_POSITION('D', V1,V5,V6);
BEGIN
OPEN T_CUR;
DBMS_OUTPUT.PUTLINE('START');
LOOP
FETCH T_CUR INTO V1,V5,V6;
EXIT WHEN T_CUR%NOTFOUND;
DBMS_OUTPUT.PUTLINE(V1||V5||V6);
END LOOP;
CLOSE T_CUR;
END;
ДЛЯ ЦИКЛОВ
DECLARE
V1 HR_POSITION.POSITION_ID%TYPE;
V5 HR_POSITION.GROUP_NAME%TYPE;
V6 HR_POSITION.GROUP_LEVEL%TYPE;
BEGIN
DBMS_OUTPUT.PUTLINE('START');
FOR INDEX IN (DRILL_RECORD_POSITION('D', V1,V5,V6))
LOOP
--DBMS_OUTPUT.PUTLINE(INDEX.ID);
DBMS_OUTPUT.PUTLINE(INDEX.V1||INDEX.V5||INDEX.V6);
END LOOP;
END;
Примечание: я отредактировал имена столбцов и укоротил некоторые при передаче сюда, чтобы я мог сделать несколько ошибок.
Все статьи, которые я видел в Интернете, показывают мне, как отображать из оригинальной процедуры или с помощьюпредставления, курсоры, записи.Если я не ошибаюсь, у Eclipse не будет проблем с использованием информации в текущей форме, поэтому я передаю ее таким образом.Поэтому я не заинтересован в изменении процедуры и хотел бы работать с ней как есть, так как приложение будет это делать.
Поскольку это первая из хранимых процедур, которые я выполняю для приложениявместо использования запросов adhoc из приложения у меня нет существующих примеров для работы, поэтому я считаю, что результаты будут работать нормально, потому что это должен быть тот же формат, который используют adhoc.
Обновление:
В одном из комментариев я указал на то, что должно было быть решением .Это было подтверждено другим решением , которое находилось под ним.
Я получаю сообщение об ошибке
ORA-01422: точная выборка возвращает больше, чем запрошенное количество строк
Итак, я возвращаю несколько строк, но это мое ожидание и то, что происходит.Я просто не могу понять, как отобразить результаты.