PL / SQL строковые задачи - PullRequest
       5

PL / SQL строковые задачи

1 голос
/ 01 февраля 2011

Мне нужно поработать над двумя задачами в PL / SQL:

  1. Должен отображать первые символы каждого слова в строке, например «Стандартный язык запросов», поэтому он должен вернутьзначение как «SQL».

  2. преобразование текста "apple" в верхние заглавные буквы "APPLE", но без использования предопределенных функций в верхнем или нижнем регистре.

возможно в PL / SQL, не используя расширенные функции уровня, а просто подход начального уровня.

Ответы [ 5 ]

4 голосов
/ 01 февраля 2011

Да, в PL / SQL возможно много вещей, но в целом, если вы можете сделать это в SQL, не изобретайте встроенную функциональность, используя процедурный подход (регулярное выражение, как прокомментировал OMG Ponies, вероятно, было бы хорошим подходом здесь).).

Тем не менее, если вы действительно хотели бы перебирать строковый символ по символу, вы, вероятно, можете сделать что-то вроде:

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

Надеюсь, это поможет.

2 голосов
/ 02 февраля 2011

Регулярные выражения на помощь!

Чтобы извлечь первый символ каждого слова:

select regexp_replace ('Structured Query Language', ' \*(.)[^ ]\*', '\1' ) from dual;
2 голосов
/ 02 февраля 2011

Для (1) я бы INITCAP

select initcap (lower('Structured query Language'))
from dual

Затем перебрал бы строку, ища эти заглавные буквы.

1 голос
/ 20 августа 2012
  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;
    
  2. преобразование текста "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;
    
1 голос
/ 02 февраля 2011

Я написал код для выполнения обеих упомянутых выше задач, они отлично работают, не добавили обработку исключений или проверку.

(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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...