2017-01-09 5 views
1

Je dois appeler la procédure stockée Oracle à partir de l'interface jdbc. Procédure prend un paramètre de type d'enregistrement qui comprend VARCHAR (2) Champ:Une chaîne de caractères de java à plsql varchar2 (1) provoque une 'buffer de chaînes de caractères trop petite'

TYPE cust_account_rec_type IS RECORD (
    ... , status VARCHAR2(1), ...); 

Ma chaîne de requête JDBC déclare variable de type fiche et attribue une valeur de champ d'état, où côté droit est un paramètre de la requête. Ensuite, appelle la procédure.

p_cust_account_rec.status := :IN_insert_status; 

someprocedure(p_cust_account_rec); 

appel Java requête définit la valeur pour paramètre IN_insert_status:

callableStatement.setString("IN_insert_status", "I"); 
// callableStatement is type of java.sql.CallableStatement 

après callableStatement.execute() i se

ORA-06502: PL/SQL: numeric or value error: character string buffer too small 

points de message à la ligne avec ce caractère varchar variable. Toutefois, lorsque la valeur i dans la chaîne de requête sql est:

p_cust_account_rec.status := 'I'; 

cela fonctionne.

Quel est le problème avec le passage d'une seule chaîne de caractères dans java, ou qu'est-ce qui me manque?

+0

Il m'interdit de modifier la base de données. C'est une base de données externe et de ce point de vue, c'est "lecture seule" pour moi. – Invader92

+0

jeter un oeil ici, pourrait être le même problème, http://stackoverflow.com/questions/17598969/character-string-buffer-too-small-error-in-oracle-stored-procedure –

Répondre

0

J'ai la solution. En fait, le problème est ailleurs. J'ai trouvé qu'avec le pilote oracle jdbc, je devrais définir les valeurs des paramètres de la requête (en java) avec le même ordre que dans SQL, même si j'ai utilisé des paramètres nommés, non? idexed.

Donc, j'ai eu fragment de requête comme

p_cust_account_rec.account_name  := :IN_account_name; -- VARCHAR2(240) 
p_cust_account_rec.status   := :IN_insert_status; -- VARCHAR2(1) 

et Java appels comme (commande importante)

callableStatement.setString("IN_insert_status", "I"); 
callableStatement.setString("IN_account_name", "Some Account Name"); 

et il a fini avec IN_account_name = "I", et IN_insert_statis = « Certains Nom du compte ", qui a provoqué une 'erreur de taille de buffer de caractère' due à la nature de insert_status VARCHAR2 (1).

Je ne peux pas 100% confirmer cela pour oracle jdbc parce que je ne lis que le code décompilé, mais le problème a également été mentionné http://info.michael-simons.eu/2012/07/23/oracle-jbdc-callablestatements-and-named-parameters/. Cependant, cela a résolu mon problème.