我正在尝试使用sqoop 1.4.6
将数据从Oracle数据库导入HDFS。使用--table table_name
或--query SELECT <...>
语句对HDFS或hive表进行简单导入没有问题。
但是,我的问题是:有没有办法先导入执行某个PL / SQL过程的表?
例如,假设存在一个在Oracle数据库中指定的过程set_date(date IN DATE)
,用于设置数据的报告日期。使用通常的JDBC工具(即ROracle
包,如果从R
开始工作),同一连接需要两个查询来提取数据:
1)BEGIN set_date(#some_date#); END;
2)SELECT * FROM table_name;
是否可以使用sqoop
获得相同的结果?我尝试通过以下方法将两个查询混合成一个:
sqoop import --connect jdbc:oracle:thin@LINK:PORT:SID \
--username user -P \
--target-dir /some/directory \
--query "BEGIN set_date(#some_date#); END; SELECT * FROM table_name"
但显然整个查询假定为PL / SQL格式,因此查询的2)部分未按预期制定。此外,我已经尝试eval
只查询查询的set_date
部分,这似乎工作正常,因此唯一的问题是正确执行2)SQL查询。
是否可以使用相同的sqoop连接调用第二个查询? 是否可以将1)和2)语句混合成一个以便使用sqoop获得相同的结果(现在一个简单的选择表就够了)?
注意:我没有太多使用SQL和PL / SQL的经验,很抱歉,如果我没有明确指定某些部分。
答案 0 :(得分:0)
由于我不知道Sqoop,但是从Oracle 12.1开始,匿名的PL / SQL块cab返回结果集是隐含的,所以如果Sqoop支持这个,那么这个块可能就是:
declare
rc sys_refcursor;
begin
set_date(#some_date#);
open rc for select * from table_name;
dbms_sql.return_result(rc);
end;