Oracle 将一个字符传递给函数并返回以接受字符开头的员工姓名数量?
我创建了一个函数来传递一个字符,并返回以接受字符开头的员工姓名计数。问题是当我使用PLSQL块执行PLSQL函数时,“PLS-00201:必须声明标识符“G” 我已使用select语句执行了函数,输出显示成功,但当我尝试使用PLSQL块执行函数时,错误:PLS-00201:必须声明标识符“G”Oracle 将一个字符传递给函数并返回以接受字符开头的员工姓名数量?,oracle,plsql,Oracle,Plsql,我创建了一个函数来传递一个字符,并返回以接受字符开头的员工姓名计数。问题是当我使用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; be
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.
您需要在调用块中使用
'&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),任何小于或大于2的东西看起来都不必要的怪异
在您的函数中,您可以考虑更改
where substr(first_name,1,1) = v_char;
到
利用first\u 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或PL/SQL的一部分):
或:
如何使用If条件检查计数是否大于1,然后在我的Plsql中返回v_count,否则返回0function@Bruno-这并不难做到;但是如果计数为=1,为什么希望函数返回0?这毫无意义。为了充分解释OP收到的错误:当像他那样调用函数时,PL/SQL解释器看到调用
v\u count:=charcount(G)
。函数采用varchar2
参数;因此它期望G
解析为varchar2值。它本身不是一个字符串(不包含在单引号中);相反,它是一个不带引号的字符串,在PL/SQL中,这意味着它必须是一个标识符。在这种情况下,它必须是一个变量。如果改为在SQL中调用该函数,例如在select charcount(G)from dual
中,他将得到一个不同的错误:“无效标识符”。在这两种情况下,问题是相同的:G必须是变量或列名,并且匿名PL/SQL块中没有变量G,分别是。DUAL中没有列G。使用plsql块执行函数:declare v_char;v_计数编号;开始v_char:='&v_char';v_count:=字符数(v_char);如果(v|u count>=1),则dbms|u output.put|line('姓名以'||'''.'v|u char |'='v| u count'开头的员工人数);else dbms_output.put_line('没有以'||''.|v|字符开头的员工姓名);如果结束;结束;
begin
dbms_output.put_line(charcount('&textinput'));
end;
exec dbms_output.put_line(charcount('&textinput'))
call dbms_output.put_line(charcount('&textinput'));