Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java mysql上的Scriptella数据复制错误_Java_Mysql_Jdbc_Etl_Scriptella - Fatal编程技术网

Java mysql上的Scriptella数据复制错误

Java mysql上的Scriptella数据复制错误,java,mysql,jdbc,etl,scriptella,Java,Mysql,Jdbc,Etl,Scriptella,我使用Mysql将数据从一个表复制到另一个表(不同的数据库)。对于源代码,我使用了Mysql示例数据库Sakila中的表 复制数据时,我收到此错误消息 Exception in thread "main" scriptella.execution.EtlExecutorException: Location: /etl/query[1]/script[1] JDBC provider exception: Unable to get parameter 4 Error codes: [S1009

我使用Mysql将数据从一个表复制到另一个表(不同的数据库)。对于源代码,我使用了Mysql示例数据库Sakila中的表

复制数据时,我收到此错误消息

Exception in thread "main" scriptella.execution.EtlExecutorException: Location: /etl/query[1]/script[1]
JDBC provider exception: Unable to get parameter 4
Error codes: [S1009, 0]
Driver exception: java.sql.SQLException: Cannot convert value '2006' from column 4 to TIMESTAMP.
    at scriptella.execution.EtlExecutor.execute(EtlExecutor.java:190)
    at com.zensar.scrptellaTest.App.main(App.java:21)
Caused by: scriptella.core.ExceptionInterceptor$ExecutionException: /etl/query[1]/script[1] failed: Unable to get parameter 4
    at scriptella.core.ExceptionInterceptor.execute(ExceptionInterceptor.java:44)
    at scriptella.core.QueryExecutor$QueryCtxDecorator.processRow(QueryExecutor.java:114)
    at scriptella.jdbc.StatementWrapper.query(StatementWrapper.java:92)
    at scriptella.jdbc.SqlExecutor.statementParsed(SqlExecutor.java:128)
    at scriptella.jdbc.SqlParserBase.handleStatement(SqlParserBase.java:129)
    at scriptella.jdbc.SqlParserBase.parse(SqlParserBase.java:72)
    at scriptella.jdbc.SqlExecutor.execute(SqlExecutor.java:85)
    at scriptella.jdbc.JdbcConnection.executeQuery(JdbcConnection.java:222)
    at scriptella.core.QueryExecutor.execute(QueryExecutor.java:71)
    at scriptella.core.ContentExecutor.execute(ContentExecutor.java:73)
    at scriptella.core.ElementInterceptor.executeNext(ElementInterceptor.java:56)
    at scriptella.core.StatisticInterceptor.execute(StatisticInterceptor.java:41)
    at scriptella.core.ElementInterceptor.executeNext(ElementInterceptor.java:56)
    at scriptella.core.ConnectionInterceptor.execute(ConnectionInterceptor.java:36)
    at scriptella.core.ElementInterceptor.executeNext(ElementInterceptor.java:56)
    at scriptella.core.ExceptionInterceptor.execute(ExceptionInterceptor.java:39)
    at scriptella.core.Session.execute(Session.java:103)
    at scriptella.execution.EtlExecutor.execute(EtlExecutor.java:227)
    at scriptella.execution.EtlExecutor.execute(EtlExecutor.java:183)
    ... 1 more
这是表中的一行

'1', 'ACADEMY DINOSAUR', 'A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies', 2006, '1', NULL, '6', '0.99', '86', '20.99', 'PG', 'Deleted Scenes,Behind the Scenes', '2006-02-15 05:03:42'
这里是两个表的DDL语句

萨基拉电影公司

CREATE TABLE `film` (
  `film_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `description` text,
  `release_year` year(4) DEFAULT NULL,
  `language_id` tinyint(3) unsigned NOT NULL,
  `original_language_id` tinyint(3) unsigned DEFAULT NULL,
  `rental_duration` tinyint(3) unsigned NOT NULL DEFAULT '3',
  `rental_rate` decimal(4,2) NOT NULL DEFAULT '4.99',
  `length` smallint(5) unsigned DEFAULT NULL,
  `replacement_cost` decimal(5,2) NOT NULL DEFAULT '19.99',
  `rating` enum('G','PG','PG-13','R','NC-17') DEFAULT 'G',
  `special_features` set('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') DEFAULT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`film_id`),
  KEY `idx_title` (`title`),
  KEY `idx_fk_language_id` (`language_id`),
  KEY `idx_fk_original_language_id` (`original_language_id`),
  CONSTRAINT `fk_film_language` FOREIGN KEY (`language_id`) REFERENCES `language` (`language_id`) ON UPDATE CASCADE,
  CONSTRAINT `fk_film_language_original` FOREIGN KEY (`original_language_id`) REFERENCES `language` (`language_id`) ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8;
CREATE TABLE `film` (
  `film_id` smallint(5) unsigned NOT NULL,
  `title` varchar(255) NOT NULL,
  `description` text,
  `release_year` year(4) DEFAULT NULL,
  `language_id` tinyint(3) unsigned NOT NULL,
  `original_language_id` tinyint(3) unsigned DEFAULT NULL,
  `rental_duration` tinyint(3) unsigned NOT NULL DEFAULT '3',
  `rental_rate` decimal(4,2) NOT NULL DEFAULT '4.99',
  `length` smallint(5) unsigned DEFAULT NULL,
  `replacement_cost` decimal(5,2) NOT NULL DEFAULT '19.99',
  `rating` enum('G','PG','PG-13','R','NC-17') DEFAULT 'G',
  `special_features` set('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') DEFAULT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
试拍电影

CREATE TABLE `film` (
  `film_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `description` text,
  `release_year` year(4) DEFAULT NULL,
  `language_id` tinyint(3) unsigned NOT NULL,
  `original_language_id` tinyint(3) unsigned DEFAULT NULL,
  `rental_duration` tinyint(3) unsigned NOT NULL DEFAULT '3',
  `rental_rate` decimal(4,2) NOT NULL DEFAULT '4.99',
  `length` smallint(5) unsigned DEFAULT NULL,
  `replacement_cost` decimal(5,2) NOT NULL DEFAULT '19.99',
  `rating` enum('G','PG','PG-13','R','NC-17') DEFAULT 'G',
  `special_features` set('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') DEFAULT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`film_id`),
  KEY `idx_title` (`title`),
  KEY `idx_fk_language_id` (`language_id`),
  KEY `idx_fk_original_language_id` (`original_language_id`),
  CONSTRAINT `fk_film_language` FOREIGN KEY (`language_id`) REFERENCES `language` (`language_id`) ON UPDATE CASCADE,
  CONSTRAINT `fk_film_language_original` FOREIGN KEY (`original_language_id`) REFERENCES `language` (`language_id`) ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8;
CREATE TABLE `film` (
  `film_id` smallint(5) unsigned NOT NULL,
  `title` varchar(255) NOT NULL,
  `description` text,
  `release_year` year(4) DEFAULT NULL,
  `language_id` tinyint(3) unsigned NOT NULL,
  `original_language_id` tinyint(3) unsigned DEFAULT NULL,
  `rental_duration` tinyint(3) unsigned NOT NULL DEFAULT '3',
  `rental_rate` decimal(4,2) NOT NULL DEFAULT '4.99',
  `length` smallint(5) unsigned DEFAULT NULL,
  `replacement_cost` decimal(5,2) NOT NULL DEFAULT '19.99',
  `rating` enum('G','PG','PG-13','R','NC-17') DEFAULT 'G',
  `special_features` set('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') DEFAULT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Scriptella etl.xml

<!DOCTYPE etl SYSTEM "http://scriptella.javaforge.com/dtd/etl.dtd">
<etl>
    <description>Scriptella ETL File Template.</description>
    <!-- Connection declarations -->
    <connection id="source" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/sakila" user="root" password="12345" />
    <connection id="target" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/trg" user="root" password="12345" />

    <!-- Uncomment and modify to run a query-based transformation -->
    <query connection-id="source">
        SELECT * FROM film;
        <script connection-id="target">
            INSERT INTO film VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13);
        </script>
    </query>

</etl>

请告诉我哪里做错了,或者是否有解决方法。

您收到的例外情况是

Driver exception: java.sql.SQLException: Cannot convert value '2006' from column 4 to TIMESTAMP.
似乎特定的DB行在一列中包含值2006,其中时间戳类型是预期的,MySQL的格式似乎是

TIMESTAMP - format: YYYY-MM-DD HH:MI:SS
好的,我想我知道。 只需在参数周围加引号

?4应该看起来像?4

在源代码处,日期被转换为字符串。
因此,当使用不带引号的字符串date创建insert时,日期解析会在一年后停止,只剩下一个数字

谢谢您的回复。但是为什么它要将2006转换为时间戳,因为列
release\u year
year
类型。@g\u p:我没有可用的MySQL,所以无法为您复制它。我建议在stacktrace的相关部分设置断点,并试着调试尝试这种类型转换的原因。scriptella.core.QueryExecutor$QueryCtxDecorator.processRow(QueryExecutor.java:114)似乎是一个很好的起点如果有人对某个问题投了反对票,这是可以的,但是添加一条评论会非常有帮助。