Oracle 读一个字符串并显示其中的元音和辅音

Oracle 读一个字符串并显示其中的元音和辅音,oracle,plsql,Oracle,Plsql,我的任务是阅读一个字符串,并显示该字符串中的元音字符串和辅音字符串。例如,如果我有字符串:aaceb,那么元音字符串将是:aae,辅音字符串将是:cb。我自己尝试过一些东西,但我有一些错误(错误从命令的第3行开始),我不知道为什么。非常感谢:D set serveroutput on accept p_sir prompt "Sir="; declare v varchar2(20):=&p_sir; vocale varchar2(20); consoane varchar2(20)

我的任务是阅读一个字符串,并显示该字符串中的元音字符串和辅音字符串。例如,如果我有字符串:aaceb,那么元音字符串将是:aae,辅音字符串将是:cb。我自己尝试过一些东西,但我有一些错误(错误从命令的第3行开始),我不知道为什么。非常感谢:D

set serveroutput on
accept p_sir prompt "Sir=";
declare 
v varchar2(20):=&p_sir;
vocale varchar2(20);
consoane varchar2(20);
c varchar2(1);

begin
 for i in 1..length(v) loop
  c:=substr(v,i,1);
  case
    when c='a' then vocale:=vocale||c;
    when c='e' then vocale:=vocale||c;
    when c='i' then vocale:=vocale||c;
    when c='o' then vocale:=vocale||c;
    when c='u' then vocale:=vocale||c;
    else consoane:=consoane||c;
end case;

--dbms_output.put_line(c);
end loop;

dbms_output.put_line('vocale: ' ||vocale||' consoane:'||consoane);
end;
/
概念证明:

SQL> begin
  2  dbms_output.put_line(translate('mathguy', 'zAEIOUaeiou', 'z'));
  3  end;
  4  /

mthgy

PL/SQL procedure successfully completed.
概念证明:

SQL> begin
  2  dbms_output.put_line(translate('mathguy', 'zAEIOUaeiou', 'z'));
  3  end;
  4  /

mthgy

PL/SQL procedure successfully completed.

使用正则表达式执行以下操作:

  • 删除非元音
    [^aeiou]
    ,只留下元音
  • 删除元音
    [aeiou]
    和非字母字符
    [^a-z]
    ,只留下辅音
像这样:

DECLARE
  v_text VARCHAR2(200) := 'Your text string';
BEGIN
  DBMS_OUTPUT.PUT_LINE(
    'Vowels: ' || REGEX_REPLACE( v_text, '[^aeiou]', NULL, 1, 0, 'i' )
  );
  DBMS_OUTPUT.PUT_LINE(
    'Consonants: ' || REGEX_REPLACE( v_text, '[aeiou]|[^a-z]', NULL, 1, 0, 'i' )
  );
END;
/

使用正则表达式执行以下操作:

  • 删除非元音
    [^aeiou]
    ,只留下元音
  • 删除元音
    [aeiou]
    和非字母字符
    [^a-z]
    ,只留下辅音
像这样:

DECLARE
  v_text VARCHAR2(200) := 'Your text string';
BEGIN
  DBMS_OUTPUT.PUT_LINE(
    'Vowels: ' || REGEX_REPLACE( v_text, '[^aeiou]', NULL, 1, 0, 'i' )
  );
  DBMS_OUTPUT.PUT_LINE(
    'Consonants: ' || REGEX_REPLACE( v_text, '[aeiou]|[^a-z]', NULL, 1, 0, 'i' )
  );
END;
/


