2017-01-09 85 views
1

我必須從jdbc接口調用Oracle存儲過程。過程需要的記錄類型參數,其包括VARCHAR(2)字段:從java到plsql的單字符字符串varchar2(1)導致'字符串緩衝區太小'

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

我的JDBC查詢字符串聲明記錄類型變量並指定值的狀態字段,其中右側是查詢參數。然後,調用程序。

p_cust_account_rec.status := :IN_insert_status; 

someprocedure(p_cust_account_rec); 

的Java查詢調用設置爲值IN_insert_status參數:

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

callableStatement.execute()之後,我得到

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

信息點與此單個字符的varchar排隊變量。但是,當我在sql查詢字符串硬編碼值爲:

p_cust_account_rec.status := 'I'; 

它的工作原理。

在java中傳遞單個字符字符串時出現了什麼問題,或者我錯過了什麼?

+0

我禁止對數據庫進行任何更改。這是外部數據庫,從這個角度來看,它對我來說是「只讀」的。 – Invader92

+0

看看這裏,可能是相同的問題,http://stackoverflow.com/questions/17598969/character-string-buffer-too-small-error-in-oracle-stored-procedure –

回答

0

我有解決方案。其實問題在於別處。 我發現使用oracle jdbc驅動程序我期望設置查詢參數值(在java中)與它們在SQL中出現的順序相同,甚至認爲我使用了命名參數,而不是? idexed。

所以,我有一個像

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

查詢片段和Java調用像(順序很重要)

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

,並與IN_account_name = 「我」 結束了,IN_insert_statis =「有些帳戶名稱「,由於insert_status VARCHAR2(1)性質而導致」字符緩衝區大小錯誤「。

我不能100%確認這是爲oracle jdbc導致我只讀了反編譯的代碼,但問題也提到http://info.michael-simons.eu/2012/07/23/oracle-jbdc-callablestatements-and-named-parameters/。但是,它解決了我的問題。