Я не могу напечатать следующую пирамиду в оракуле. (PL / SQL Block) - PullRequest
1 голос
/ 20 ноября 2019

Я хочу напечатать следующую пирамиду: -

 ORACLE
 ORACL
 ORAC
 ORA
 OR
 O

Ответы [ 4 ]

5 голосов
/ 21 ноября 2019

Несколько короче код, чем предыдущие ответы:

SQL> select substr('ORACLE', 1, level) val
  2  from dual
  3  connect by level <= length('ORACLE')
  4  order by level desc;

VAL
------------------------
ORACLE
ORACL
ORAC
ORA
OR
O

6 rows selected.

SQL>
2 голосов
/ 21 ноября 2019

Вот простой код: -

DECLARE
VAL VARCHAR2(200):='ORACLE';
OT VARCHAR2(200);
BEGIN
    FOR I IN REVERSE 1..LENGTH(VAL) LOOP
        OT:=SUBSTR(VAL,1,I);
        DBMS_OUTPUT.PUT_LINE(OT);
    END LOOP;
END;    
2 голосов
/ 20 ноября 2019

Вот вариант, если вам нужен простой PL / SQL.

declare
  v_str varchar2(6) := 'ORACLE';
begin
  for i in 0 .. length(v_str) loop
    dbms_output.put_line(substr(v_str, 1, length(v_str)-i));
  end loop;
end;
/
2 голосов
/ 20 ноября 2019

Вы можете достичь этого, используя выражение With и соединитель LEVEL

with str as (select 'ORACLE' as str 
               from dual
            )
select substr(s.str, 1, length(s.str)+1 - level) as Pyramid
  from str s
 connect by level-(length(s.str)-1) <= (length(s.str)+1) - level   
  ;

, также если вам нужен блок PL / SQL, то решение:

set serveroutput on
declare v_pyramid varchar2(100);
begin 
  with str as (select 'ORACLE' as str from dual)
   select listagg(t.Pyramid, chr(13)) within group (order by t.lvl) 
     into v_pyramid
     from ( select substr(s.str, 1, length(s.str)+1 - level) as Pyramid
                 , level as lvl
              from str s
           connect by level-(length(s.str)-1) <= (length(s.str)+1) - level   
          ) t ;
  dbms_output.put_line(v_pyramid); 
end; 

удачи:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...