Domanda

I scrivere un'applicazione che utilizza Oracle 10g.

Al momento sto affrontando questo problema. Prendo in "nome" come parametro di tipo VARCHAR2.

Un valore di esempio che il nome del file può contenere è: 'TEST || to_char (sysdate, 'DDD')'.

Nella procedura, voglio ottenere il valore di questo nome di file come in TEST147. Quando scrivo:

select filename
into ffilename
from dual;

I ottenere il valore ffilename = TEST || to_char (sysdate, 'DDD') whick ha un senso. Ma come posso ottenere intorno a questo problema e richiamare la funzione del valore della stringa?

Guida apprezzato. Grazie.

È stato utile?

Soluzione

E 'abbastanza facile da eseguire in modo dinamico una stringa ...

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

Il problema sorge quando la stringa contiene letterali, con le virgolette temute ...

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>

Quindi dobbiamo sfuggire alle apostrofi, tutti loro, compresi quelli che non abbiamo incluso nella stringa di pubblicazione:

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>

Modifica

Solo per il gusto di equità sento di dover sottolineare che la soluzione di Tony funziona altrettanto bene:

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>

In realtà, evitando il SELECT sul DUAL è probabilmente meglio.

Altri suggerimenti

Il valore della stringa nel tuo esempio è un'espressione non valida; dovrebbe essere: 'TEST' || to_char (sysdate, 'DDD')

Per valutare che si potrebbe fare questo:

execute immediate 'begin :result := ' || filename || '; end;'
  using out v_string;

v_string conterrà quindi 'TEST147'.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top