Senhores, Bom dia!
Uma das novas funcionalidades que chegou com o Oracle 11g foi a possibilidade de alterar uma tabela somente para leitura. Vou explicar um pouco melhor...
Quando criamos um usuário e queremos que ele tenha apenas a permissão de SELECT em uma tabela, concedemos o GRANT de SELECT a ele, mas e se você também quisesse que ninguém tivesse acesso a esta específica tabela? e até mesmo o proprietário (OWNER), SYS e SYSTEM.
Bom.. agora isto é possível com a funcionalidade READ ONLY - Garante que apenas o SELECT seja executado e para os outros comandos DML e Truncate (DDL), não são permitidos.
Bom...vamos ao exemplo.
ALTER TABLE TABELA READ ONLY;
E para permitir novamente os acessos a Tabela, utilizamos:
ALTER TABLE TABELA READ WRITE;
Parceria - Antonio Nilson: LinkedIn
Abs,
Bruno Duarte.
sexta-feira, 14 de novembro de 2014
sexta-feira, 10 de outubro de 2014
Order BY em campo Varchar2 [Oracle];
Senhores, Boa tarde.
Aqui vai uma dica para o tipo de ordenação do comando ORDER BY.
Se ainda não ficou claro do que eu estou falando, vamos imaginar um campo Varchar2, contendo String, números e etc.
No ORDER BY, Como que iriam vir ordenados ?
No meu caso retornou primeiro String e depois os números, isto ocorre pelo o valor que está definido do parâmetro NLS_SORT.
select * from nls_session_parameters;
Se caso precisar que os caracteres numéricos apareçam antes dos caracteres alfabéticos, podemos fazer isso de 2 jeitos - Alterando a Sessão ou por uma Função própria do Oracle.
1- Alterando a Sessão
ALTER SESSION SET NLS_SORT='BINARY';
2-Pela Função NLSSORT
Ex: select nome from produto order by NLSSORT(nome,'NLS_SORT=BINARY');
Se for necessário que seja ordenado de alguma outra maneira, nesta tabela mostra como seria ordenado se o NLS_SORT fosse definido para WEST_EUROPEAN, BINARY, BINARY_CI e BINARY_AI.
Abs!
Bruno Duarte.
Aqui vai uma dica para o tipo de ordenação do comando ORDER BY.
Se ainda não ficou claro do que eu estou falando, vamos imaginar um campo Varchar2, contendo String, números e etc.
No ORDER BY, Como que iriam vir ordenados ?
No meu caso retornou primeiro String e depois os números, isto ocorre pelo o valor que está definido do parâmetro NLS_SORT.
select * from nls_session_parameters;
Se caso precisar que os caracteres numéricos apareçam antes dos caracteres alfabéticos, podemos fazer isso de 2 jeitos - Alterando a Sessão ou por uma Função própria do Oracle.
1- Alterando a Sessão
ALTER SESSION SET NLS_SORT='BINARY';
2-Pela Função NLSSORT
Ex: select nome from produto order by NLSSORT(nome,'NLS_SORT=BINARY');
Se for necessário que seja ordenado de alguma outra maneira, nesta tabela mostra como seria ordenado se o NLS_SORT fosse definido para WEST_EUROPEAN, BINARY, BINARY_CI e BINARY_AI.
Abs!
Bruno Duarte.
quinta-feira, 18 de setembro de 2014
Commit a cada bloco de Insert - Otimizado [Oracle];
Senhores, Boa tarde!
Conforme falado no Post anterior, o desempenho da codificação do FORALL é extremamente rápido.
Precisei migrar uma tabela com alguns milhões de registros, assim foi necessário efetuar um INSERT parcial.
No exemplo, a cada 500 Mil de INSERTS será feito um commit:
Conforme falado no Post anterior, o desempenho da codificação do FORALL é extremamente rápido.
Precisei migrar uma tabela com alguns milhões de registros, assim foi necessário efetuar um INSERT parcial.
No exemplo, a cada 500 Mil de INSERTS será feito um commit:
DECLARE
C_limit PLS_INTEGER := 500000;
TYPE TCOLUNA1 IS TABLE OF TABELA.COLUNA1%TYPE;
TYPE TCOLUNA2 IS TABLE OF TABELA.COLUNA2%TYPE;
TYPE TCOLUNA3 IS TABLE OF TABELA.COLUNA3%TYPE;
TYPE TCOLUNA4 IS TABLE OF TABELA.COLUNA4%TYPE;
TYPE TCOLUNA5 IS TABLE OF TABELA.COLUNA5%TYPE;
TYPE TCOLUNA6 IS TABLE OF TABELA.COLUNA6%TYPE;
TYPE TCOLUNA7 IS TABLE OF TABELA.COLUNA7%TYPE;
TYPE TCOLUNA8 IS TABLE OF TABELA.COLUNA8%TYPE;
TYPE TCOLUNA9 IS TABLE OF TABELA.COLUNA9%TYPE;
V_COLUNA1 TCOLUNA1;
V_COLUNA2 TCOLUNA2;
V_COLUNA3 TCOLUNA3;
V_COLUNA4 TCOLUNA4;
V_COLUNA5 TCOLUNA5;
V_COLUNA6 TCOLUNA6;
V_COLUNA7 TCOLUNA7;
V_COLUNA8 TCOLUNA8;
V_COLUNA9 TCOLUNA9;
CURSOR CUR IS
SELECT COLUNA1,COLUNA2,COLUNA3,COLUNA4,COLUNA5,COLUNA6,COLUNA7,COLUNA8,COLUNA9
FROM TABELA;
BEGIN
OPEN CUR;
LOOP
FETCH CUR
BULK COLLECT INTO V_COLUNA1,V_COLUNA2,V_COLUNA3,V_COLUNA4,V_COLUNA5,V_COLUNA6,V_COLUNA7,V_COLUNA8,V_COLUNA9
LIMIT c_limit;
FORALL i in 1..V_COLUNA1.count
INSERT INTO NOVA_TABELA
(COLUNA1,COLUNA2,COLUNA3,COLUNA4,COLUNA5,COLUNA6,COLUNA7,COLUNA8,COLUNA9)
VALUES
(V_COLUNA1(i),V_COLUNA2(i),V_COLUNA3(i),V_COLUNA4(i),V_COLUNA5(i),V_COLUNA6(i),V_COLUNA7(i),V_COLUNA8(i),V_COLUNA9(i));
EXIT WHEN V_COLUNA1.COUNT = 0;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(SQL%ROWCOUNT) || ' Linhas INSERIDAS');
COMMIT;
END LOOP;
CLOSE CUR;
END;
Valeu,
Bruno Duarte.
Bruno Duarte.
sexta-feira, 5 de setembro de 2014
Commit a cada bloco de Delete - Otimizado [Oracle];
Pessoal,
Neste Post http://dbaduarte.blogspot.com.br/2014/05/commit-cada-bloco-de-delete.html demonstrei como efetuar um DELETE em massa com COMMIT, porém há outra forma muito mais rápida, sendo eficiente para tabelas com milhares de registros.
O Desempenho da codificação do FORALL é extremamente mais veloz que um LOOP, pois a declaração é executada apenas uma vez para cada entrada da coleção.
No exemplo, a cada 1 Milhão de DELETES será feito um commit:
Neste Post http://dbaduarte.blogspot.com.br/2014/05/commit-cada-bloco-de-delete.html demonstrei como efetuar um DELETE em massa com COMMIT, porém há outra forma muito mais rápida, sendo eficiente para tabelas com milhares de registros.
O Desempenho da codificação do FORALL é extremamente mais veloz que um LOOP, pois a declaração é executada apenas uma vez para cada entrada da coleção.
No exemplo, a cada 1 Milhão de DELETES será feito um commit:
DECLARE
c_limit PLS_INTEGER := 1000000;
TYPE urowid_table IS TABLE OF UROWID INDEX BY BINARY_INTEGER;
rowids urowid_table;
CURSOR CUR IS
Select rowid from TABELA
where ID > 20;
BEGIN
OPEN CUR;
LOOP
FETCH CUR
BULK COLLECT INTO ROWIDS
LIMIT c_limit;
FORALL i in 1..ROWIDS.count
delete from TABELA
where ROWID = ROWIDS(i);
EXIT WHEN ROWIDS.COUNT = 0;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(SQL%ROWCOUNT) || ' Linhas Deletadas');
COMMIT;
END LOOP;
CLOSE CUR;
END;
Valeu,
Bruno Duarte.
Bruno Duarte.
Assinar:
Postagens (Atom)




