Oracle 在我的PLSQL程序中,查找输入字符串中的元音并检查其是否为回文,有什么错误?

Oracle 在我的PLSQL程序中,查找输入字符串中的元音并检查其是否为回文,有什么错误?,oracle,plsql,Oracle,Plsql,这是我为PLSQL程序编写的代码,用于计算用户输入的字符串中的元音数,并检查其是否为回文,并将其显示为输出 SET SERVEROUTPUT ON DECLARE STR VARCHAR(30); N VARCHAR(30); REV VARCHAR(30); L NUMBER(10); TEMP VARCHAR(30); C NUMBER(10):=0; BEGIN STR:='&STR'; TEMP:=STR; L:=LENGTH(STR);

这是我为PLSQL程序编写的代码,用于计算用户输入的字符串中的元音数,并检查其是否为回文,并将其显示为输出

SET SERVEROUTPUT ON

DECLARE
  STR VARCHAR(30);
  N VARCHAR(30);
  REV VARCHAR(30);
  L NUMBER(10);
  TEMP VARCHAR(30);
  C NUMBER(10):=0;
BEGIN
  STR:='&STR';
  TEMP:=STR;
  L:=LENGTH(STR);
  FOR I IN 1..L
  LOOP
    REV:=(REV||SUBSTR(STR,L,1));
    N:=SUBSTR(STR,I,1);
    IF N IN ('A','E','I','O','U','a','e','i','o','u')
    THEN
      C:=C+1;
    END IF;
    L:=L-1;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('ENTERED STRING IS '||STR);
  DBMS_OUTPUT.PUT_LINE('THE NUMBER OF VOWELS IN THE STRING IS:'||C);
  IF(TEMP=REV)
  THEN
    DBMS_OUTPUT.PUT_LINE('ITS A PALINDROME');
  ELSE
    DBMS_OUTPUT.PUT_LINE('ITS NOT A PALINDROME');
  END IF;
END;
/
我在SQL*Plus中尝试了这个程序,并将其作为输出


有什么办法吗

这里是另一种解决方案,而不是修复代码

declare
  STR varchar2(30);
  REV varchar2(30);
  C number(10) := 0;
begin
  STR:='&STR';
  select reverse(STR) into REV from DUAL;
  C := regexp_count(STR, '[AEIOUaeiou]');
  DBMS_OUTPUT.PUT_LINE(to_char(C));
  if STR = REV then
    DBMS_OUTPUT.PUT_LINE('Palindrome.');
  end if;
end;
DECLARE
  STR VARCHAR2(30);
  N CHAR(1);
  REV VARCHAR2(30);
  L NUMBER(10);
  C NUMBER(10):=0;
BEGIN
  STR:='&STR';
  L:=LENGTH(STR);
  FOR I IN 1..L
  LOOP
    N:=SUBSTR(STR,(I * -1),1);
    REV:=REV||N;
    IF N IN ('A','E','I','O','U','a','e','i','o','u') THEN
      C:=C+1;
    END IF;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('ENTERED STRING IS '||STR);
  DBMS_OUTPUT.PUT_LINE('THE NUMBER OF VOWELS IN THE STRING IS:'||C);
  IF(STR=REV) THEN
    DBMS_OUTPUT.PUT_LINE('ITS A PALINDROME');
  ELSE
    DBMS_OUTPUT.PUT_LINE('ITS NOT A PALINDROME');
  END IF;
END;
参考和

下面是我在SQL*Plus中运行上述代码时的示例输出

编辑 我对你代码的修复

declare
  STR varchar2(30);
  REV varchar2(30);
  C number(10) := 0;
begin
  STR:='&STR';
  select reverse(STR) into REV from DUAL;
  C := regexp_count(STR, '[AEIOUaeiou]');
  DBMS_OUTPUT.PUT_LINE(to_char(C));
  if STR = REV then
    DBMS_OUTPUT.PUT_LINE('Palindrome.');
  end if;
end;
DECLARE
  STR VARCHAR2(30);
  N CHAR(1);
  REV VARCHAR2(30);
  L NUMBER(10);
  C NUMBER(10):=0;
BEGIN
  STR:='&STR';
  L:=LENGTH(STR);
  FOR I IN 1..L
  LOOP
    N:=SUBSTR(STR,(I * -1),1);
    REV:=REV||N;
    IF N IN ('A','E','I','O','U','a','e','i','o','u') THEN
      C:=C+1;
    END IF;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('ENTERED STRING IS '||STR);
  DBMS_OUTPUT.PUT_LINE('THE NUMBER OF VOWELS IN THE STRING IS:'||C);
  IF(STR=REV) THEN
    DBMS_OUTPUT.PUT_LINE('ITS A PALINDROME');
  ELSE
    DBMS_OUTPUT.PUT_LINE('ITS NOT A PALINDROME');
  END IF;
END;

参考函数。

我不确定推荐某人使用未记录的函数是否是个好主意。相反,我是其中之一。WM_CONCAT另一个版本(在12c及以上版本中甚至不存在),因此,一旦Oracle将其从未来版本中删除,使用这些版本的任何人都可能需要修复(大量?)其代码。