2009-09-23 11 views
39

Ho una funzione PL/SQL con BOOLEAN nel parametro:Come utilizzare tipo booleano nell'istruzione SELECT

function get_something(name in varchar2, ignore_notfound in boolean); 

Questa funzione è una parte di strumento di terze parti, non posso cambiare questo.

Vorrei utilizzare questa funzione all'interno di un'istruzione SELECT come questo:

select get_something('NAME', TRUE) from dual; 

Questo non funziona, ottengo questa eccezione:

ORA-00904: "TRUE": non valida identificatore

Come ho capito, la parola chiave TRUE non viene riconosciuta.

Come posso fare questo lavoro?

risposta

24

È possibile costruire una funzione wrapper come questo:

function get_something(name in varchar2, 
        ignore_notfound in varchar2) return varchar2 
is 
begin 
    return get_something (name, (upper(ignore_notfound) = 'TRUE')); 
end; 

quindi chiamare:

select get_something('NAME', 'TRUE') from dual; 

Sta a voi quali sono i valori validi di ignore_notfound sono nella vostra versione, ho assunto 'VERO "significa VERO e qualsiasi altra cosa significa FALSO.

+11

come oracle, questa è una limitazione davvero stupida – craigrs84

+8

Sono curioso di sapere come Oracle lo giustifica tecnicamente –

-1

PL/SQL si sta lamentando del fatto che TRUE non è un identificatore valido o una variabile. Impostare una variabile locale, impostarla su TRUE e passarla nella funzione get_something.

+4

No, Oracle SQL semplicemente non può elaborare valori booleani :-( –

+0

Inoltre, voglio usare questa funzione in una definizione di vista, non all'interno di uno script –

+0

@Ula, Tony. Poi mi immagino avvolgendo la funzione è –

19

Da documentation:

Non è possibile inserire i valori TRUE e FALSE in una colonna del database. Non è possibile selezionare o recuperare i valori delle colonne in una variabile BOOLEAN. Le funzioni richiamate da una query SQL non possono prendere alcun parametro BOOLEAN. Né possono le funzioni integrate SQL come TO_CHAR; per rappresentare BOOLEAN valori in uscita, è necessario utilizzare IF-THEN o CASE costrutti di tradurre BOOLEAN valori in qualche altro tipo, come ad esempio 0 o 1, 'Y' o 'N', 'true' o 'false', e così via.

Sarà necessario creare una funzione wrapper che utilizzi un tipo di dati SQL e utilizzarlo.

-1

ne dite di usare un'espressione che restituisce TRUE (o FALSE)?

select get_something('NAME', 1 = 1) from dual 
+0

Questo non funziona, ottengo l'errore di sintassi –

+1

Non funziona ... – GabrielOshiro

2

Compilare questo nel database e iniziare a utilizzare le istruzioni booleane nei propri querys.

nota: la funzione get è un parametro varchar2, quindi assicuratevi di avvolgere eventuali "stringhe" nella vostra istruzione. Restituirà 1 per vero e 0 per falso;

select bool('''abc''<''bfg''') from dual; 

CREATE OR REPLACE function bool(p_str in varchar2) return varchar2 
is 
begin 

execute immediate ' begin if '||P_str||' then 
      :v_res := 1; 
     else 
      :v_res := 0; 
     end if; end;' using out v_res; 

     return v_res; 

exception 
    when others then 
    return '"'||p_str||'" is not a boolean expr.'; 
end; 
/
38

È possibile ottenere il valore booleano da una query SELECT, non è possibile utilizzare un tipo di dati booleano.

È possibile rappresentare un booleano con 1/0.

CASE WHEN (10 > 0) THEN 1 ELSE 0 END (It can be used in SELECT QUERY) 

SELECT CASE WHEN (10 > 0) THEN 1 ELSE 0 END AS MY_BOOLEAN_COLUMN 
    FROM DUAL 

Restituisce, 1 (in Iberno/Mybatis/etc 1 è vero). Altrimenti, è possibile ottenere valori booleani stampabili da un SELECT.

SELECT CASE WHEN (10 > 0) THEN 'true' ELSE 'false' END AS MY_BOOLEAN_COLUMN 
FROM DUAL 

Restituisce la stringa 'true'.

+1

Esattamente quello che Grazie! – Baxter

+2

Completamente irrilevante per la domanda però. La domanda non era "come usare i numeri al posto dei booleani". – cartbeforehorse

3
select get_something('NAME', sys.diutil.int_to_bool(1)) from dual; 
Problemi correlati