在oracle中动态生成多个sql脚本

问题描述

我想在/ home / work等位置动态生成多个插入sql文件。select查询在日期字段中也进行了一些转换。

create table orders (order_id number,order_name varchar2(10),ord_dt date);
create table ar_orders (order_id number,ord_dt date);

create table sales (sales_id number,prod_cd varchar2(10),sales_dt date);
create table ar_sales (sales_id number,sales_dt date);

预期的sql文件

  1. ar_orders_insert.sql

     prompt TruncATE AR_ORDERS TABLE
     truncate table AR_ORDERS;
     prompt insert INTO AR_ORDERS
     insert /*+ append */ into AR_ORDERS
     (order_id,order_name,ord_dt
      )
     select a.order_id,b.order_name,coalesce(to_date(b.ord_dt,'YYYYMM'),a.ord_dt)
     from orders a,ref_tab b
     where b.order_id = a.order_id;
     commit;
    
     insert /*+ append */ into AR_ORDERS
     (order_id,ord_dt
      )
      select a.order_id,a.order_name,a.ord_dt
     from orders a,AR_ORDERS b
     where b.order_id = a.order_id;
    

    提交;

  2. ar_sales_insert.sql:类似上述的插入sql

    prompt TruncATE ar_sales TABLE
         truncate table ar_sales;
         prompt INSERT INTO ar_sales
         insert into ar_sales
         (sales_id,prod_cd,sales_dt
          )
         select a.sales_id,b.prod_cd,coalesce(to_date(b.sales_dt,a.sales_dt)
         from sales a,ref_tab b
         where b.sales_id = a.sales_id;
         commit;
    
    
    
    
    
    insert /*+ append */ into ar_sales
     (sales_id,sales_dt
      )
      select a.sales_id,a.prod_cd,a.sales_dt
     from sales a,ar_sales b
     where b.sales_id = a.sales_id;
    
     commit;
    

我正在尝试这样做,但看起来我走错了方向。我需要为其生成sql文件的许多表。我仅创建了两个表进行演示。

    SET SERVEROUTPUT ON ;
DECLARE
 v_select_qry  varchar2(32767);
 v_insert_qry  varchar2(32767);
 v_ar_tab      varchar2(50) := 'REF_TAB b';
 v_from_str     varchar2(2000);
 v_where_str    varchar2(3000);
 v_str        varchar2(2000);
 
BEGIN
  
FOR i IN ( 
SELECT OWNER,TABLE_NAME FROM ALL_TABLES WHERE TABLE_NAME  LIKE 'AR_ORD%')
loop

  DBMS_OUTPUT.PUT_LINE('PROMPT: TruncATE AR_ORDERS TABLE');
  DBMS_OUTPUT.PUT_LINE('PROMPT: INSERT INTO AR_ORDERS');
  
   v_str := 'truncate table ' || i.TABLE_NAME;
   v_from_str := 'FROM '||i.TABLE_NAME ||' a,'||chr(10)|| v_ar_tab;
   v_where_str := 'WHERE b.order_id = a.order_id; ';
    
 FOR K in (select column_name from ALL_TAB_COLUMNS where table_name = i.table_name and OWNER = i.OWNER order by column_id)
  loop

     DBMS_OUTPUT.PUT_LINE(k.column_name);
     DBMS_OUTPUT.PUT_LINE(v_from_str);
     DBMS_OUTPUT.PUT_LINE(v_where_str);
 
   END LOOP;
END LOOP;

END ;
/

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)