динамическая генерация нескольких sql-скриптов в oracle

#unix #plsql #oracle12c

#unix #plsql #oracle12c

Вопрос:

Я хочу динамически генерировать несколько файлов insert sql в некотором месте, например / home / work.Запрос select также претерпевает некоторые преобразования в полях даты.

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

create table sales (sales_id number , prod_cd varchar2(10) , sales_dt date);
create table ar_sales (sales_id number , prod_cd varchar2(10) , 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,
      order_name,
      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,'YYYYMM'), a.sales_dt)
         from sales a,
              ref_tab b
         where b.sales_id = a.sales_id;
         commit;
    
    
    
    
    
    insert /*  append */ into ar_sales
     (sales_id,
      prod_cd,
      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 ;
/
  

Комментарии:

1. Вы не сказали, с какой проблемой вы столкнулись?

2. я не получаю ожидаемого результата из этой логики..