배열을 오라클 프로시저로 전달
저는 두 개의 배열을 java에서 oracle 저장 프로시저로 보내고 싶습니다.첫 번째 배열은 문자열 배열이고 두 번째 배열은 문자 배열입니다. 어떻게 만들 수 있습니까?
여기 그것을 하는 방법의 예가 있습니다.
다음 스크립트는 데이터베이스에 테이블, 유형 및 저장 프로시저를 설정합니다.이 절차에서는 배열 유형의 매개 변수를 사용하여 배열의 각 행을 테이블에 삽입합니다.
CREATE TABLE strings (s VARCHAR(4000));
CREATE TYPE t_varchar2_array AS TABLE OF VARCHAR2(4000);
/
CREATE OR REPLACE PROCEDURE p_array_test(
p_strings t_varchar2_array
)
AS
BEGIN
FOR i IN 1..p_strings.COUNT
LOOP
INSERT INTO strings (s) VALUES (p_strings(i));
END LOOP;
END;
/
그런 다음 Java 코드는 이 저장 프로시저에 배열을 전달하는 것을 보여줍니다.
import java.sql.*;
import oracle.jdbc.*;
import oracle.sql.*;
public class ArrayTest {
public static void main(String[] args) throws Exception {
DriverManager.registerDriver(new OracleDriver());
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:xe", "user", "pass");
CallableStatement stmt = conn.prepareCall("BEGIN p_array_test(?); END;");
// The first parameter here should be the name of the array type.
// It's been capitalised here since I created it without using
// double quotes.
ArrayDescriptor arrDesc =
ArrayDescriptor.createDescriptor("T_VARCHAR2_ARRAY", conn);
String[] data = { "one", "two", "three" };
Array array = new ARRAY(arrDesc, conn, data);
stmt.setArray(1, array);
stmt.execute();
conn.commit();
conn.close();
}
}
SQL 스크립트를 실행한 다음 Java 클래스를 실행하고 테이블을 쿼리하는 경우strings
모든 데이터가 표에 삽입되었음을 확인해야 합니다.
당신이 'array of chars'라고 말할 때, 당신은 자바 배열을 의미하는 것 같습니다.char
내가 추측한 게 맞다면, 당신은 그들을 변환시키는 것이 가장 좋을 것 같아요.char
스토String
위와 동일한 접근 방식을 사용합니다.
여기를 보세요: http://download.oracle.com/docs/cd/B19306_01/java.102/b14355/oraarr.htm#i1058512
여기 제 짧은 예가 있습니다.
데이터베이스에 있는
SQL> create or replace type string_array as table of varchar2(100);
2 /
Type created.
SQL> create or replace function to_string(p_array in string_array) return varchar2
2 as
3 l_string varchar2(32767);
4 i binary_integer;
5 begin
6 i := p_array.first();
7 while i is not null loop
8 l_string := l_string || p_array(i) || ';';
9 i := p_array.next(i);
10 end loop;
11 l_string := rtrim(l_string, ';');
12 return l_string;
13 end;
14 /
Function created.
자바로
public class ArrayTest {
public static void main(String[] args) throws SQLException {
DriverManager.registerDriver(new OracleDriver());
OracleConnection connection = (OracleConnection) DriverManager.getConnection(...);
String[] elements = {"abc", "def", "geh"};
ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("STRING_ARRAY", connection);
ARRAY array = new ARRAY(descriptor, connection, elements);
OracleCallableStatement stmt = (OracleCallableStatement) connection.prepareCall("{? = call to_string(?)}");
stmt.registerOutParameter(1, Types.VARCHAR);
stmt.setARRAY(2, array);
stmt.execute();
String result = stmt.getString(1);
System.out.println("to_string returned: " + result);
}
}
작동하는 것 같습니다: 출력에 표시됩니다.
to_string returned: abc;def;geh
부터ArrayDescriptor
12c부터 사용되지 않으므로 더 이상 사용하면 안 됩니다.여기 12c에서 작동한 코드 스니플릿이 있습니다.
Array array = ((OracleConnection) connection).createOracleArray("T_VARCHAR2_ARRAY", data);
CallableStatement statement = connection.prepareCall("{call p_array_test(?)}");
statement.setArray(1, array);
statement.execute();
정규식 해결
select * from table_a a where a.col in (select regexp_substr('SMITH,ALLEN,WARD,JONES','[^,]+', 1, level) from dual
connect by regexp_substr('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, level) is not null;)
내가 달성한 것과 동일한 방법에 대한 PudoCode.
# 1.You will require a structDescriptor object for an object equivalent in pl sql like :
StructDescriptor structDes= new StructDescriptor("<schemaname in caps>.<sql_object_name>", connectionObject);
# 2. You will need to pass one object values such name, class, id to an object array in order and accordance to 'sql_object_name' object.
For exmaple:
STRUCT[] structArray=new STRUCT[<ListObj>.size()];
int index=0;
for (a in ListObj){
Object[] object=new Object[]{a.getName(),a.getId()};
STRUCT struct=new STRUCT(structDes ,connectionObject,object);
structArray[index]=struct;
index++;
}
ArrayDescriptor arrayDes=ArrayDescriptor.createDescriptor(
"<Schema name>.<table object from sql>", connectionObject);
ARRAY array=new ARRAY(arrayDes,connectionObject, structArray);
then pass it to proc
.declareParameters(
new SqlInOutParameter("<parameter to proc name>",OracleTypes.ARRAY,"
<schema name>.<sql_array_or_table_obj>"))
like
Hashmap<String, Object> map= new HashMap<>();
map.put("<parameter to proc name>",array);
psStatement.execute(map);
도움이 되길 바랍니다.이 시퀀스는 사용되는 SQL 데이터베이스의 요구 사항 및 유형에 따라 달라질 수 있지만 기본값은 동일합니다.
저는 제 다른 답변 중 하나에서 이 답변을 복사했습니다.
간단한 jdbc 호출을 사용하여 배열을 Oracle 저장 프로시저에 입력 매개 변수로 전달
오라클 유형을 사용하여 Java 개체를 오라클에 매핑할 수 있습니다.또한 Spring JDBC 유틸리티도 있습니다.
언급URL : https://stackoverflow.com/questions/5198856/pass-array-to-oracle-procedure
'programing' 카테고리의 다른 글
Ruby on Rails 활성 레코드를 사용하여 여러 레코드를 삽입합니다. (0) | 2023.08.01 |
---|---|
3D 산점도를 만드는 방법 (0) | 2023.08.01 |
iOS 시뮬레이터에 딥 링크를 전달하시겠습니까? (0) | 2023.08.01 |
인스턴스 수준에서 메서드 재정의 (0) | 2023.07.27 |
캔버스의 컨텍스트를 가져오는 것과 동일한 jQuery (0) | 2023.07.27 |