Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 将一个字符传递给函数并返回以接受字符开头的员工姓名数量?_Oracle_Plsql - Fatal编程技术网

Oracle 将一个字符传递给函数并返回以接受字符开头的员工姓名数量?

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

我创建了一个函数来传递一个字符,并返回以接受字符开头的员工姓名计数。问题是当我使用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.

您需要在调用块中使用
'&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'));