将字符传递给函数并返回以可接受的字符开头的多少个员工姓名?

时间:2019-01-06 09:16:15

标签: 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;

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.

1 个答案:

答案 0 :(得分:3)

您需要在调用块中使用Route::group(['prefix' => 'admin', 'middleware' => 'role:admin'], function() { Route::apiResource('measure', 'MeasureTypeController'); }); Route::group(['middleware' => 'role:user'], function() { Route::apiResource('measure', 'MeasureTypeController')->except(['create','store', 'update', 'destroy' ]); }); 而不是'&v_char'&v_char变量是使用文字替换来替换的-与普通程序变量不同。

&

请注意,在PL / SQL中,可以在声明变量时分配一个值,这样可以节省以后的步骤。

我也将declare v_char varchar2(1) := '&textinput'; v_count number; begin v_count := charcount(v_char); dbms_output.put_line(v_count); end; 更正为标准的Oracle字符串类型char

出于可读性考虑,我宁愿在赋值运算符的两侧留一个空格。我发现varchar2通常比x := y更具可读性。另外,我认为缩进的行业标准是2或4(我个人并不热衷于2),并且任何比这少或多的东西看起来都是不必要的怪异。

在您的功能内,您可以考虑更改

x:=y

where substr(first_name,1,1) = v_char;

利用where first_name like v_char||'%'; 上的任何索引。 (它还将允许您传递一个以上字符的字符串。)

顺便说一句,通常的约定是对变量使用first_name前缀(对于 variable 使用'v',对于 local variable 有时使用'l' >),以及其他参数(通常为v_ / p_ / in_ / out_)。

将所有内容放在一起可得出:

inout_

从SQL * Plus或其他支持替换变量的客户端调用:

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> 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

或(使用SQL*Plus exec[ute] command-尽管它不是SQL或PL / SQL的一部分):

begin
    dbms_output.put_line(charcount('&textinput'));
end;

SQL standard call statement

exec dbms_output.put_line(charcount('&textinput'))