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

时间:2014-10-26 03:12:17

标签: oracle stored-procedures plsql runtime-error

我之前在stackoverflow中询问了一个关于我遇到困难的某个函数的问题,当我看到RETURN语句丢失时,我找到了答案。

现在,我正在处理一个过程,该过程要求输入文本字母在LOWER情况下转换为UPPER,反之亦然。

例如,如果我放入' 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.

PS。这只是我使用PL / SQL语言的第3天,所以请耐心等待。

编辑:我终于感谢@ Satya的帮助了。现在我按照它应该转换它们但是如何在一行中输出我的选择?

我几乎就在那里。感谢这个社区的帮助!!

到目前为止我所拥有的:

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

2 个答案:

答案 0 :(得分:1)

您应该调查TRANSLATE function。要使用它来切换字符串中字符的大小写,您可以执行以下操作:

SELECT TRANSLATE('AbC',
                 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
                 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
  FROM DUAL;

应返回'aBc'。

SQLFiddle here

分享并享受。

答案 1 :(得分:0)

终于找到了答案!多谢你们! (虽然没有TRANSLATE)!

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;
/