[SQL] 자바에서 테이블 반환 매개 변수와 함께 저장 프로 시저를 호출
SQL자바에서 테이블 반환 매개 변수와 함께 저장 프로 시저를 호출
내 응용 프로그램에서 나는 * SELECT 같은 쿼리를 실행하려는 FROM TBL WHERE COL IN (@list) 목록 @ 어떤 값의 변수가 할 수있는. 나는 MS SQL 서버 데이터베이스를 사용하고 있습니다. 그때 나는이 문제를 구글 때 나는이 링크를 발견
http://www.sommarskog.se/arrays-in-sql-2008.html
이 링크는 테이블 반환 매개 변수를 사용했다. 그래서 마이크로 소프트 SQL Server Management Studio를 사용하여 사용자 정의 데이터 형식을 만들었습니다.
TABLE AS TYPE의 integer_list_tbltype를 CREATE (N 값 int NOT NULL PRIMARY KEY)
그럼 난 저장 쓴 절차
CREATE PROCEDURE get_product_names @prodids integer_list_tbltype READONLY AS
SELECT p.ProductID, p.ProductName
FROM Northwind.dbo.Products p
WHERE p.ProductID IN (SELECT n FROM @prodids)
다음 관리 스튜디오를 사용하는 경우에만 나는이 절차를 실행
DECLARE @mylist integer_list_tbltype
INSERT @mylist(n) VALUES(9),(12),(27),(37)
EXEC get_product_names @mylist
그것은 나에게 올바른 출력을주고있다. 하지만 자바 소스 코드에서이 저장 프로 시저를 호출하는 방법을 궁금해하고있다. 나는 인수의 상수와 간단한 저장 프로 시저를 호출하는 방법을 알고
CallableStatement proc_stmt = null;
proc_stmt = con.prepareCall("{call test(?)}");
proc_stmt.setString(1,someValue);
하지만 어떻게 테이블 값 매개 변수의 경우 저장 프로 시저를 호출?
해결법
-
==============================
1.이것은 JDBC 드라이버 매뉴얼에 여기에 설명되어 있습니다. 귀하의 경우, 당신은이 작업을 수행해야 할 것이다 :
이것은 JDBC 드라이버 매뉴얼에 여기에 설명되어 있습니다. 귀하의 경우, 당신은이 작업을 수행해야 할 것이다 :
try (SQLServerCallableStatement stmt = (SQLServerCallableStatement) con.prepareCall("{call test(?)}")) { SQLServerDataTable table = new SQLServerDataTable(); sourceDataTable.addColumnMetadata("n", java.sql.Types.INTEGER); sourceDataTable.addRow(9); sourceDataTable.addRow(12); sourceDataTable.addRow(27); sourceDataTable.addRow(37); stmt.setStructured(1, "dbo.integer_list_tbltype", table); }
나는 최근 기사에서이 문제를 문서화했습니다.
-
==============================
2.외모이 JDBC에 대한 계획뿐만 아니라하지만, 아직 구현되지 않은 것처럼 :
외모이 JDBC에 대한 계획뿐만 아니라하지만, 아직 구현되지 않은 것처럼 :
http://blogs.msdn.com/b/jdbcteam/archive/2012/04/03/how-would-you-use-table-valued-parameters-tvp.aspx
럼 식별자가있는 문자열 ( "9,12,27,37")로 매개 변수를 전달하고 SQL Server가 "fnSplit"이라고에서 다음 테이블 반환 함수를 만들거나 무엇이든 그 테이블에 정수 값을 반환합니다 (단지 SQL "을 검색 서버 분할 기능 ") 그 수백만이있다.
-
==============================
3.전형적인 대답은 모든 SQL 주입에 문제가 (쉼표로 구분 또는 XML). 나는 나를 된 PreparedStatement를 사용 할 수있는 대답이 필요했다. 그래서 나는이 함께했다 :
전형적인 대답은 모든 SQL 주입에 문제가 (쉼표로 구분 또는 XML). 나는 나를 된 PreparedStatement를 사용 할 수있는 대답이 필요했다. 그래서 나는이 함께했다 :
StringBuilder query = new StringBuilder(); query.append( "DECLARE @mylist integer_list_tbltype;" + "INSERT @mylist(n) VALUES(?)"); for (int i = 0; i < values.size() - 1; ++i) { query.append(",(?) "); } query.append("; EXEC get_product_names @mylist "); PreparedStatement preparedStmt = conn.prepareStatement(query.toString()); for (int i = 0; i < values.size(); ++i) { preparedStmt.setObject(i + 1, itemLookupValues.get(i)); }
-
==============================
4.지금은 JDBC 드라이버 6.0에 추가 된. 그것은 CTP2 아직.
지금은 JDBC 드라이버 6.0에 추가 된. 그것은 CTP2 아직.
"이 새로운 드라이버는 지원 테이블 반환 매개 변수 및 푸른 Active Directory에. 이러한 새 기능에 추가, 우리는 항상 암호화를위한 추가 기능을 추가했습니다. 드라이버는 다국어 도메인 이름 및 매개 변수화를 지원합니다."
https://blogs.msdn.microsoft.com/jdbcteam/2016/04/04/get-the-new-microsoft-jdbc-driver-6-0-preview/
다운로드 링크 : HTTPS : //www.microsoft.com/en-us/download/details.aspx displaylang = EN & ID = 11774
여기를 사용하는 방법의 설명서입니다 https://msdn.microsoft.com/en-us/library/mt651781(v=sql.110).aspx
-
==============================
5.당신이 절에서 사용하지 않으며 피연산자의 어떤은 다음 IN 절에서 입력으로 쉼표로 구분 된 값을 사용할 수 있습니다 가변 때 나는이 problem.Specially의 해답을 발견하는 동안 검색 후.
당신이 절에서 사용하지 않으며 피연산자의 어떤은 다음 IN 절에서 입력으로 쉼표로 구분 된 값을 사용할 수 있습니다 가변 때 나는이 problem.Specially의 해답을 발견하는 동안 검색 후.
여기에 제공된 우편 번호에 주어진 변호사 유형의 모든 변호사를 검색합니다 저장 프로 시저가 동적 SQL을 사용하여 모양을 어떻게 예입니다.
CREATE PROCEDURE [dbo].[GetLawyers] ( @ZIP CHAR(5), @LawyerTypeIDs VARCHAR(100) ) AS DECLARE @SQL VARCHAR(2000) SET @SQL = 'SELECT * FROM [dbo].[Lawyers] WHERE [ZIP] = ' + @ZIP + ' AND [LawyerTypeID] IN (' + @LawyerTypeIDs + ')' EXECUTE (@SQL) GO
사용자에 의해 입력 된 ZIP 코드 및 콤마 분리 값 선택된 변호사 타입을 통과하는 프로 시저를 실행하기 위해 :
EXECUTE [dbo].[GetLawyers] '12345', '1,4'
결론은 그래서 당신이 사용 TVP 할 필요가 없습니다. 어느 언어 [자바, PHP는] 당신은 저장 프로 시저에 쉼표로 구분 된 문자열로 매개 변수를 전달 사용하고 완벽하게 작동합니다.
그래서 자바에 당신은 저장 프로 시저 이상으로 호출 할 수 있습니다 : -
proc_stmt = con.prepareCall("{call GetLawyers(?,?)}"); proc_stmt.setString(1,"12345"); proc_stmt.setString(2,"'1,4'");
from https://stackoverflow.com/questions/16047818/call-stored-procedure-with-table-valued-parameter-from-java by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] TOP에 대한 N 타이 PostgreSQL의 상당 : LIMIT "관계와?" (0) | 2020.05.14 |
---|---|
[SQL] 존재 IN에 대한 스파크 교체 (0) | 2020.05.14 |
[SQL] 프로그래밍 / 동적 SQL에 WHERE 절을 추가 (0) | 2020.05.14 |
[SQL] 행되지 존재하는 경우 삽입 신탁 (0) | 2020.05.14 |
[SQL] 액세스 테이블이 존재하는지 확인 (0) | 2020.05.14 |