你得到了什么错误?我认为你需要类似的东西,但一个数组使用两个来分隔元音和辅音。错误报告-ORA-06550:第2行,第17列:PLS-00201:标识符“AACEB”必须声明为ORA-06550:第2行,第3列:PL/SQL:项忽略ORA-06550:第8行,第20列:PLS-00320:此表达式类型的声明不完整或格式错误ORA-06550:第8行,第1列:PL/SQL:语句忽略06550。00000-“行%s,列%s:\n%s”*原因:通常是PL/SQL编译错误*操作:这是针对您正在使用的PL/SQL类的吗?这对于SQL来说是微不足道的工作(您可以在PL/SQL中使用相同的函数)。例如,要获取辅音字符串,请使用
translate(input_string,'zAEIOUaeiou','z')
-将每个wowel替换为零(
null
),这样结果就是输入字符串中的辅音。如果可能还有其他符号(空格、+等)必须删除,请将它们添加到
TRANSLATE
中的列表中。我更喜欢在SQL中使用TRANSLATE选项来执行此操作,但如果您在输入变量的用法上添加引号,则脚本将起作用。v varchar2(20):“&p_先生”;你得到了什么错误?我认为你需要类似的东西,但一个数组使用两个来分隔元音和辅音。错误报告-ORA-06550:第2行,第17列:PLS-00201:标识符“AACEB”必须声明为ORA-06550:第2行,第3列:PL/SQL:项忽略ORA-06550:第8行,第20列:PLS-00320:此表达式类型的声明不完整或格式错误ORA-06550:第8行,第1列:PL/SQL:语句忽略06550。00000-“行%s,列%s:\n%s”*原因:通常是PL/SQL编译错误*操作:这是针对您正在使用的PL/SQL类的吗?这对于SQL来说是微不足道的工作(您可以在PL/SQL中使用相同的函数)。例如,要获取辅音字符串,请使用
translate(input_string,'zAEIOUaeiou','z')
-将每个wowel替换为零(
null
),这样结果就是输入字符串中的辅音。如果可能还有其他符号(空格、+等)必须删除,请将它们添加到
TRANSLATE
中的列表中。我更喜欢在SQL中使用TRANSLATE选项来执行此操作,但如果您在输入变量的用法上添加引号,则脚本将起作用。v varchar2(20):“&p_先生”;OP还需要元音字符串。我不明白是什么,但看起来很有趣efficient@JuanCarlosOropeza-如果OP或其他任何人理解这是如何工作的(只得到辅音),那么调整它以得到元音应该是很简单的。我通常试图向人们展示如何做事,而不是为他们做所有的工作。然后:我不知道你所说的“我不明白它的作用”是什么意思——你是说你不熟悉翻译?这是一个标准的Oracle函数。由于此函数的奇怪行为,需要使用“z”;不应该有“z”,但是如果第三个参数为空,则不管其他两个参数如何,函数都返回NULL。是的,我不熟悉translate。
z
看起来很奇怪。寻找元音字符串是否需要放置所有字符。@JuanCarlosOropeza-并且,为了澄清:由于这是一个学习练习,而不是用于生产,我提供了这个解决方案,因为它将通过演示翻译的使用来帮助OP(以及学习SQL的同一阶段的任何其他人)。许多人只是学习正则表达式,当有人重写他们的查询时,他们会感到惊讶,因为它们运行得更快。REGEXP是唯一教给他们的东西,所以他们不知道还有其他工具。OP还需要元音字符串。我不明白是什么,但看起来很有趣efficient@JuanCarlosOropeza-如果OP或其他任何人理解这是如何工作的(只得到辅音),那么调整它以得到元音应该是很简单的。我通常试图向人们展示如何做事,而不是为他们做所有的工作。然后:我不知道你所说的“我不明白它的作用”是什么意思——你是说你不熟悉翻译?这是一个标准的Oracle函数。由于此函数的奇怪行为,需要使用“z”;不应该有“z”,但是如果第三个参数为空,则不管其他两个参数如何,函数都返回NULL。是的,我不熟悉translate。
z
看起来很奇怪。寻找元音字符串是否需要放置所有字符。@JuanCarlosOropeza-并且,为了澄清:由于这是一个学习练习,而不是用于生产,我提供了这个解决方案,因为它将通过演示翻译的使用来帮助OP(以及学习SQL的同一阶段的任何其他人)。许多人只是学习正则表达式,当有人重写他们的查询时,他们会感到惊讶,因为它们运行得更快。REGEXP是他们唯一学到的东西,所以他们不知道还有其他工具。