Reputation: 745
Currently, I am trying to bulk insert a large amount of data (~500,000 rows) across a database link. I am grabbing the data from Materialized Views. I was going to add indexes but read somewhere that this will actually slow the process down. After I insert the rows, I am grabbing the Unique IDs and inserting them into a flagging table so that they are marked as 'inserted' and aren't inserted again. However this process has been stuck for about 30 minutes now. Is there a better way to do this? (Below is my code).
create or replace PROCEDURE SEND_DATA
IS
CURSOR cursora
IS
SELECT DISTINCT unique_id_1
FROM mv_1;
CURSOR cursorb
IS
SELECT DISTINCT unique_id_2
FROM mv_2;
ca cursora%ROWTYPE;
cb cursorb%ROWTYPE;
sent_flag NUMBER(10);
BEGIN
SELECT flag_id
INTO sent_flag
FROM flag f
WHERE f.flag_tx = 'SENT';
---
Delete FROM TABLE1@db1
WHERE to_date(to_char(LOCAL_TIMESTAMP,'mm/dd/yyyy'),'mm/dd/yyyy') || code in
(SELECT distinct to_date(to_char(LOCAL_TIME_TS,'mm/dd/yyyy'),'mm/dd/yyyy'), code FROM MV_1);
COMMIT;
Delete FROM TABLE1@db1
WHERE type || timestamp in (SELECT DATA_Type_TX || UTC_TS FROM MV_1);
COMMIT;
insert into TABLE1@db1(DATE, TYPE, VALUE, LAST_UPDATE, FLAG, LOCAL_TIMESTAMP)
SELECT DATA_DATE, NAME, VALUE, SYSDATE, null, LOCAL_TIME
FROM MV_2 A;
COMMIT;
OPEN cursora;
LOOP
FETCH cursora into ra;
EXIT WHEN cursora%NOTFOUND;
INSERT INTO flag(
SUBMIT_ID,
FLAG_ID,
CREATE_USER_ID,
CREATE_DT)
VALUES (
rdba.SUBMIT_ID,
SENT_FLAG,
'1',
sysdate);
END LOOP;
CLOSE cursora;
COMMIT;
---
EXCEPTION
WHEN OTHERS
THEN
NULL;
RAISE;
END SEND_DATA;
Upvotes: 1
Views: 169
Reputation: 59456
There are several flaws in your procedure, actually it should fail.
create or replace PROCEDURE SEND_DATA IS
CURSOR cursora IS
SELECT DISTINCT unique_id_1
FROM mv_1;
CURSOR cursorb IS
SELECT DISTINCT unique_id_2
FROM mv_2;
Cursor cursorb
is not used on procedure, why do you declare it?
Delete FROM TABLE1@db1
WHERE to_date(to_char(LOCAL_TIMESTAMP,'mm/dd/yyyy'),'mm/dd/yyyy') || code in
(SELECT distinct to_date(to_char(LOCAL_TIME_TS,'mm/dd/yyyy'),'mm/dd/yyyy'), code FROM MV_1);
This should fail, because first you concatenate two columns but in IN ()
you select two columns. Anyway, remove DISTINCT
clause - it is useless.
Delete FROM TABLE1@db1
WHERE type || timestamp in (SELECT DATA_Type_TX || UTC_TS FROM MV_1);
You should not use reserved keywords like TIMESTAMP
as column name.
LOOP
FETCH cursora into ra;
EXIT WHEN cursora%NOTFOUND;
INSERT INTO flag(SUBMIT_ID, FLAG_ID, CREATE_USER_ID, CREATE_DT)
VALUES ( rdba.SUBMIT_ID, SENT_FLAG, '1', sysdate);
END LOOP;
Why do you enclose a numeric values by quotes (i.e. '1'
)? This code should fail as well, because variable ra
and rdba
are not declared. I assume it was
LOOP
FETCH cursora into ca;
EXIT WHEN cursora%NOTFOUND;
INSERT INTO flag(SUBMIT_ID, FLAG_ID, CREATE_USER_ID, CREATE_DT)
VALUES ( ca.unique_id_1, SENT_FLAG, '1', sysdate);
END LOOP;
Rewrite this as
INSERT INTO flag (SUBMIT_ID, FLAG_ID, CREATE_USER_ID, CREATE_DT)
SELECT DISTINCT unique_id_1, SENT_FLAG, 1, sysdate
FROM mv_1;
Assuming above would present the correct logic
EXCEPTION
WHEN OTHERS
THEN
NULL;
RAISE;
This part is completely useless. WHEN OTHERS THEN NULL;
means "ignore any error" but in the next row you raise it.
Upvotes: 2