问题描述
我可以在对称服务器。属性中获取“ 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