복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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'");
    
  6. from https://stackoverflow.com/questions/16047818/call-stored-procedure-with-table-valued-parameter-from-java by cc-by-sa and MIT license