SymmetricDS:是否可以使用initial.load.before.sql调用存储过程

问题描述

我可以在对称服务器。属性获取“ initial.load.before.sql”,以将简单的sql语句发送到接收节点。但是documentation对此参数的值允许的范围很小。

这有效:

initial.load.before.sql=ALTER TABLE FOO.BAR disable CONSTRAINT BAR_PTY_FK

但是我想做的是让SymmetricDS(SDS)在初始加载之前在接收节点上执行存储过程,这会禁用所有外键约束(有很多)。

我尝试在“ initial.load.before.sql”中链接几个语句。这也可以:

initial.load.before.sql=ALTER TABLE FOO.BAR disable CONSTRAINT FOO_PTY_FK;ALTER TABLE FOO.BAR disable CONSTRAINT FOO_CTP_FK

但是,如果我包括了我需要的所有FK,则“ initial.load.before.sql”行将会很长。

我尝试过这样的事情:

initial.load.before.sql=FOO.MY_STORED_PROCEDURE()

但是该值在发送节点上导致此错误

2020-10-30 20:34:50,363错误[sds-foo] [ManageIncomingBatchListener] [sds-foo-DataLoader-2]无法加载批处理sds-master-1594 StackTraceKey.init [sqlException:2002564836] org.jumpmind.db.sql.sqlException:ORA-00900:无效的sql语句

不确定存储过程是否全部用完,还是只需要继续调整为“ initial.load.before.sql”提供的值。我尝试了不同类型的DML sql语句(INSERT,UPDATE,DELETE),这些语句工作得很好。 ALTER TABLE也可以正常工作(只要SDS Oracle帐户具有所需的特权)。

如果它对答案有帮助,则说明我正在使用Oracle,并且接收节点上的SDS用户db帐户具有执行存储过程所需的特权。我可以作为SDS用户(在SDS软件的范围之外……即使用db客户端工具(例如sqlDeveloper))成功执行存储过程。 SDS的版本是3.12.3。

解决方法

要调用存储过程,请使用“ call”语句,如下所示:

initial.load.before.sql =调用FOO.MY_STORED_PROCEDURE()

如果您希望在初始加载期间自动延迟索引,约束和外键,请查看auto.create = true和initial.load.defer.create.constraints = true的参数。

,

您能否尝试创建一个存储的函数并使用select语句之类的调用它

从double中选择foo.bar();

这应该适用于Oracle