Talend call SqlServer带表结构list参数的存储过程

目的:用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
时间: 2024-11-03 12:55:06

Talend call SqlServer带表结构list参数的存储过程的相关文章

PostgreSQL查看表、表索引、视图、表结构以及参数设置

-- 表索引select * from pg_indexes where tablename='person_wechat_label';select * from pg_statio_all_indexes where relname='person_wechat_label';-- 所有表SELECT * FROM pg_tables;-- 所有视图SELECT * FROM pg_views;-- 表结构SELECT a.attnum,a.attname AS field,t.typnam

SqlServer获取表结构语句

--sql server 2005-- 1. 表结构信息查询 -- ========================================================================-- 表结构信息查询-- 邹建 2005.08(引用请保留此信息)-- ========================================================================SELECT TableName=CASE WHEN C.column_

SqlServer 复制表结构及数据

SqlServer中: 目标表存在: INSERT INTO 目标表 SELECT * FROM 原表; 目标表不存在:SELECT * INTO 目标表 FROM 原表; Oracle中: 目标表存在:INSERT INTO 目标表 SELECT * FROM 原表; 目标表不存在:CREATE TABLE 目标表 AS SELECT * FROM 原表; 原文地址:https://www.cnblogs.com/chenyanbin/p/10503914.html

sqlserver生成表结构文档的方法

只说原理了,具体 可以自己使用程序去生成htm或word文档. 1.首先获取所有的表 SELECT name, id From sysobjects WHERE xtype = 'u' ORDER BY name ASC 2.根据表名查询字段信息 select syscolumns.name, syscolumns.length, systypes.name   as   typename, sys.extended_properties.[value] AS tname,syscolumns.

比较两个mysql数据库表结构的差异

这些天在做基于开源系统的二次开发,边改边添加字段. 线上还运行了之前改好的系统. 表结构的设计管理混乱. 又没有好的办法,网上找的一下也没有很好的办法. 很多软件可以生成变更的sql代码,但不能直观查看便于开发. 后来找了个小工具DatabaseCompare还蛮好用, 可以比较数据库表结构.视图.存储过程.触发器的不同. 比较两个数据库全部表结构的差异, 包括表名.存储引擎.字符集.注释的不同, 以及每张表中的字段名.数据类型.字符集.默认值.注释的不同, 还有索引的不同.字段顺序的不同. 比

Bat脚本备份sqlserver 表结构、存储过程、函数、指定表数据

Bat脚本备份sqlserver 表结构.存储过程.指定表数据: @echo off cd /d %~dp0 ::备份表结构.存储过程和部分配置表的数据 set LogFile=report.log set servername="192.168.43.9" set DBname="TEST" set User="sa" set Password="123456*" echo Deployed Time: %date% %ti

如何解决修改SQLServer表结构时 ,Timeout 时间已到

背景:最近修改一张有海量数据的SQLServer表结构,报错[无法修改表. Timeout 时间已到. 在操作完成之前超时时间已过或服务器未响应. ] [解决办法]:  工具->选项>设计器->表设计器和数据库设计器->右侧勾选"为表设计器更新重写连接字符串的超时值",在它下面的"事务超时时间"默认应该是 30 秒,改得稍微大一些,不过好像不能超过65535.

Oracle表结构转换SqlSERVER表结构 脚本

在审计工作中,有时需要将Oracle的表结构修改后再SqlSERVER中创建表结构,然后将数据导入到SqlSERVER中,在修改表结构的过程中方法狠多.手工修改,最蠢的方法,或者用工具UE批量修改,还凑合的方法,最方便的方法就是用脚本唰的一下,全部改好 : vi     parameter.ini#sysType---1:Linux;others:windowssysType=1#readFiledir is OldFilereadFiledir=/root/tmpmycnf/dbquery/y

sqlserver和oracle修改表结构

sqlserver和oracle修改表结构常用SQL Server:1.增加列  ALTER TABLE users ADD address varchar(30);2.删除列  ALTER TABLE users DROP COLUMN address;3.修改字段类型  ALTER TABLE users ALTER COLUMN address varchar(80);4.重命名列:  EXEC sp_rename 'WN_CALL_INFO.[CUST_CODE]', 'CUST_ID'