我想从Sqoop调用Oracle存储过程但是我收到错误。我必须调用存储过程的函数,并且需要传递参数。
$: sqoop import --connect jdbc:oracle:thin:@localhost:1512/db --username userA --password password --call Oracle_Schema.pkg_table_maintenance.sf_drop_index('TBL_A_%','Group_id')
-bash: syntax error near unexpected token `('
$: sqoop import --connect jdbc:oracle:thin:@localhost:1512/db --username userA --password password --call "Oracle_Schema.pkg_table_maintenance.sf_drop_index('TBL_A_%','Group_id')"
Warning: /opt/cloudera/parcels/CDH-5.4.7-1.cdh5.4.7.p1246.1021/bin/../lib/sqoop/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
17/11/27 10:31:31 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5-cdh5.4.7
17/11/27 10:31:32 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
17/11/27 10:31:32 ERROR tool.BaseSqoopTool: Error parsing arguments for import:
17/11/27 10:31:32 ERROR tool.BaseSqoopTool: Unrecognized argument: --call
17/11/27 10:31:32 ERROR tool.BaseSqoopTool: Unrecognized argument: Oracle_Schema.pkg_table_maintenance.sf_drop_index('TBL_A_%','Group_id')
有人可以帮忙!
答案 0 :(得分:1)
Sqoop只允许您在导出时调用sql过程,而不是在导入时调用。
答案 1 :(得分:0)
如果你的存储过程通过sqoop-import进行某种选择导入无效,那么sqoop import就不具备这种灵活性。
但是如果你的存储过程正在进行某种清理操作,你可以使用下面的sqoop eval实用程序
sqoop eval --connect jdbc:oracle:thin:@localhost:1512/db --username userA --password password --query "EXECUTE Oracle_Schema.pkg_table_maintenance.sf_drop_index('TBL_A_%','Group_id')"
- 查询“将执行查询,就好像您在oracle数据库中运行一样,您可以使用与将从oracle客户端应用程序/命令行使用的相同SQL语法”
答案 2 :(得分:0)
您可以通过使用Sql * plus方法执行Sqoop中的存储过程来执行存储过程:BEGIN STORED_PROCEDURE; END;
sqoop eval -Dmapred.job.queue.name=root.test.test-mis \
--connect jdbc:oracle:thin:@SERVER.NAME:PORT:INSTANCE --password **** \
--username MYSCHEMA --query "BEGIN MYSCHEMA.TEST_STORED_PROCEDURE_NAME; END;"