PL/SQL数值或错误:与函数和过程混淆(Oracle PL/SQL)

PL/SQL数值或错误:与函数和过程混淆(Oracle PL/SQL),oracle,stored-procedures,plsql,runtime-error,Oracle,Stored Procedures,Plsql,Runtime Error,我之前在stackoverflow中问了一个关于某个函数的问题,我很难使用该函数,当我看到返回语句丢失时,我找到了答案 现在,我正在处理一个过程,该过程要求输入的文本字母在小写时转换为大写if,反之亦然 e、 g如果我输入'AbC',它应该返回'AbC' 到目前为止,这是我的代码 CREATE OR REPLACE PROCEDURE Opposite_Case (p_string IN VARCHAR2) IS var_string VARCHAR2(20); v

我之前在stackoverflow中问了一个关于某个函数的问题,我很难使用该函数,当我看到返回语句丢失时,我找到了答案

现在,我正在处理一个过程,该过程要求输入的文本字母在小写时转换为大写if,反之亦然

e、 g如果我输入'AbC',它应该返回'AbC'

到目前为止,这是我的代码

CREATE OR REPLACE PROCEDURE Opposite_Case (p_string IN VARCHAR2) 
IS
       var_string VARCHAR2(20);
       var_contain VARCHAR2(20);
       i NUMBER;
BEGIN

       var_string:=substr(Opposite_Case.p_string,i,1);
       var_contain:= var_string || var_contain;
       FOR i in 1.. length(var_string) 
         LOOP
           BEGIN
               IF var_string IN ('ABCDEFGHIJKLMNOPQRSTUVWXYZ') THEN
               SELECT LOWER(var_string) INTO var_contain FROM dual;
               ELSE
               SELECT UPPER(var_string) INTO var_contain FROM dual;
               END IF;
           END;    
         END LOOP;

END;
/
但返回以下错误:

EXECUTE Opposite_Case('AbC')
begin Opposite_Case('AbC'); end;
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SYS.OPPOSITE_CASE", line 10
ORA-06512: at line 1

Thanks in advance.
注:这是我使用PL/SQL语言的第三天,请耐心等待

编辑:多亏@Satya的帮助,我终于成功了。现在我可以像它应该的那样转换它们,但是我如何在一行中输出我的选择呢

我快到了。非常感谢这个社区的帮助

到目前为止,我所拥有的:

SQL> EXECUTE Opposite_Case('AbC')
A
b
C
PL/SQL procedure successfully completed

你应该调查这件事。要使用它切换字符串中字符的大小写,请执行以下操作:

SELECT TRANSLATE('AbC',
                 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
                 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
  FROM DUAL;
其中应返回“aBc”


分享和享受。

终于找到了答案!谢谢大家!(没有
翻译
但是)


更改此行var_string:=substr(反例p_string,i,1);to var_string:=substr(p_string,i,1);它应该会起作用。也只是好奇我在1。。长度(var_字符串),这不应该是我在1..length(var_字符串)@Satya-谢谢你的修复。我现在尝试了代码,但是它没有给我想要的输出(它显示空白)。还想多帮一把吗?逻辑对我来说很模糊。这次尝试删除var_contain。我真的很感激。像UPPER、LOWER、TRANSLATE等函数也是有效的PL/SQL函数,您不需要执行查询就可以使用它们。哇,这太棒了。我要试试这个。非常感谢。但问题是我们可能需要使用大写或小写。我尝试了我的代码,结果证明我的代码的逻辑是错误的。至少能给我一点线索吗?非常感谢。@user3873164-在循环之前,您将
var\u string
设置为字符串的第一个字符。在循环中,你永远不会改变它。你可能想调查一下。分享和享受。
CREATE OR REPLACE PROCEDURE Opposite_Case (p_string IN VARCHAR2) 
IS
   var_string VARCHAR2(20);
   var_contain VARCHAR2(20);
   i NUMBER;
BEGIN
   FOR i in 1.. length(p_string) 
     LOOP
       BEGIN
         var_string:=substr(p_string,i,1);
         var_contain:= var_string;
           IF var_string IN ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z') THEN
           SELECT LOWER(var_string) INTO var_contain FROM dual;
           DBMS_OUTPUT.PUT(var_contain);
           ELSE
           SELECT UPPER(var_string) INTO var_contain FROM dual;
           DBMS_OUTPUT.PUT(var_contain);
           END IF;

       END;
     END LOOP;
    dbms_output.new_line;
END;
/