我已经创建了一个函数来传递一个字符,并返回以接受的character.Issue开头的员工名称计数。当我使用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.发布于 2019-01-06 10:02:02
您需要在调用块中使用'&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_,有时为p_)。
把所有这些加在一起,就会:
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;或者(使用 command -尽管这不是SQL或PL/SQL的一部分):
exec dbms_output.put_line(charcount('&textinput'))或者 statement
call dbms_output.put_line(charcount('&textinput'));https://stackoverflow.com/questions/54060148
复制相似问题