Как отобразить курсор в процедуре? - PullRequest
0 голосов
/ 25 марта 2019

Мне нужно отобразить имя и фамилию каждого из команды, в которой есть один и тот же менеджер (его имя и фамилия взяты из параметра).

Я пробовал 'IN' до VARCHAR2.Я использовал set serveroutput on.Кроме того, выбор из курсора отдельно работает.

CREATE OR REPLACE PROCEDURE ex_2h(nazw VARCHAR2, imi VARCHAR2)
IS
CURSOR team IS SELECT * FROM people p WHERE p.id_manager= 
(SELECT id_ppl FROM people WHERE name= imi AND surname=nazw);
tmp people%ROWTYPE;
BEGIN
OPEN team;
LOOP
    FETCH team INTO tmp;
    EXIT WHEN team%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(NVL(tmp.name, '?'));
END LOOP;
CLOSE team;
END;

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

1 Ответ

1 голос
/ 25 марта 2019

Кто знает?Сама процедура выглядит нормально (кроме того факта, что вы открыли курсор КОМАНДЫ и извлекли его из ZESPOL (который никогда не был объявлен).

  • может быть регистром букв (это имена, написанные в нижнем / верхнем регистре)/ смешанный регистр)?
  • Вас смущает порядок параметров? Фамилия первая, имя следующее? Должно ли это быть наоборот (т.е. imi VARCHAR2, nazw VARCHAR2)
  • всегда используйте псевдонимы, особенно когда вы используете одну и ту же таблицу дважды (или более раз)

Вот тестовый пример, который показывает, что работает , если вы используете его правильно. Обратите внимание, что яЯ переключился на цикл курсора FOR, который легче поддерживать.

SQL> create table people
  2    (id_ppl     number,
  3     name       varchar2(10),
  4     surname    varchar2(10),
  5     id_manager number);

Table created.

SQL> insert all
  2    into people values (1, 'Little', 'Foot', 1)   --> the same ...
  3    into people values (2, 'Big'   , 'Foot', 1)   --> ... manager
  4    into people values (3, 'Stack' , 'Over', 2)
  5  select * from dual;

3 rows created.

SQL> set serveroutput on;

Процедура:

SQL> create or replace procedure ex_2h (p_nazw in varchar2, p_imi in varchar2)
  2  is
  3  begin
  4    for tmp in (select p.name from people p
  5                where p.id_manager = (select p1.id_ppl
  6                                      from people p1
  7                                      where p1.name = p_imi
  8                                        and p1.surname = p_nazw
  9                                     )
 10               )
 11    loop
 12      dbms_output.put_line(nvl(tmp.name, '?'));
 13    end loop;
 14  end;
 15  /

Procedure created.

Проверка:

SQL> exec ex_2h('Foot', 'Little');
Little
Big

PL/SQL procedure successfully completed.

SQL>

Я предлагаюпопробуйте это таким образом. Если это не сработает, пожалуйста, опубликуйте дополнительную информацию - CREATE TABLE и примеры данных, чтобы мы могли увидеть, что у вас есть на самом деле и как Oracle реагирует (и почему).

...