2009-07-15 6 views
6

J'ai quelques paquets dans une base de données Oracle. Ils contiennent des procédures stockées, des fonctions et des constantes. Je peux appeler des fonctions, en Java, en utilisant un Java CallableStatement. En outre, je pourrais exécuter une instruction SQL comme "select package1.function1 (value1) from dual;". Mais je ne trouve pas comment obtenir la valeur d'une constante déclarée dans le paquet, en Java.Est-il possible d'obtenir une valeur constante déclarée dans un package de base de données? (SQL ou Java)

Par exemple:

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

Merci.

Répondre

6

Vous ne pouvez pas faire cela. Vous aurez besoin d'une fonction « getter » pour renvoyer la valeur d'une variable publique ou constante définie dans 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: Si vous ne pouvez pas modifier ces packages, vous pouvez créer de nouvelles fonctions ou paquets? Si vous le pouvez, vous pouvez contourner le problème ainsi:

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> 

Vous êtes autorisé à utiliser des variables publiques d'autres objets PL/SQL.

En réponse à votre dernier commentaire, j'ai ajouté du code pour montrer comment on pourrait écrire une fonction pour obtenir différentes valeurs du paquet avec une seule fonction. Si ça ne marche pas, j'ai peur que tu sois dans la crique proverbiale.

+0

Merci pour votre réponse. Mais malheureusement, je ne peux pas modifier ces paquets :( –

+0

Pouvez-vous créer de nouveaux objets pl/sql? – DCookie

+0

Préférablement non Et si je peux, il doit y avoir un petit ensemble de procédures, pas une procédure pour chaque constante.Merci encore –

6

Vous pouvez essayer d'utiliser un bloc PL/SQL anonyme dans un 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, bien meilleure réponse qu'une de DCookie SI la constante est déclarée dans l'interface pas dans le corps du paquet. –

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; 

Et puis vous pouvez

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