Oracle
 sql >> база данни >  >> RDS >> Oracle

Извикване на извикване на функция в низ в процедура на Oracle

Достатъчно лесно е динамично да се изпълни низ ...

create or replace function fmt_fname (p_dyn_string in varchar2)
    return varchar2
is
    return_value varchar2(128);
begin
    execute immediate 'select '||p_dyn_string||' from dual'
        into return_value;
    return  return_value;
end fmt_fname;
/

Проблемът възниква, когато вашият низ съдържа литерали, с ужасните кавички ...

SQL> select fmt_fname('TEST||to_char(sysdate, 'DDD')') from dual
  2  /
select fmt_fname('TEST||to_char(sysdate, 'DDD')') from dual
                                          *
ERROR at line 1:
ORA-00907: missing right parenthesis


SQL>

Така че трябва да избегнем апострофите, всички, включително тези, които не сте включили в публикувания низ:

SQL> select * from t34
  2  /

        ID FILENAME
---------- ------------------------------
         1 APC001
         2 XYZ213
         3 TEST147


SQL> select * from t34
  2  where filename = fmt_fname('''TEST''||to_char(sysdate, ''DDD'')')
  3  /

        ID FILENAME
---------- ------------------------------
         3 TEST147

SQL>

РЕДАКТИРАНЕ

Само в името на справедливостта смятам, че трябва да отбележа, че решението на Тони работи също толкова добре:

SQL> create or replace function fmt_fname (p_dyn_string in varchar2)
  2      return varchar2
  3  is
  4      return_value varchar2(128);
  5  begin
  6      execute immediate 'begin :result := ' || p_dyn_string || '; end;'
  7          using out return_value;
  8      return  return_value;
  9  end;
 10  /

Function created.

SQL> select fmt_fname('''TEST''||to_char(sysdate, ''DDD'')') from dual
  2  /

FMT_FNAME('''TEST''||TO_CHAR(SYSDATE,''DDD'')')
--------------------------------------------------------------------------------
TEST147

SQL>

Всъщност, като избягвате SELECT на DUAL, вероятно е по-добре.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Инсталиране на Oracle 12c Enterprise Edition на Windows 7

  2. Как мога да идентифицирам редовете, включени в блокиране на Oracle?

  3. име на динамична таблица в курсора

  4. ORACLE SQL Изпълнява TOTAL и daytotal с помощта на прозоречна функция

  5. Как да се отърва от празна, но огромна LOB колона?