Вам нужно использовать '&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'));