- Если вы хотите извлечь столбцы из более чем одного источника данных (например, таблиц или представлений), вам лучше использовать между ними предложения соединения, а не подзапросы, в которых могут возникнуть
single subquery returns more than one row
ошибка. - Точность для типа данных не допускается при определении параметров для процедур, функций или пакетов. (замените
p1 in number(10)
на p1 number
) view
и table
- зарезервированные ключевые слова, и их нельзя использовать при их создании. - , вам может понадобиться вернуть значения из запроса к некоторым переменным. Для чего потребуется условие
into
и параметры типа out
, чтобы вывести их из таких программных блоков - , используя
in
(по умолчанию) для объявления переменных и используя процедуру имя после предложения end
является избыточным. Чтобы указать тип элемента, используйте %TYPE
, чтобы предоставить максимально возможный тип данных переменной или столбца базы данных, а не указывать независимые типы данных. - Иногда вы не можете получить нужные данные, не забудьте добавить обработку исключений для ваших запросов в тех ситуациях, когда вы не получаете сообщения об ошибках.
Итак, для вашего случая можно рассмотреть следующий блок кода:
CREATE OR REPLACE PROCEDURE my_PROC_name(
i_p1 NUMBER,
o_col0 OUT myview.col0%type,
o_col1 OUT mytable.column1%type
) AS
BEGIN
SELECT v.col0, t.column1
INTO o_col0, o_col1
FROM myview v
LEFT JOIN mytable t
ON v.id = t.v_id
WHERE t.id = i_p1;
EXCEPTION WHEN no_data_found THEN null;
WHEN too_many_rows THEN null;
END;
/
и вы можете выполнить процедуру как
SQL> set serveroutput on
SQL> declare
i_p1 number := 3;
o_1 myview.col0%type;
o_2 mytable.column1%type;
begin
my_proc_name(i_p1,o_1,o_2);
dbms_output.put_line(o_1||' - '||o_2);
end;
/