我创建了一个传递字符的函数,并以可接受的字符开头返回员工姓名的计数。问题是,当我使用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.
答案 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;
exec dbms_output.put_line(charcount('&textinput'))