首页 > 解决方案 > PL/SQL LOOP - 返回包含混合大写字母的行

问题描述

我知道这个问题可能有一个简单的答案,但我无法理解它。我试图在一个循环中返回一个混合了大写字母和非大写字母的字符串(在 SQL 输出中)。

示例:如果行中的名称是 John Doe,则输出将打印 JoHn DoE 或 MiXeD CapiTaL。这是我的代码(我知道写得不好,但我需要使用光标!):

declare

 aa_ VARCHAR2(2000);
 bb_ NUMBER:=0;
cc_ NUMBER:=0;

 CURSOR cur_ IS
 
 SELECT first_name namn, last_name efternamn FROM person_info
 ;
 
 begin
       
         FOR rec_ IN cur_ LOOP  
         
         
          dbms_output.put_line(rec_.namn);

       
       FOR bb_ IN 1.. LENGTH(rec_.namn) LOOP
          
          dbms_output.put(UPPER(SUBSTR(rec_.namn,bb_,1)));


     
  cc_ := MOD(bb_,2);

          
 IF cc_ = 0 THEN
 
dbms_output.put(UPPER(SUBSTR(rec_.namn,cc_,1))); 

 ELSE 
 
dbms_output.put(LOWER(SUBSTR(rec_.namn,2)));


END IF;
 
   
 end loop;
 
 dbms_output.new_line;
 
 
 end loop;
 
     end;

再一次,我知道代码真的很糟糕,但是,是的,努力学习!

提前致谢 :)

标签: sqloracleloopsplsql

解决方案


您可以为此目的使用纯 SQL,而无需任何循环:

  1. 将输入文本成对分割,并用一些特殊字符(未出现在文本中)分隔。
  2. 使用initcapSQL 函数将每个首字母转为大写。
  3. 删除特殊分隔符。
with a as (
  select 'John Doe' as a
  from dual
  union all
  select 'mixed capital and non-capital letters'
  from dual
)
select
  replace(
    initcap(
      /*Convert case*/
      regexp_replace(a, '([a-zA-Z]{2})',
        /*Add ASCII nul after each two letters*/
        '\1' || chr(0)
      )
    ),
    /*Remove ASCII nul to revert changes*/
    chr(0)
  ) as mixed_case
from a
| 混合案例 |
| :------------------------------------------------ |
| 约翰·多伊 |
| 混合大写和非大写字母 |

db<>在这里摆弄


推荐阅读