您需要在调用块中使用'&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] command - 虽然这不是 SQL 或 PL/SQL 的一部分):
exec dbms_output.put_line(charcount('&textinput'))
或SQL standard call statement:
call dbms_output.put_line(charcount('&textinput'));