как сделать запрос выбора с функциями pl sql - PullRequest
0 голосов
/ 29 мая 2020

Функция 1:

create or replace function get_books (l_id in number)
return varchar
is l_return varchar2(100);
begin
select books into l_return from people where id=l_id;
return l_return;
end
/

Функция 2:

create or replace function  get_author (l_id in number)
return varchar
is l_return varchar2(100);
begin
select author in l_return from authors where id=l_id;
return l_return;
end
/

Я хочу сделать выбор с двумя функциями, я хочу отображать книги и авторов. это возможно?

1 Ответ

0 голосов
/ 29 мая 2020

Да, это возможно. Например:

select get_books (1) book,
       get_author(1) author
from dual;

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


Что касается процедуры: опубликованный вами код недействителен, поэтому я исправил его.

SQL> create or replace procedure get_categories (l_categories  in     varchar2,
  2                                              l_id          in     number,
  3                                              l_boolean        out boolean,
  4                                              l_error          out varchar2)
  5  is
  6  begin
  7  --   INSERT INTO categories (id, categories)
  8  --        VALUES (l_categories, l_id);
  9
 10     l_boolean := true;
 11     commit;
 12  exception
 13     when others
 14     then
 15        l_boolean := false;
 16        l_error := sqlerrm;
 17  end;
 18  /

Procedure created.

Поскольку он возвращает 2 параметра OUT, вы должны объявить переменные для принятия этих значений (v_boolean и v_error). Кроме того, поскольку вы не можете напрямую отображать логическое значение, используйте CASE и вместо этого отобразите строку .

Процедура не может быть вызвана как функция в SQL SELECT оператор, поэтому вам придется использовать другой фрагмент кода PL / SQL; анонимный блок PL / SQL в порядке.

SQL> set serveroutput on
SQL> declare
  2    v_categories varchar2(10) := 'ABC';
  3    v_id         number := 1;
  4    v_boolean    boolean;
  5    v_error      varchar2(200);
  6  begin
  7    get_categories(l_categories => v_categories,
  8                   l_id         => v_id,
  9                   l_boolean    => v_boolean,
 10                   l_error      => v_error
 11                  );
 12
 13    dbms_output.put_line(case when v_boolean then 'true' else 'false' end ||' - '||
 14                            v_error
 15                           );
 16  end;
 17  /
true -

PL/SQL procedure successfully completed.

SQL>
...