2016-07-06 19 views
2

Java String配列をPLSQL Stored-Procedureに渡そうとしています。インターネットの検索の多くの後、私のために動作しない解決策を見つけた。SQLException:ORA-01403:配列をStoredProcedureに渡すときにデータが見つかりません

create or replace PACKAGE MYPACKAGE IS 
TYPE CHAR_TABLE IS TABLE OF CHAR(06) INDEX BY BINARY_INTEGER; 
PROCEDURE MYPROCEDURE(
    p_strings  CHAR_TABLE 
); 
END MYPACKAGE; 

そして、ここでは、体が(また、それは重要ではありません)です: 作成または全ての まずここで私は「CHAR_TABLE」

パッケージと呼ばれるPL/SQL表を宣言したパッケージです。

OracleCallableStatement stmt = (OracleCallableStatement)oracleConnection.prepareCall("{call MYPACKAGE.MYPROCEDURE(?)}"); 



    String[] data = { "one", "two", "three" }; 
    Array array = oracleConnection.createOracleArray("MYPACKAGE.CHAR_TABLE", data); 

    stmt.setArray(1, array); 
    stmt.execute(); 

    conn.commit(); 
    conn.close(); 
0123:置き換えるPACKAGE BODY mypackageとは、以下のISTインターネット上で見つかった場合

PROCEDURE MYPROCEDURE(
    p_strings  CHAR_TABLE 
) AS 
    BEGIN 
    FOR i IN 1..p_strings.COUNT 
    LOOP 
     INSERT INTO myTable (s) VALUES (p_strings(i)); 
    END LOOP; 
    END MYPROCEDURE; 

END MYPACKAGE; 

Javaベースのコードです

しかし、問題は、私は次の例外を得ることです:

OracleCallableStatement stmt = (OracleCallableStatement)oracleConnection.prepareCall("  DECLARE var BERNHARD.MYPACKAGE.CHAR_TABLE;\n" + 
       "BEGIN\n" + 
       "\n" + 
       "var(1) := 'a';\n" + 
       "var(2) := 'b';\n" + 
       "MYPACKAGE.MYPROCEDURE(var);\n" + 
       "END;"); 
stmt.execute(); 

そして、この:私は、次のコードを試してみました(にStoredProcedureの呼び出しが動作するかどうかを確認するため)ただ、テストのために

Exception in thread "main" java.sql.SQLException: ORA-01403: no data found 

ORA-06512: at "BERNHARD.MYPACKAGE", line 9 
ORA-06512: at line 1 

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450) 
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399) 
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1017) 
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:655) 
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:249) 
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:566) 
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:210) 
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:53) 
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:938) 
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1075) 
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3820) 
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3923) 
at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:5617) 
at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1385) 

を働くしかし、Java String Arrayをストアドプロシージャの入力パラメータにバインドする最初のソリューションが必要です。それをどうすれば実現できますか?または私の間違いは何ですか?

+0

ご使用のデータベースのバージョンとJDBCドライバのバージョンを開示してください。 – krokodilko

+0

のOracle Database 12cのEnterprise Editionのリリース12.1.0.2.0 - 64ビットの生産 com.oracle.ojdbc ojdbc7 12.1.0.1.0 Veilchen4ever

+0

あなたは、テストのためだけにCHAR(06)を変更できますサンプルの場合はvarchar2(200)、挿入の場合はsubstrを使用 – Mottor

答えて

1

私はa配列(連想配列)がjavaから来るかどうか推測しています。そのインデックスは0から始まります。 ループ範囲を変更したり、ループの種類を変更したりすることができます。 a-arrayでは、whileループが適切です。 例を確認してください。

declare 
type CHAR_TABLE IS TABLE OF CHAR(06) INDEX BY BINARY_INTEGER; 
p_strings CHAR_TABLE; 
idx BINARY_INTEGER; 
begin 
p_strings(0) := 'aaaa'; 
p_strings(1) := 'bbbb'; 
p_strings(2) := 'cccc'; 
-- 1-st option 
FOR i IN 0..p_strings.last loop 
    dbms_output.put_line(p_strings(i)); 
end loop; 
-- 2-nd option 
idx := p_strings.first; 
while idx is not null 
loop 
    dbms_output.put_line(p_strings(idx)); 
    idx := p_strings.next(idx); 
end loop; 

end; 
+0

ありがとうございました。あなたの推測は完全に正しいものでした。これは私の問題を修正しました。 – Veilchen4ever

関連する問題