如何从Airflow OracleOperator中的.sql脚本执行多个Oracle语句

时间:2018-10-31 13:38:35

标签: airflow

我正在使用OracleOperator在远程数据库源上执行sql。 下面是用Airflow DAG编写的简单操作员代码,

t2 = OracleOperator(
    task_id='task_2',
    oracle_conn_id='ORA_DATABASE_SYSTEM',
    sql='/query.sql',
    dag=dag)

query.sql是创建的文件,我希望具有多个可以是DDL或DML的sql语句,但是在运行DAG时会抛出

cx_Oracle.DatabaseError:ORA-00922:缺少选项或无效选项

.sql文件具有以下sql语句,

create table SP(name varchar(50), age int);
insert into SP (name,age) values('Suraj',24);
insert into SP values('Ashish',27);

我做错什么了吗? 如果任何人都可以分享尝试不同的方法或指向正确的方法,那将是有帮助的。

1 个答案:

答案 0 :(得分:1)

经过一些试用后,我能够使用Oracle Operator通过.sql脚本在远程Oracle数据库上执行多个sql语句。

# template_searchpath is the path where .sql files are stored
dag = DAG('Test_Oracle_Connection', default_args=default_args,template_searchpath=['/home/Ashish'])

t2 = OracleOperator(
    task_id='task_2',
    oracle_conn_id='Oracle_connection',
    sql='/oracle_query.sql',                             #SQL file name
    dag=dag)

oracle_query.sql文件包含多个sql语句,例如

DECLARE
  sql_smt VARCHAR2 (5000);
sql_smt := q'[<SQL_STATEMENT>]'
EXECUTE IMMEDIATE sql_smt;
EXECUTE IMMEDIATE 'commit';

这可能不是最好的方法,但至少目前对我有用。 如果可以的话,请分享其他最佳方法,以连接到远程Oracle数据库并执行DDL或DML的查询。