2009-07-15 4 views
6

Ho alcuni pacchetti in un database Oracle. Contengono stored procedure, funzioni e costanti. Posso chiamare funzioni, in Java, usando un CallableStatement Java. Inoltre, potrei eseguire un'istruzione SQL come "select package1.function1 (value1) from dual;". Ma non riesco a trovare come ottenere il valore di una costante dichiarata nel pacchetto, in Java.È possibile ottenere un valore costante dichiarato in un pacchetto di database? (SQL o Java)

Ad esempio:

PACKAGE Package1 AS 
    A_CONSTANT CONSTANT VARCHAR2 := 'Constant value'; 
END Package1; 

Grazie.

risposta

6

Non è possibile farlo. Avrete bisogno di una funzione "getter" per restituire il valore di una variabile pubblica o costante definito in un pacakge:

CREATE OR REPLACE PACKAGE Package1 IS 
    A_CONSTANT CONSTANT VARCHAR2(100) := 'Constant value a'; 
    B_CONSTANT CONSTANT VARCHAR2(100) := 'Constant value b'; 
    FUNCTION get_const(p_id NUMBER) RETURN VARCHAR2; 
END Package1; 

CREATE OR REPLACE PACKAGE BODY Package1 IS 
    FUNCTION get_const(p_id NUMBER) RETURN VARCHAR2 
    IS 
    BEGIN 
    IF p_id = 1 THEN 
     RETURN package1.a_constant; 
    ELSIF p_id = 2 THEN 
     RETURN package1.b_constant; 
    END IF; 
    RETURN NULL; 
    END; 
END Package1; 

SQL> select package1.a_constant from dual; 

select package1.a_constant from dual 

ORA-06553: PLS-221: 'A_CONSTANT' is not a procedure or is undefined 

SQL> select package1.get_const(1) from dual; 

PACKAGE1.GET_CONST(1) 
-------------------------------------------------------------------------------- 
Constant value a 

SQL> 

EDIT: Se non è possibile modificare questi pacchetti, si può creare nuove funzioni o pacchetti? Se è possibile, è possibile aggirare il problema così:

CREATE OR REPLACE FUNCTION get_const(p_id NUMBER) RETURN VARCHAR2 IS 
BEGIN 
    IF p_id = 1 THEN 
    RETURN package1.a_constant; 
    ELSIF p_id = 2 THEN 
    RETURN package1.b_constant; 
    END IF; 
    RETURN NULL; 
END; 
/


SQL> select get_const(1) from dual; 

GET_CONST(1) 
-------------------------------------------------------------------------------- 
Constant value a 

SQL> select get_const(2) from dual; 

GET_CONST(2) 
-------------------------------------------------------------------------------- 
Constant value b 

SQL> 

Hai il permesso di fare riferimento a variabili pubbliche da altri oggetti PL/SQL.

In risposta al tuo ultimo commento, ho aggiunto del codice per mostrare come si potrebbe scrivere una funzione per ottenere valori diversi dal pacchetto con una singola funzione. Se questo non funziona, temo che tu sia il proverbiale torrente.

+0

Grazie per la risposta. Ma sfortunatamente non riesco a modificare questi pacchetti :( –

+0

Puoi creare nuovi oggetti pl/sql? – DCookie

+0

Preferibilmente no. E se posso, ci deve essere un piccolo insieme di procedure, non una procedura per ogni costante. Grazie ancora –

6

Si potrebbe provare a utilizzare un blocco/SQL anonimi PL in una CallableStatement:

String constantValue; 

CallableStatement statement = connection.prepareCall("BEGIN ? := Package1.A_CONSTANT; END;"); 
try { 
    statement.registerOutParameter(1, Types.VARCHAR); 
    statement.execute(); 
    constantValue = statement.getString(1); 
} finally { 
    statement.close(); 
} 
+0

+1, la risposta molto migliore di quella da DCookie La costante IF è dichiarata nell'interfaccia non nel corpo del pacchetto. –

0
function getConstant(p_constant string) return string is 
v_val string(100); 
begin 
    execute immediate 'begin :a :='||p_constant||'; end;' using in out v_val; 
    return v_val; 
end; 

e poi si può

Select getConstant('MyPkg.myConstant') from dual;