Передать символ функции и вернуть, сколько имен сотрудников начинаются с принятого символа? - PullRequest
0 голосов
/ 06 января 2019

Я создал функцию для передачи символа и возврата счетчика имени сотрудника, начинающегося с принятого символа. Вопрос в том, когда я выполняю функцию PLSQL с использованием блока PLSQL, возникает «PLS-00201: должен быть объявлен идентификатор« G »»

Я выполнил функцию с помощью оператора select, и вывод успешно отображается, но когда я пытаюсь выполнить функцию с использованием блока PLSQL Ошибка: PLS-00201: должен быть объявлен идентификатор «G»

create or replace function charcount(v_char in varchar2)

return varchar2

is

v_character number;

begin 

select count(*) into v_character from employees where substr(First_name,1,1)= v_char;

return v_character;

end;

Выполнение функции PLSQL с использованием блока PLSQL:

declare 

 v_char char;

 v_count number;

begin

 v_char:=&v_char;

 v_count:=charcount(v_char);

 dbms_output.put_line(v_count);

end;

Введите переменную подстановки

v_char=G.

output=11.

1 Ответ

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

Вам нужно использовать '&v_char' вместо &v_char в вашем вызывающем блоке. & переменные заменяются с помощью буквенной подстановки - они не похожи на обычные программные переменные.

declare 
    v_char varchar2(1) := '&textinput';
    v_count number;
begin 
    v_count := charcount(v_char);    
    dbms_output.put_line(v_count);
end;

Обратите внимание, что в PL / SQL вы можете присвоить значение при объявлении переменной, которая сохраняет шаг позже.

Также я исправил char к стандартному строковому типу Oracle, varchar2.

Для удобства чтения я предпочитаю оставлять пробел по обе стороны от оператора присваивания. Я считаю, что x := y обычно более читабелен, чем x:=y. Кроме того, я думаю, что промышленный стандарт для отступов - 2 или 4 (и лично я не заинтересован в 2), и что-либо меньшее или большее, чем это, выглядит излишне странным.

В рамках вашей функции вы можете изменить

where substr(first_name,1,1) = v_char;

до

where first_name like v_char||'%';

чтобы использовать любой индекс на first_name. (Это также позволит вам передать строку из более чем одного символа.)

Кстати, обычно принято использовать префикс v_ для переменных ('v' для переменная или иногда 'l' для локальная переменная ), и что-то еще для параметров (обычно p_, иногда in_ / out_ / inout_).

Соединение всего этого дает:

create or replace function charcount
    ( p_matchstring in varchar2 )
    return varchar2
is
    l_num_matching number;
begin
    select count(*) into l_num_matching
    from   employees
    where  first_name like p_matchstring||'%';

    return l_num_matching;
end charcount;

Вызов из SQL * Plus или другого клиента, который поддерживает переменные подстановки:

SQL> declare
  2      v_char varchar2(1) := '&textinput';
  3      v_count number;
  4  begin
  5      v_count := charcount(v_char);
  6      dbms_output.put_line(v_count);
  7  end;
  8  /
Enter value for textinput: A
10

или даже просто

begin
    dbms_output.put_line(charcount('&textinput'));
end;

или (с помощью команды SQL * Plus exec[ute] - хотя это не является частью SQL или PL / SQL):

exec dbms_output.put_line(charcount('&textinput'))

или стандарт SQL call оператор :

call dbms_output.put_line(charcount('&textinput'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...