2012-01-03 19 views
1

関数を実行するときにjavaからパッケージに定義されたデータ型にアクセスしたい。助けてください。JavaからのOracleデータ型へのアクセス

パッケージと機能:

create or replace package types as 
    TYPE name_array IS VARRAY(100000) OF VARCHAR2(200); 
end types; 



create or replace function test_pack1 return types.name_array as 
names types.name_array := types.name_array(); 

begin 

for emp in (Select state from test where test_ID BETWEEN 1 AND 120000) loop 
names.extend; 
names(names.count) := emp.state; 
    end loop; 
return names; 
end test_pack1; 

のJavaコードの上で

cstmt = (OracleCallableStatement) con.prepareCall("begin ? :=test_pack1; end;"); 
cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAME_ARRAY"); 
cstmt.execute(); 

私は2番目の行でエラーを取得しています。 ます。java.sql.SQLException:無効な名前パターン:以下 のErr MSG我々は、Javaからの例外上記の投げを実行しようとすると、xyz.NAME_ARRAY

機能は、Oracle successfully.Butで実行なっています。

+0

私自身、このトピックに関する専門家検討しますが、しません:あなたの代わりにNAME_ARRAYのARRAYを使用した場合はどうなりますか? – PhilW

+0

私はエキスパートではありませんが、あなたのJavaコードにはパッケージ名がありません - cstmt.registerOutParameter(1、OracleTypes.ARRAY、 "types.NAME_ARRAY"); ? –

+0

@ダビダ。私はこれを試しても動作していません... – Chandran

答えて

0

これを行うには、パッケージに配列型を定義するのは便利です。 Oracle JDBCドライバは、このようにパッケージ・タイプを「見る」ことはできません(これは、配列だけでなく、JDBCコールを介して戻すことができるすべてのカスタム定義タイプにも適用されます)。

代わりにスキーマレベルの型として配列を定義する必要があります。その後、この種のコードをうまく動作させる必要があります。

1

あなたは(つまり、スキーマ・レベルで、レベルをパッケージ化しない)あなたはPL/SQLの外型を定義する必要があるので、この目的のためにSQL型を使用する必要がなく、PL/SQLタイプ:

CREATE OR REPLACE TYPE NAME_ARRAY AS VARRAY(100000) OF VARCHAR2(200); 

あなたの関数でそれを使用する

create or replace function test_pack1 return name_array as 
    names name_array := name_array(); 
... 
+0

タイプ@スキーマレベルを作成するprivelageを持っていません。他の方法を示唆してください.. – Chandran

+0

いくつかの既存のタイプを使用しようとすると、例えば10gにはVARRAY(2147483647)であるDBMSOUTPUT_LINESARRAYがあります。 VARCHAR2(32767) –

+0

ありがとうございました:) – Chandran

2

新しいバージョンのOracle(12cリリース1以降)は、パッケージ内の型をサポートしているため、JDBCを介してアクセスできます。

すべてのPL/SQLパッケージ・タイプは、サーバー側のタイプのメタデータを取得するためにJDBCが使用できるシステム全体の一意の名前にマップされます。名前は次の形式である:ここから

[SCHEMA.]<PACKAGE>.<TYPE> 

http://docs.oracle.com/cd/E16655_01/java.121/e17657/apxref.htm#CHEIIJCC

関連する問題