다음을 사용하여 Oracle 데이터베이스에서 사용자 정의 형식을 만들었습니다. 첫 번째는 레코드 유형 (행과 유사)이고 두 번째는 레코드 유형을 사용하여 구성된 테이블 유형입니다.테이블 형식의 저장 프로 시저를 IN 매개 변수로 사용하여 Varchar2 데이터를 삽입 할 수 없습니다.
create or replace type REC_TYPE as object(bid number, bdesc varchar2(100));
/
create or replace type TAB_TYPE as table of REC_TYPE;
/
다음은 테이블에 데이터를 삽입하는 데 사용되는 테이블과 절차를 설명합니다.
create table BOM (bom_id number, bom_desc varchar2(100));
/
create or replace procedure pBOM (tIn IN TAB_TYPE, res OUT VARCHAR2)
is
begin
for i in 1..tIn.count loop
insert into BOM values(tIn(i).bid, tIn(i).bdesc);
end loop;
end;
/
다음은 JDBC를 사용하여 프로 시저를 호출하는 데 사용되는 Java 코드입니다. 우리가 자바의 main 메소드를 실행하면 위의와
public void method() throws ClassNotFoundException, SQLException {
Class.forName("oracle.jdbc.driver.OracleDriver");
try (Connection connection = DriverManager.getConnection("<jdbc_url>", "<user>", "<password>")) {
connection.setAutoCommit(false);
Object[] attributes = new Object[]{1, "test bom"};
Struct rec= connection.createStruct("REC_TYPE", attributes);
Struct[] tab = new Struct[]{ rec };
Array tabArr = ((OracleConnection)connection).createOracleArray("TAB_TYPE", tab);
CallableStatement cs = connection.prepareCall("{call pBOM(?,?)}");
cs.setObject(1, tabArr);
cs.registerOutParameter(2, Types.VARCHAR);
cs.executeUpdate();
connection.commit();
tabArr.free();
}catch (Exception e) {
e.printStackTrace();
}
}
은, 마지막으로, ID를 삽입하지만, 의외로하지 설명.
참고 : 위의 샘플 코드 조각 문제를 설명하기 위해 가져옵니다. 구문에는 약간의 사소한 문제가있을 수 있지만 프로젝트에서 직면 한 문제를 정확히 복제합니다.
우리가 찾을 수없는 근본적인 문제가있을 수 있습니다. 모든 통찰이나 제안은 높이 평가됩니다. – Kali
Java 코드 및 쿼리 결과를 텍스트로 게시하십시오 ([not images] (https://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so). -wind-asking-a-question/285557 # 285557). 원격 데스크톱의 텍스트를 복사 할 수없는 이유는 무엇입니까? –
코드를 다시 작성하면 Oracle 11gR2 및 JDK1.7에서 정상적으로 작동하는 것 같습니다. (예약어를 피하기 위해 desc에서 descr로 객체 필드 이름을 변경해야하지만 그렇지 않으면 나는 그것이 동일하다고 믿는다; cs 또는 연결을 닫지는 않지만 문제와 관련이 없다는 것을 알아 차렸다). 어쩌면 이상한 행동을 일으키는 JDBC 드라이버/데이터베이스 불일치가 있습니까? 그렇지 않으면 문제를 복제하기 위해 실행할 수있는 [MCVE] (https://stackoverflow.com/help/mcve)를 만드십시오. –