我需要在PL / SQL中处理两个任务:
是否显示字符串中每个单词的第一个字符,例如“标准查询语言”,因此它应该返回值为“SQL”。
将文本“apple”转换为上限“APPLE”,但不使用大写或小写预定义函数。
是否可以在PL / SQL中使用高级功能而不是初级级别的方法。
答案 0 :(得分:4)
是的,在PL / SQL中很多东西是可能的,但一般情况下如果你可以在SQL中这样做,那么就不要使用程序方法重新发明内置功能(正如OMG Ponies评论的regex可能是一个很好的方法)。
那就是说,如果真的希望通过char迭代字符串char,你可以做类似的事情:
declare
in_string varchar2(20) := 'Im a string';
in_length number;
cnt number := 0;
in_char char(1);
begin
in_length := length(in_string);
while (cnt < in_length)
loop
cnt := cnt + 1;
in_char := substr(in_string, cnt, 1);
-- do something wonderful here
end loop;
exception
when others then raise;
end;
但是,再次,如果你只能使用UPPER函数,不要这样做大写一个字符串(例如);)
希望这有帮助。
答案 1 :(得分:2)
对于(1),我会INITCAP
select initcap (lower('Structured query Language'))
from dual
然后遍历字符串寻找那些大写字母。
答案 2 :(得分:2)
正规表达救援!
提取每个单词的第一个字符:
select regexp_replace ('Structured Query Language', ' \*(.)[^ ]\*', '\1' ) from dual;
答案 3 :(得分:1)
我已经编写了执行上述两项任务的代码,它们运行正常,没有添加异常处理或验证。
(1) DECLARE
NAME VARCHAR2(100):='&NAM';
CURR_CHAR VARCHAR2(1);
ABBRV VARCHAR2(100);
BEGIN
ABBRV := SUBSTR(NAME,1,1);
FOR I IN 1..LENGTH(NAME) LOOP
CURR_CHAR := SUBSTR(NAME,I,1);
IF CURR_CHAR = CHR(32) THEN
-- &PL('SPACE');
ABBRV := ABBRV || SUBSTR(NAME,I+1,1);
END IF;
END LOOP;
&PL('ABBRIVATION OF : ' || NAME);
&PL(' IS ... : ' || ABBRV);
END;
(2)DECLARE
VALUE VARCHAR2(100) := '&VAL';
CURR_CHAR VARCHAR2(1);
UPPER_CASE VARCHAR2(100);
BEGIN
FOR I IN 1..LENGTH(VALUE) LOOP
CURR_CHAR := SUBSTR(VALUE,I,1);
UPPER_CASE := UPPER_CASE || CHR(ASCII(CURR_CHAR)-32);
END LOOP;
&PL(' UPPER CASE : ' || UPPER_CASE);
END;
答案 4 :(得分:1)
是否显示字符串中每个单词的第一个字符,例如“标准查询语言”,因此它应该将值返回为“SQL”。
DECLARE
STR VARCHAR(100):='Standard Query Language';
J NUMBER;
BEGIN
FOR I IN 1..LENGTH(STR) LOOP
IF SUBSTR(STR,I,1)=' ' THEN
J:=I+1;
DBMS_OUTPUT.PUT(SUBSTR(STR,J,1));
END IF;
IF I=1 THEN
DBMS_OUTPUT.PUT(SUBSTR(STR,I,1));
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
END;
将文本“apple”转换为上限“APPLE”,但不使用大写或小写预定义函数。
DECLARE
STR VARCHAR2(10):='kiran';
BEGIN
FOR I IN 1..LENGTH(STR) LOOP
DBMS_OUTPUT.PUT(CHR(ASCII(SUBSTR(STR,I,1))-32));
END LOOP;
DBMS_OUTPUT.PUT_LINE(' ');
END;