【问题标题】:Pass a character to a function and return how many employee name start with accepted character?将字符传递给函数并返回有多少员工姓名以接受的字符开头?
【发布时间】:2019-01-06 09:16:14
【问题描述】:

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

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    您需要在调用块中使用'&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_,或者有时是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*Plus exec[ute] command - 虽然这不是 SQL 或 PL/SQL 的一部分):

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

    SQL standard call statement

    call dbms_output.put_line(charcount('&textinput'));
    

    【讨论】:

    • 如何在我的 Plsql 函数中使用 If 条件检查计数是否 > 1 然后返回 v_count 否则返回 0
    • @Bruno - 这并不难;但是如果计数 = 1,为什么要让函数返回 0?这没有任何意义。
    • 完整解释 OP 收到的错误:当像他一样调用函数时,PL/SQL 解释器看到调用 v_count := charcount(G)。该函数采用varchar2 参数;所以它期望 G 解析为 varchar2 值。它本身不是一个字符串(它没有用单引号括起来);相反,它是一个不带引号的字符串,这在 PL/SQL 中意味着它必须是一个标识符。在这种情况下,它必须是一个变量。如果该函数是在 SQL 中调用的,例如在select charcount(G) from dual 中,他会得到一个不同的错误:“invalid identifier”。
    • 在这两种情况下,问题都是一样的:G 必须是一个变量,或者是一个列名——并且在匿名 PL/SQL 块中没有变量 G,resp。 DUAL 中没有 G 列。
    • 使用 plsql 块执行函数:声明 v_char char; v_count 个数;开始 v_char:='&v_char'; v_count:=charcount(v_char); if(v_count>=1) then dbms_output.put_line('姓名以'||'开头的员工人数'||v_char||'='||v_count); else dbms_output.put_line('没有这样的员工姓名以'||' '||v_char);万一;结束;
    猜你喜欢
    • 2012-02-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 2018-01-15
    相关资源
    最近更新 更多