создать хранимую процедуру выбора oracle 11g - PullRequest
0 голосов
/ 02 марта 2020

каждый, у меня есть oracle 11g DB, я хочу создать хранимую процедуру, которая возвращает оператор выбора между некоторым представлением и таблицей, как показано ниже:

CREATE OR REPLACE PROCEDURE schemaName.my_PROC_name (p1 in number(10))
as 
begin 
select v.*,(select column1 from table t where t.id=p1) from view v ;
end my_PROC_name ;

, и это не работает Я не знаком с oracle DB, так что, пожалуйста, помогите!

1 Ответ

0 голосов
/ 02 марта 2020
  • Если вы хотите извлечь столбцы из более чем одного источника данных (например, таблиц или представлений), вам лучше использовать между ними предложения соединения, а не подзапросы, в которых могут возникнуть 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;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...