#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 :
-
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;
зафиксировать;
-
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. я не получаю ожидаемого результата из этой логики..