Ошибка процедуры PL / SQL с помощью функции вывода dbms - PullRequest
0 голосов
/ 10 января 2019

У меня есть следующая задача: «Напишите процедуру« Печать родных братьев и сестер »(p person), которая имеет в качестве входных данных имя или идентификатор человека из схемы семейного дерева и, в результате, выводит список братьев и сестер».

Таблица отношений, которая содержит информацию о преемнике (Nachfolger) и предшественнике (Vorgänger) человека. Таблица отношений

Моя процедура следующая:

create or replace procedure PrintSiblings4(p_Person varchar2)
is
  cursor c_geschwister is select nachfolger
  from relations
  where nachfolger != p_Person and vorgänger = 
    (select vorgänger from relations
    Where nachfolger = p_Person and rownum = 1) ;
  v_geschwister  c_geschwister%rowtype;
begin
  open c_geschwister;
  loop
    fetch c_geschwister into v_geschwister;
    exit when c_geschwister%NOTFOUND;
    dbms_output.put_line('geschwister' || v_geschwister);
  end loop;
end;

Я получаю следующие сообщения об ошибках от sqldeveloper, если я скомпилирую процедуру:

Ошибка (14,22): PLS-00306: неверное количество или типы аргументов в позвонить '||'

Я не могу понять, почему это не работает. Я использовал явный курсор для решения проблемы, когда получаю более 1 строки, но она не работает.

1 Ответ

0 голосов
/ 10 января 2019

изменение:

dbms_output.put_line('geschwister' || v_geschwister);

до:

dbms_output.put_line('geschwister' || v_geschwister.nachfolger);

Здесь новая (чистая / компактная) версия вашей процедуры. Мы получаем здесь все столбцы табличных отношений:

create or replace procedure print_siblings4(p_person varchar2)
is
  cursor c_geschwister is 
  select *
  from relations
  where nachfolger != p_person 
  and vorgänger = 
  (
  select vorgänger 
  from relations
  where nachfolger = p_person 
  and rownum = 1
  ) 
  ;

begin
  for r_geschwister in c_geschwister loop
    dbms_output.put_line('geschwister' || v_geschwister.nachfolger);
  end loop;
end;
...