предупреждение: функция создана с ошибками компиляции - PullRequest
1 голос
/ 26 июня 2019

Я получаю сообщение об ошибке при выполнении следующей функции. Я уже некоторое время бьюсь головой. Я новичок в oracle, поэтому не могу его исправить. Может кто-нибудь помочь, пожалуйста?

create or replace function rever(x int)
return number
is
y varchar2(30);
c varchar2(30);
v int;
begin
y:=to_char(x);
c:=reverse(y);
v:=to_number(c);
return v;
end rever;
/

в качестве сообщения об ошибке отображается следующее сообщение

LINE/COL ERROR
-------- ----------------------------------------------------------------- 
9/1      PL/SQL: Statement ignored 
9/4      PLS-00201: identifier 'REVERSE' must be declared

Ответы [ 3 ]

2 голосов
/ 26 июня 2019

Oracle не предоставляет функции в plsql для обращения строки.

     create or replace function rever(x int)
     return number
     is
       y varchar2(30);
       c varchar2(30);
       v int;
     begin
       y:=to_char(x);

       -- Loop other each char in a string from the last to the first element  
       for i in reverse 1.. length(y)
       loop 
         c:= c|| substr(y,i,1); 
       end loop; 
       v:=to_number(c);
       return v;
     end rever;
     /

Тест:

     begin
       dbms_output.put_line(rever(1));
       dbms_output.put_line(rever(12));
       dbms_output.put_line(rever(21));
       dbms_output.put_line(rever(123));
     end;
     /

Результат:

dbms_output
    1
    21
    12
    321

дБ <> скрипка здесь

1 голос
/ 26 июня 2019

В Oracle нет функции PL / SQL reverse(). Так что это не работает:

declare
  v varchar2(20);
begin
  v:= reverse('krow not does ti');
  dbms_output.put_line(v);
end;  
/

Выдает полученную ошибку PLS-00201.

Однако есть недокументированная функция SQL , которую мы можем использовать в PL / SQL, но только при вызове механизма SQL:

declare
  v varchar2(20);
begin
  select reverse('skrow ti') into v from dual;
  dbms_output.put_line(v);
end;  
/

Конечно, поскольку reverse() недокументирован, мы не должны его использовать, по крайней мере, в рабочем коде. Не уверен, почему это недокументировано. Я думаю, что Oracle использует это для обратных индексов, так что, возможно, есть некоторый предел для обратимого размера строки.

Вот демоверсия db <> fiddle .


Производительность немного хуже

Я думаю, что это стоимость перехода от движка PL / SQL к движку SQL и обратно. Так что все сводится к случаю использования. Если мы пишем функцию, которая будет использоваться только в чистом PL / SQL, то я думаю, что ваш подход лучше. Но если мы пишем функцию, которая будет использоваться в SQL, я бы подумал об использовании встроенной Oracle, хотя она не поддерживается.

Хотя, честно говоря, я не могу вспомнить, когда в последний раз я использовал reverse() функцию - Oracle или свернутую вручную - в реальной жизни (в отличие от ответов на вопросы на форумах или аналогичных вопросов Code Golf :)).

1 голос
/ 26 июня 2019

Просто для развлечения, без PL / SQL, используя немного регулярных выражений с иерархическим запросом:

SQL> with test (col) as
  2    (select 'Littlefoot' from dual)
  3  select listagg(one, '') within group (order by lvl desc) reversed
  4  from (select level lvl, regexp_substr(col, '.', 1, level) one
  5        from test
  6        connect by level <= length(col)
  7       );

REVERSED
--------------------------------------------------------------------------
toofelttiL

SQL>

Или переписать как функцию:

SQL> create or replace function f_reverse (par_col in varchar2)
  2    return varchar2
  3  is
  4    retval varchar2(1000);
  5  begin
  6    select listagg(one, '') within group (order by lvl desc)
  7      into retval
  8      from (select level lvl, regexp_substr(par_col, '.', 1, level) one
  9            from dual
 10            connect by level <= length(par_col)
 11           );
 12    return retval;
 13  end;
 14  /

Function created.

SQL> select empno, f_reverse(empno) rev_empno,
  2         ename, f_reverse(ename) rev_ename
  3  from emp
  4  where rownum <= 3;

     EMPNO REV_EMPNO  ENAME      REV_ENAME
---------- ---------- ---------- ----------
      7369 9637       SMITH      HTIMS
      7499 9947       ALLEN      NELLA
      7521 1257       WARD       DRAW

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