使用sqoop的两个(PL)/ SQL查询

时间:2017-05-19 14:00:40

标签: sql oracle plsql sqoop

我正在尝试使用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的经验,很抱歉,如果我没有明确指定某些部分。

1 个答案:

答案 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;