Para executar uma procedure via prompt SQL ou SQLDEVELOPER deve-se antes criar as variáveis que serão retornadas. Algo como: variable cur refcursor; -- Variável com o cursor de resposta execute minha_procedure(:cur); print cur;
Para operações de delete em grandes tabelas, uma opção é utilizar o conceito de BULK o que garante não só uma melhor performance no DELETE com também diminui a quantidade de controles por causa dos COMMITs. Um exemplo seria:
CREATE OR REPLACE PROCEDURE PR_PURGE IS CURSOR cdr_cur IS SELECT ROWID FROM <TABELA> c where <CONDICAO>; TYPE cdr_data IS TABLE OF ROWID INDEX BY BINARY_INTEGER; cdr cdr_data; BEGIN OPEN cdr_cur; LOOP cdr.DELETE; FETCH cdr_cur BULK COLLECT INTO cdr LIMIT <LIMITE>; --LIMITE IF cdr.COUNT>0 THEN FORALL j IN 1..cdr.COUNT DELETE FROM <TABELA> WHERE ROWID=cdr(j); COMMIT; ELSE EXIT; END IF; END LOOP; CLOSE cdr_cur; COMMIT; EXCEPTION WHEN OTHERS THEN IF cdr_cur%ISOPEN THEN CLOSE cdr_cur; END IF; END;
onde: <TABELA> - Tabela que será manipulada <CONDICAO> - Condição de pesquisa/seleção <LIMITE> - Quantidade de registros transacionados por vez exemplo:
CREATE OR REPLACE PROCEDURE PR_PURGE IS CURSOR cdr_cur IS SELECT ROWID FROM TABELA_A c where c.DATA > '20141201'; TYPE cdr_data IS TABLE OF ROWID INDEX BY BINARY_INTEGER; cdr cdr_data; BEGIN OPEN cdr_cur; LOOP cdr.DELETE; FETCH cdr_cur BULK COLLECT INTO cdr LIMIT 100000; IF cdr.COUNT>0 THEN FORALL j IN 1..cdr.COUNT DELETE FROM TABELA_A WHERE ROWID=cdr(j); COMMIT; ELSE EXIT; END IF; END LOOP; CLOSE cdr_cur; COMMIT; EXCEPTION WHEN OTHERS THEN IF cdr_cur%ISOPEN THEN CLOSE cdr_cur; END IF; END;
Para obter a diferença, em segundos, entre duas datas (datetime), deve-se, após fazer a subtração (diferença) entre elas, efetuar a devida conversão, conforme a fórmula: round(abs(diferença) * 24 * 60 * 60) onde diferença: data1 - data2 Exemplo: round(abs(data_final - data_inicial) * 24 * 60 * 60) as dif_seg