1. 程式人生 > >Talend call SqlServer帶表結構list參數的存儲過程

Talend call SqlServer帶表結構list參數的存儲過程

msd cep load blog manage 下載 plane created exe

目的:用Talend調用Sql Server帶表結構list參數的存儲過程

實現:因Talend目前組件好像沒有實現這樣的功能,又不想再寫個組件,故使用tJavaRow來編碼實現。

1、我們首先可以通過Maven來下載比較新的mssql-jdbc.jar,我是下載如下jar測試的!

<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>6.1.0.jre8</
version> </dependency>

2、建立測試的Job,我建立的是一個簡單的restful接口調用sql server存儲過程的示例,如下:

技術分享

在該示例中:

tLibraryLoad:主要是把我們第一步下載的jar加載進來;

tRESTRequest:輸出body設置為Document;

tJavaRow:自己寫代碼調用帶表結構list參數的存儲過程,Base Settings code如下(這只是測試示例代碼,實際根據自己的需求修改及優化):

java.sql.Connection mssql_conn = null;
com.microsoft.sqlserver.jdbc.SQLServerCallableStatement mssql_statement 
= null; String runPlan = null; String runStatus = ""; try { org.dom4j.Document doc = (org.dom4j.Document) ((routines.system.Document) inputdata.body).getDocument(); org.dom4j.Element root = doc.getRootElement(); System.out.println("Root: " + root.getName()); org.dom4j.Element firstPlanElement
= root.element("Plan"); if (firstPlanElement != null) { System.out.println("Plan: " + firstPlanElement.getText()); runPlan = firstPlanElement.getText(); } else { System.out.println("Plan is null!"); } java.util.List<org.dom4j.Element> itemListElements = root.elements("ItemList"); System.out.println("itemListElements: " + itemListElements.size()); com.microsoft.sqlserver.jdbc.SQLServerDataTable sourceTable = new com.microsoft.sqlserver.jdbc.SQLServerDataTable(); sourceTable.addColumnMetadata("ItemName", java.sql.Types.VARCHAR); sourceTable.addColumnMetadata("Weight", java.sql.Types.DECIMAL); sourceTable.addColumnMetadata("Quantity", java.sql.Types.DECIMAL); sourceTable.addColumnMetadata("Location", java.sql.Types.VARCHAR); sourceTable.addColumnMetadata("OrderNo", java.sql.Types.VARCHAR); sourceTable.addColumnMetadata("Operator", java.sql.Types.VARCHAR); for (org.dom4j.Element itemElement : itemListElements) { org.dom4j.Element firstItemNameElement = itemElement.element("ItemName"); org.dom4j.Element firstWeightElement = itemElement.element("Weight"); org.dom4j.Element firstQuantityElement = itemElement.element("Quantity"); org.dom4j.Element firstLocationElement = itemElement.element("Location"); org.dom4j.Element firstOrderNoElement = itemElement.element("OrderNo"); org.dom4j.Element firstOperatorElement = itemElement.element("Operator"); sourceTable.addRow(firstItemNameElement.getText(), Double.parseDouble(firstWeightElement.getText()),Double.parseDouble(firstQuantityElement.getText()),firstLocationElement.getText(),firstOrderNoElement.getText(),firstOperatorElement.getText()); } String driverClass = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; java.lang.Class.forName(driverClass); String mssqlurl = "jdbc:sqlserver://" + context.MSDB_Host; if (!"".equals("" + context.MSDB_Port)) { mssqlurl += ":" + "" + context.MSDB_Port + ";"; } if (!"".equals(context.MSDB_Database)) { mssqlurl += "DatabaseName=" + context.MSDB_Database + ";"; } mssqlurl += "appName=" + projectName + ";" + ""; mssql_conn = java.sql.DriverManager.getConnection(mssqlurl, context.MSDB_Username, context.MSDB_Password); mssql_statement = (com.microsoft.sqlserver.jdbc.SQLServerCallableStatement)mssql_conn.prepareCall("{call " + "[WDPM].[usp_SaveStockItems]" + "(?,?)}"); if (runPlan == null) { mssql_statement.setNull(1, java.sql.Types.VARCHAR); } else { mssql_statement.setString(1, runPlan); } mssql_statement.setStructured(2, "[WDPM].[MaterialItem]", sourceTable); mssql_statement.execute(); runStatus = "Success"; } catch (Exception e) { runStatus = "Error:"+e.getMessage(); //throw new RuntimeException(e); } finally { if (mssql_statement!=null){ try { mssql_statement.close(); }catch (java.sql.SQLException e){ e.printStackTrace(); } } if (mssql_conn!=null){ try { mssql_conn.close(); }catch (java.sql.SQLException e){ e.printStackTrace(); } } } row1.Plan = runPlan; row1.Status = runStatus;

Advanced Settings code如下:

import com.microsoft.sqlserver.jdbc.SQLServerDriver;

這樣調用Sql Server帶表結構list參數的存儲過程就基本完成了,其他restful返回之類的就不在這累述了!

示例中使用的Sql Server的存儲過程腳本如下,僅供參考:

創建自定義的table類型:

CREATE TYPE [WDPM].[MaterialItem] AS TABLE(
    [ItemName] [varchar](50) NULL,
    [Weight] [decimal](12, 4) NULL,
    [Quantity] [decimal](12, 4) NULL,
    [Location] [varchar](30) NULL,
    [OrderNo] [varchar](30) NULL,
    [Operator] [varchar](30) NULL
)
GO

創建存儲過程:

create procedure [WDPM].[usp_SaveStockItems] (
    @Plan varchar(36),
    @ItemList [WDPM].[MaterialItem] readonly
) as
begin
    declare @WarehouseCode char(2) = FP

    if not exists(select 1 from [WDPM].[testSnapshot] where [Plan] = @Plan)
    begin
        raiserror(計劃 %s 不存在!, 16, 1, @Plan)
        return
    end

    insert [WDPM].[testTaking] ([Plan], [ItemName], [Weight], [Quantity], [Location]
        , [WarehouseCode], [Remark], [Operator]
        , [CreatedDate], [CreatedBy], [ModifiedDate], [ModifiedBy])
        select @Plan, [ItemName], [Weight], [Quantity], [Location]
            , @WarehouseCode, ‘‘, [Operator]
            , getdate(), 0, getdate(), 0  
            from @ItemList

end

sql調用樣例:

declare @ItemList [WDPM].[MaterialItem]
declare @Plan varchar(36) = TEST000001
insert @ItemList (ItemName, Weight, Quantity, Location, OrderNo, Operator)
    select Fabric_No, Weight, Quantity, Location, Note_No, AngusYang
        from [fpStore] s with(nolock)
        where [Location] = Test


exec [WDPM].[usp_SaveStockItems] @Plan, @ItemList

Talend call SqlServer帶表結構list參數的存儲過程