|
Dicas Oracle 8i |
|
Algumas dicas de como criar um Banco de Dados em Oracle.8i |

connect system/manager
Drop user aluno1 cascade;
create user aluno1 identified by senha;
grant connect,resource to aluno1;
connect aluno1/senha
|
Após a conecção como criar Tabelas |
CREATE TABLE REGIAO
(CODIGO NUMBER(6) PRIMARY KEY,
NOME VARCHAR2(25))
/
CREATE TABLE DEPARTAMENTO
(CODIGO NUMBER(6) PRIMARY KEY,
NOME VARCHAR2(25) NOT NULL,
COD_REGIAO NUMBER(6))
/
CREATE TABLE CARGO
(CODIGO NUMBER(6) PRIMARY KEY,
NOME VARCHAR2(25) NOT NULL)
/
CREATE TABLE EMPREGADO
(CODIGO NUMBER(6) PRIMARY KEY,
SOBRENOME VARCHAR2(25) NOT
NULL,
NOME VARCHAR2(25) NOT NULL,
COD_DEPTO NUMBER(6),
COD_CARGO NUMBER(6),
SALARIO NUMBER(11,2),
GERENTE NUMBER(6),
DATA_ADMISSAO DATE,
PCT_COMISSAO NUMBER(4,2))
/
//load data
append
into table nombre_tabla
when
(24:25)='01' -- si en esta posición el valor es 01 carga en una tabla determinada
(
Campo1 position (028:045) char,
Campo2 position (012:012) char,
Campo3 position (067:084) char,
Campo4 position (046:057) date "rrmmddhh24miss",
Campo5 position (060:066) integer external ,
Campo6 position (088:095) char,
Campo7 position (096:103) char
)
into table nombre_table
when
(24:25)='05' -- si en esta posición el valor es 05 carga en otra tabla o en la misma dejando fuera cualquier valor distinto de 01 y 05
(
Campo1 position (028:045) char,
Campo2 position (012:012) char,
Campo3 position (067:084) char,
Campo4 position (046:057) date "rrmmddhh24miss",
Campo5 position (060:066) integer external ,
Campo6 position (088:095) char,
Campo7 position (096:103) char
)
|
Criando SEQUENCE |
CREATE SEQUENCE S_REGIAO
NOCACHE
NOCYCLE
/
CREATE SEQUENCE S_DEPARTAMENTO
NOCACHE
NOCYCLE
/
CREATE SEQUENCE S_CARGO
NOCACHE
NOCYCLE
/
CREATE SEQUENCE S_EMPREGADO
NOCACHE
NOCYCLE
/
|
Inserindo Dados nas Tabelas |
INSERT INTO REGIAO(CODIGO, NOME)
VALUES(S_REGIAO.NEXTVAL,'AMERICA
DO NORTE')
/
INSERT
INTO REGIAO(CODIGO, NOME)
VALUES(S_REGIAO.NEXTVAL,'AMERICA
DO SUL')
/
INSERT
INTO REGIAO(CODIGO, NOME)
VALUES(S_REGIAO.NEXTVAL,'AFRICA')
/
INSERT
INTO REGIAO(CODIGO, NOME)
VALUES(S_REGIAO.NEXTVAL,'ASIA')
/
INSERT
INTO REGIAO(CODIGO, NOME)
VALUES(S_REGIAO.NEXTVAL,'EUROPA')
/
INSERT
INTO DEPARTAMENTO(CODIGO, NOME, COD_REGIAO)
VALUES(S_DEPARTAMENTO.NEXTVAL,'FINANCEIRO',1)
/
INSERT
INTO DEPARTAMENTO(CODIGO, NOME, COD_REGIAO)
VALUES(S_DEPARTAMENTO.NEXTVAL,'CONTABILIDADE',1)
/
INSERT
INTO DEPARTAMENTO(CODIGO, NOME, COD_REGIAO)
VALUES(S_DEPARTAMENTO.NEXTVAL,'INFORMATICA',1)
/
INSERT
INTO DEPARTAMENTO(CODIGO, NOME, COD_REGIAO)
VALUES(S_DEPARTAMENTO.NEXTVAL,'VENDAS',1)
/
INSERT
INTO DEPARTAMENTO(CODIGO, NOME, COD_REGIAO)
VALUES(S_DEPARTAMENTO.NEXTVAL,'RECURSOS
HUMANOS',1)
/
INSERT
INTO DEPARTAMENTO(CODIGO, NOME, COD_REGIAO)
VALUES(S_DEPARTAMENTO.NEXTVAL,'FINANCEIRO',2)
/
INSERT
INTO DEPARTAMENTO(CODIGO, NOME, COD_REGIAO)
VALUES(S_DEPARTAMENTO.NEXTVAL,'CONTABILIDADE',2)
/
INSERT
INTO DEPARTAMENTO(CODIGO, NOME, COD_REGIAO)
VALUES(S_DEPARTAMENTO.NEXTVAL,'INFORMATICA',2)
/
INSERT
INTO DEPARTAMENTO(CODIGO, NOME, COD_REGIAO)
VALUES(S_DEPARTAMENTO.NEXTVAL,'VENDAS',2)
/
INSERT
INTO DEPARTAMENTO(CODIGO, NOME, COD_REGIAO)
VALUES(S_DEPARTAMENTO.NEXTVAL,'RECURSOS
HUMANOS',2)
/
INSERT
INTO DEPARTAMENTO(CODIGO, NOME, COD_REGIAO)
VALUES(S_DEPARTAMENTO.NEXTVAL,'FINANCEIRO',3)
/
INSERT
INTO DEPARTAMENTO(CODIGO, NOME, COD_REGIAO)
VALUES(S_DEPARTAMENTO.NEXTVAL,'CONTABILIDADE',3)
/
INSERT
INTO DEPARTAMENTO(CODIGO, NOME, COD_REGIAO)
VALUES(S_DEPARTAMENTO.NEXTVAL,'INFORMATICA',3)
/
INSERT
INTO DEPARTAMENTO(CODIGO, NOME, COD_REGIAO)
VALUES(S_DEPARTAMENTO.NEXTVAL,'VENDAS',3)
/
INSERT
INTO DEPARTAMENTO(CODIGO, NOME, COD_REGIAO)
VALUES(S_DEPARTAMENTO.NEXTVAL,'RECURSOS
HUMANOS',3)
/
INSERT
INTO DEPARTAMENTO(CODIGO, NOME, COD_REGIAO)
VALUES(S_DEPARTAMENTO.NEXTVAL,'FINANCEIRO',4)
/
INSERT
INTO DEPARTAMENTO(CODIGO, NOME, COD_REGIAO)
VALUES(S_DEPARTAMENTO.NEXTVAL,'VENDAS',4)
/
INSERT
INTO DEPARTAMENTO(CODIGO, NOME, COD_REGIAO)
VALUES(S_DEPARTAMENTO.NEXTVAL,'RECURSOS
HUMANOS',4)
/
INSERT
INTO CARGO(CODIGO,NOME)
VALUES(S_CARGO.NEXTVAL,
'PRESIDENTE')
/
INSERT
INTO CARGO(CODIGO,NOME)
VALUES(S_CARGO.NEXTVAL,
'GERENTE DE VENDAS')
/
INSERT
INTO CARGO(CODIGO,NOME)
VALUES(S_CARGO.NEXTVAL,
'GERENTE DE INFORMATICA')
/
INSERT
INTO CARGO(CODIGO,NOME)
VALUES(S_CARGO.NEXTVAL,
'REPRESENTANTE DE VENDAS')
/
INSERT
INTO CARGO(CODIGO,NOME)
VALUES(S_CARGO.NEXTVAL,
'ANALISTA DE SISTEMAS')
/
INSERT
INTO CARGO(CODIGO,NOME)
VALUES(S_CARGO.NEXTVAL,
'ESTAGIÁRIO')
/
INSERT
INTO EMPREGADO(CODIGO,SOBRENOME,NOME,COD_DEPTO,COD_CARGO,SALARIO,GERENTE,DATA_ADMISSAO,PCT_COMISSAO)
VALUES(S_EMPREGADO.NEXTVAL,'BARBOSA','ANTONIO',1,1,1140.00,NULL,
TO_DATE('01061980','DDMMYYYY'),NULL)
/
INSERT
INTO EMPREGADO(CODIGO,SOBRENOME,NOME,COD_DEPTO,COD_CARGO,SALARIO,GERENTE,DATA_ADMISSAO,PCT_COMISSAO)
VALUES(S_EMPREGADO.NEXTVAL,'COSTA','CARLA',1,2,254.00,1,
TO_DATE('01061980','DDMMYYYY'),5)
/
INSERT
INTO EMPREGADO(CODIGO,SOBRENOME,NOME,COD_DEPTO,COD_CARGO,SALARIO,GERENTE,DATA_ADMISSAO,PCT_COMISSAO)
VALUES(S_EMPREGADO.NEXTVAL,'COSTA','PEDRO',1,3,123.00,1,
TO_DATE('01071980','DDMMYYYY'),NULL)
/
INSERT
INTO EMPREGADO(CODIGO,SOBRENOME,NOME,COD_DEPTO,COD_CARGO,SALARIO,GERENTE,DATA_ADMISSAO,PCT_COMISSAO)
VALUES(S_EMPREGADO.NEXTVAL,'GARCIA','ALEXANDRE',1,4,40.00,2,
TO_DATE('01071980','DDMMYYYY'),7)
/
INSERT
INTO EMPREGADO(CODIGO,SOBRENOME,NOME,COD_DEPTO,COD_CARGO,SALARIO,GERENTE,DATA_ADMISSAO,PCT_COMISSAO)
VALUES(S_EMPREGADO.NEXTVAL,'GOMES','RICARDO',1,4,100.23,2,
TO_DATE('01071980','DDMMYYYY'),NULL)
/
|
Exemplos de Select e Insert com PL/SQL |
ACCEPT p_coddigo PROMPT 'Entre com o codigo do Departamento:';
ACCEPT p_nome PROMPT 'Entre com o nome do Departamento:';
ACCEPT p_cod_regiao PROMPT 'Entre com o codigo da Regiao:';
DECLARE
v_codigo departamento.codigo%type:=&p_codigo;
v_nome departamento.nome%type:=&'p_nome';
v_cod_regiao
departamento.cod_regiao%type:=&pcod_regiao;
BEGIN
--Estou consultando de acordo com p_cad_emp
INSERT INTO
DEPARTAMENTO(codigo,nome,cod_regiao)
values(v_codigo,v_nome,v_cod_regiao);
end;
edit
/
set
verify off;
var v_sal number;
var v_nom varchar2(25);
ACCEPT p_coddigo PROMPT 'entre com o codigo do Departamento:';
ACCEPT p_nome PROMPT 'entre como nome do Departamento:';
ACCEPT p_cod_regiao PROMPT 'entre com o codigo da Regiao:';
DECLARE
v_codigo departamento.codigo%type:=&p_codigo;
v_nome departamento.nome%type:=&'p_nome';
v_cod_regiao
departamento.cod_regiao%type:=&pcod_regiao;
BEGIN
--Estou consultando de acordo com p_cad_emp
INSERT INTO
DEPARTAMENTO(codigo,nome,cod_regiao)
values(v_codigo,v_nome,v_cod_regiao);
end;
/
set
verify off;
var p_qtd number;
ACCEPT
p_qtde PROMPT 'Informe a quantidade
de Pedidos :';
DECLARE
v_quantidade NUMBER(2):=&p_qtde;
v_contador NUMBER(2):=1
BEGIN
LOOP
ISERT INTO PEDIDO(codigo)
values(v_contador);
v_CONTADOR:=VCONTADOR+1;
EXIT WHEN v_quantidade<v_contador;
ENDLOOP;
END;
/
set
verify off;
var p_qtd number;
ACCEPT
p_qtde PROMPT 'Informe a quantidade
de Pedidos :';
DECLARE
v_quantidade NUMBER(2):=&p_qtde;
BEGIN
For v_contador IN 1..v_quantidade LOOP
INSERT INTO PEDIDO(codigo)
VALUES(v_contador);
ENDLOOP;
END;
/
|
Administração de Banco de Dados Oracle |
|
Processo trace de um determinado Usuário |
EXECUTE DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(SID,SERIAL#,TRUE); |
|
Arquivo contendo create controlfile no trace file |
ALTER DATABASE BACKUP CONTROLFILE TO TRACE; |
|
Atualizar estatísticas do schema |
Para atualizar as estatísticas de todo um
schema (tables, indexes e clusters) podemos
executar o pacote abaixo.
EXECUTE DBMS_UTILITY.ANALYZE_SCHEMA('
|
|
|
Compilar objetos inválidos do schema |
Para compilar os objetos de todo um schema
(procedures, functions e packages) podemos
executar o pacote abaixo.
EXECUTE DBMS_UTILITY.COMPILE_SCHEMA('
|
|
Contenção de Latch (Lock de Memória) |
COL C1 FORMAT a25 HEADING 'Tipo de Latch'
COL C2 FORMAT 999.99999 HEADING 'Misses/Gets (%)'
COL C3 FORMAT 999.99999 HEADING 'Immediate Misses/Immediate Gets (%)'
SELECT N.NAME C1,
MISSES*100/(gets+1) pct_miss C2,
IMMEDIATE_MISSES*100/(immediate_gets+1) C3
FROM V$LATCHNAME N, V$LATCH L
WHERE N.LATCH# = L.LATCH# AND
N.NAME IN ('redo allocation','redo copy');
|
|
Contenção do Redo Log Buffer |
SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'redo log space waittime'; |
|
DML's sendo executadas no momento |
COL C1 FORMAT A10 HEADING 'Usuario' COL C2 HEADING 'Texto SQL' SELECT S.USERNAME C1, T.SQL_TEXT FROM V$SESSION S, V$SQLTEXT T WHERE S.SQL_ADDRESS = T.ADDRESS AND S.SQL_HASH_VALUE = T.HASH_VALUE AND S.USERNAME IS NOT NULL ORDER BY S.USERNAME, S.PREV_SQL_ADDR, S.PREV_HASH_VALUE, T.PIECE; |
|
Efetuar "TRUNCATE TABLE" via procedure |
CREATE OR REPLACE PROCEDURE TRUNCTAB
(N_TAB IN VARCHAR2) IS
V_CURSOR INTEGER;
IGNORE INTEGER;
BEGIN
V_CURSOR := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(V_CURSOR,
'TRUNCATE TABLE '||N_TAB||' REUSE STORAGE',DBMS_SQL.V7);
IGNORE := DBMS_SQL.EXECUTE(V_CURSOR);
DBMS_SQL.CLOSE_CURSOR(V_CURSOR);
END;
/
CREATE PUBLIC SYNONYM TRUNCTAB FOR TRUNCTAB;
GRANT EXECUTE ON TRUNCTAB TO PUBLIC;
|
|
Eficiência da Library Cache |
SELECT ROUND(SUM(PINHITS)/SUM(PINS) * 100,2) FROM V$LIBRARYCACHE; |
|
Eficiência da Sort Area |
SELECT ROUND((SUM(DECODE(NAME, 'sorts (memory)', VALUE, 0))/
(SUM(DECODE(NAME, 'sorts (memory)', VALUE, 0))+
SUM(DECODE(NAME, 'sorts (disk)', VALUE, 0))))*
100,2) SORT
FROM V$SYSSTAT;
|
|
Eficiência do database buffer |
SELECT ROUND((1-(PR.VALUE/
(BG.VALUE+CG.VALUE)))*100,2) DB_BUFFER
FROM V$SYSSTAT PR, V$SYSSTAT BG, V$SYSSTAT CG
WHERE PR.NAME = 'physical reads' AND
BG.NAME = 'db block gets' AND
CG.NAME = 'consistent gets';
|
|
Eficiência do Dictionary Cache |
SELECT ROUND(SUM(GETS)/(SUM(GETS)+SUM(GETMISSES)) * 100,2) DICT FROM V$ROWCACHE; |
|
Encolher o rollback segment |
ALTER ROLLBACK SEGMENT RBS_05 SHRINK; Encolher para 512 Kbytes ALTER ROLLBACK SEGMENT RBS_05 SHRINK TO 512K; |
|
Fixar Packages na Shared Pool (SQL Area) |
Devido ao seu uso constante eu recomendo que os
packages abaixo estejam fixados na Shared Pool.
Exemplo de roteiro para ser disparado no Startup:
EXECUTE DBMS_SHARED_POOL.KEEP('DBMS_SHARED_POOL');
EXECUTE DBMS_SHARED_POOL.KEEP('DBMS_ALERT');
EXECUTE DBMS_SHARED_POOL.KEEP('DBMS_DDL');
EXECUTE DBMS_SHARED_POOL.KEEP('DBMS_DESCRIBE');
EXECUTE DBMS_SHARED_POOL.KEEP('DBMS_LOCK');
EXECUTE DBMS_SHARED_POOL.KEEP('DBMS_OUTPUT');
EXECUTE DBMS_SHARED_POOL.KEEP('DBMS_PIPE');
EXECUTE DBMS_SHARED_POOL.KEEP('DBMS_SESSION');
EXECUTE DBMS_SHARED_POOL.KEEP('DBMS_STANDARD');
EXECUTE DBMS_SHARED_POOL.KEEP('DBMS_UTILITY');
EXECUTE DBMS_SHARED_POOL.KEEP('STANDARD')
|
|
Fragmentação nos datafiles |
SELECT FILE_ID, SEGMENT_NAME, BLOCK_ID,
BLOCK_ID+BLOCKS NEXT, BLOCKS, BYTES
FROM DBA_EXTENTS
UNION
SELECT FILE_ID, 'FREE SPACE', BLOCK_ID,
BLOCK_ID+BLOCKS NEXT, BLOCKS, BYTES
FROM DBA_FREE_SPACE
ORDER BY 1, 3;
|
|
Hora em que a instância do Oracle foi ativada |
SELECT TO_CHAR(TO_DATE(D.VALUE,'J'),'MM/DD/YYYY.html')||' '||
TO_CHAR(TO_DATE(S.VALUE,'SSSSS'),'HH24:MI:SS') STARTUP_TIME
FROM V$INSTANCE D, V$INSTANCE S
WHERE D.KEY = 'STARTUP TIME - JULIAN' AND
S.KEY = 'STARTUP TIME - SECONDS';
|
|
Job's que estão em Execução |
COL C1 FORMAT 99 HEADING 'Ses'
COL C2 FORMAT 999 HEADING 'Id'
COL C3 FORMAT A10 HEADING 'Submitter' TRUNC
COL C4 FORMAT A10 HEADING 'Security' TRUNC
COL C5 FORMAT A20 HEADING 'Job' WORD_WRAPPED
COL C6 FORMAT A5 HEADING 'Last|Ok|Date'
COL C7 FORMAT A5 HEADING 'Last|Ok|Time'
COL C8 FORMAT A5 HEADING 'This|Run|Date'
COL C9 FORMAT A5 HEADING 'This|Run|Time'
COL C10 FORMAT 99 HEADING 'Err'
SELECT A.SID C1,
A.JOB C2,
B.LOG_USER C3,
B.PRIV_USER C4,
B.WHAT C5,
to_char(A.LAST_DATE,'MM/DD.html') C6,
substr(A.LAST_SEC,1,5) C7,
to_char(A.THIS_DATE,'MM/DD.html') C8,
substr(A.THIS_SEC,1,5) C9,
A.FAILURES C10
FROM DBA_JOBS B, DBA_JOBS_RUNNING A
WHERE A.JOB = B.JOB;
|
|
Listagem de todas as Tabelas "V$" |
SELECT KQFVINAM FROM X$KQFVI; |
|
Objetos fragmentados canditatos a reconstrucao |
COL C1 FORMAT A14
COL C2 FORMAT 999,999,999
BREACK ON OWNER ON TABLESPACE_NAME
SELECT OWNER, TABLESPACE_NAME, SEGMENT_NAME||
decode(SEGMENT_TYPE,'TABLE','[T]', 'INDEX', '[I]',
'ROLLBACK','[R]', '[O]') segment_name
, sum(BYTES) C2,
decode(count(*),1,to_char(count(*)),
2,to_char(count(*)),
3,to_char(count(*)),
4,to_char(count(*)),
5,to_char(count(*)),
to_char(count(*))||' < Re-Construir') C1
FROM DBA_EXTENTS
WHERE OWNER NOT IN ('SYS','SYSTEM','OWNER1')
GROUP BY OWNER, TABLESPACE_NAME, SEGMENT_NAME||
decode(SEGMENT_TYPE,'TABLE','[T]', 'INDEX', '[I]',
'ROLLBACK','[R]', '[O]')
HAVING count(*) > 5;
|
|
Opções instaladas do banco |
Para verificar as opções instaladas no banco, digite: SELECT * FROM V$OPTION; |
|
Opções que o Banco de Dados contempla |
COL C1 FORMAT A35
COL C2 FORMAT A35
SELECT PARAMETER C1,
VALUE C2
FROM X$OPTION;
|
|
Pacotes que estão fixos em Memória |
--- **NOTA: execute dbms_shared_pool.keep('nome');
COL C1 HEADING 'Owner'
COL C2 HEADING 'Tipo'
COL C3 HEADING 'Nome'
COL C4 HEADING 'Execucoes' FORMAT 999,999,999
COL C5 HEADING 'Memoria_Usada' FORMAT 999,999,999
SELECT substr(OWNER,1,10) C1,
substr(TYPE,1,12) C2,
substr(NAME,1,20) C3,
EXECUTIONS C4,
SHARABLE_MEM C5,
substr(KEPT||' ',1,4) 'Fixo?'
FROM V$DB_OBJECT_CACHE
WHERE TYPE IN ('TRIGGER','PROCEDURE','PACKAGE BODY','PACKAGE')
ORDER BY C4 DESC;
|
|
Parâmetros de inicialização do Oracle |
SELECT NAME, VALUE FROM V$PARAMETER ORDER BY NAME; |
|
Parâmetros não documentados no INIT.ORA |
SELECT KSPPINM FROM X$KSPPI WHERE SUBSTR(KSPPINM, 1, 1) = '_' ORDER BY 1; |
|
Porcentagem de Memória Livre na Shared Pool |
SELECT ROUND((SUM(DECODE(NAME, 'free memory', BYTES, 0)) /
SUM(BYTES)) * 100,2) FREE_MEM
FROM V$SGASTAT;
|
|
Processo trace no SQL*Plus |
Executar antes os arquivos UTLXPLAN.SQL e PLUSTRCE.SQL SQL> SET AUTOTRACE ON |
|
Processos do Oracle e Processos do SO |
SELECT A.USERNAME, A.STATUS, B.USERNAME OS_USER,
B.SPID, A.SID, A.SERIAL#, A.MACHINE
FROM V$SESSION A, V$PROCESS B
WHERE A.PADDR = B.ADDR;
|
|
Quantidade de objetos nas tablespaces |
Para verificar a quantidade de objetos dos usuários nas tablespaces, podemos efetuar a DML abaixo: BREAK ON TABLESPACE ON OWNER COL C1 FORMAT A25 HEADING OBJETOS DADOS/INDICES SELECT TABLESPACE_NAME, OWNER COUNT(*) ||' TABELAS' C1 FROM DBA_TABLES GROUP BY TABLESPACE_NAME, OWNER UNION SELECT TABLESPACE_NAME, OWNER COUNT(*) ||' INDICES' C1 FROM DBA_INDEXES GROUP BY TABLESPACE_NAME, OWNER; |
|
Reexecuções solicitadas no Pool compartilhado |
COL C1 HEADING 'Objeto(pseudo-codigo)' COL C2 FORMAT 999.999 HEADING 'Reloads' COL C3 FORMAT 999.999 HEADING 'Invalidacoes' SELECT NAMESPACE C1, RELOADS C2, INVALIDATIONS C3 FROM V$LIBRARYCACHE; |
|
Renovar as tabelas de Snapshot |
Para renovar todas as tabelas de snapshot o pacote
abaixo pode ser executado a qualquer momento no
siatema de destino.
EXECUTE DBMS_SNAPSHOT.REFRESH_ALL;
Para forcar a renovação de apenas uma tabela:
EXECUTE DBMS_SNAPSHOT.REFRESH('tabela','F'); /*forced refresh*/
|
|
Tornar um arquivo autoextend |
ALTER DATABASE DATAFILE '/u03/oradata/dsv01/tbs_dsv01_usr_dados_01.dbf' AUTOEXTEND ON NEXT 10M MAXSIZE 500M; ALTER DATABASE DATAFILE '/u03/oradata/dsv01/tbs_dsv01_usr_dados_01.dbf' AUTOEXTEND MAXSIZE UNLIMITED; SELECT FILE#, MAXEXTEND* |
|
Utilização do Database Buffer Cache |
SELECT DECODE (STATE, 0, 'FREE',
1, 'READ AND MODIFIED',
2, 'READ AND NOT MODIFIED',
3, 'CURRENTLY BEING READ','OTHER') BUFFER,
COUNT(*)
FROM X$BH
GROUP BY DECODE (STATE, 0, 'FREE',
1, 'READ AND MODIFIED',
2, 'READ AND NOT MODIFIED',
3, 'CURRENTLY BEING READ','OTHER');
|
|
Versão do Banco |
Para verificar a versão de seu banco de dados, digite: SELECT * FROM V$VERSION; |
|
ORA-00001 - Dup val on index |
O erro ORA-00001 é um erro relacionado à duplicação de registros do índice. Provavelmente o que está ocorrendo é uma violação de unicidade de uma chave primária ou única, geralmente comum em operações de INSERT ou UPDATE. |
|
ORA-01403 - No data found |
O erro ORA-01403 é um erro relacionado ao SELECT dentro de uma rotina PL/SQL. Esse erro ocorre quando um SELECT não retorna nenhuma linha. Por exemplo: ... SELECT nome into v_nome FROM empregados WHERE num = -1; ... esse comando não retornou nada, pois não existe empregado -1,logo ocorreu o erro. |
|
Built-in set_lov_property |
Se um determinado campo dependendo de uma determinada situação,
necessitar apresentar ora uma lista de valores ora outra, pode ser utilizada
a buit-in set_lov_property.
Exemplo: Trata-se de um cardápio eletrônico.
List_values: lv_produtos
Record_group: rg_frutas
Select subcodigo, nome
From produtos
Where codigo = 1
Order by nome
Record_group: rg_bebidas
Select subcodigo, nome
From produtos
Where codigo = 2
Order by nome
Se a condição for apresentar apenas a lista de frutas então:
set_lov_property('lv_produtos', group_name, 'rg_frutas');
Se a condição for apresentar apenas a lista de bebidas então:
set_lov_property('lv_produtos', group_name, 'rg_bebidas');
|
|
Chamada de um form dentro de outro form |
A chamada de um Form dentro de outro Form pode ser feita de três
maneiras:
CALL_FORM - Chama um form, mantendo o form chamador
aberto. Quando o form chamado é finalizado, o comando voltar
para a linha abaixo do comando call_form.
OPEN_FORM - Chama um form, abrindo uma outra seção ou
mantendo a mesma seção. É utilizado em aplicações onde podem
ser abertos vários forms, sem ter que fechá-los. Obs.: Este tipo de
chamada, se não for muito bem controlada, pode ocasionar perda
de foco entre as janelas dos forms.
NEW_FORM - Chama um form fechando o form chamador.
|
|
Condições de query |
A pesquisa realizada em um bloco base table pode ter filtros. As
condições para se realizar a pesquisa podem ser programadas de duas
formas:
na trigger pre-query - Será necessário definir a default_where.
Constrói-se a cláusula condicional que será atribuída ao
default_where através da built-in set_block_property.
Exemplo:
Bloco: pedido
Colunas: codigo_pedido data_pedido valor_pedido
declare
def_where varchar2(500) := null;
begin
def_where := 'valor_pedido > 500';
set_block_property(pedido, default_where, def_where);
end;
na property where clause do bloco basta digitar a condição:
valor_pedido > 500
|
|
Erros de windows e canvas durante conversão 4.5->5 |
Ao converter um form 4.5 para 5.0, todos os canvas e windows perdem
suas referências.
Em forms pequenos (com poucas windows), basta referenciá-los
novamente.
Em forms maiores (com muitas windows, 5 ou mais) podem ocorrer os
erros FRM-30161: Inconsistent relationship between window
|
|
Forms 5.0 funcionando como Forms 4.5 |
Para fazer com que um forms 5.0 se comporte como um forms 4.5, basta
alterar a propriedade (nível de form) chamada Runtime Compatibility
Mode.
|
|
Mensagens de erro |
As mensagens exibidas pelo form, podem ser tratadas através das triggers
on-error e on-message.
Podem ser utilizadas libraries com a tradução das mensagens, tratando
cada código de erro apresentado pelo form.
|
|
Propriedade highlight no Forms 5 |
No Forms 5.0 para que um campo apresente um comentário quando o
mouse é passado sobre ele, basta definir o comentário na property tooltip
do item.
|
|
system.message_level |
Quando a variável de sistema :system.message_level é alterada pelo
programador, podem ser inibidas algumas mensagens apresentadas pelo
form.
Deve ser verificado o nível da mensagem apresentada.
Os níveis são 0, 5, 10, 15, 20 e 25, sendo que o nível 0 (zero) é default,
fazendo com que o form apresente todas as mensagens.
|
|
Utilização do Post |
Cuidado ao utilizar o post, porque não é um commit efetivo.
Essa built-in funciona como se fosse um commit, porém só faz efeito para a
sessão que está realizando o post; as outras seções não "enxergam" as
possíveis alterações, inclusões ou exclusões realizadas pelo post.
O post pode alterar o status do form para query e realiza todas as
checagens em triggers disparadas pelo commit (por ex.: pre-insert,
pre-update).
|
|
Variáveis de data corrente no Forms, cuidado! |
Para quem gosta de utilizar variáveis de sistema na programação,
CUIDADO!
No forms 4.5, a variável :system.current_datetime representa a data/hora
do servidor.
No forms 5.0, a variável mudou de nome. É a :system.effective_date. E a
:system.current_datetime representa a data/hora do sistema operacional do
client (micro).
Sugestão: Criar uma função "fdata" no banco para retornar a data do
servidor, que seja executada junto com o startup do banco. Utilizar esta
função ao invés da variável de sistema para não correr o risco de ter que
alterá-la em todos os programas, caso hajam mudanças como essa.
|
|
Como logar-se como SYS no 9i ? |
Para logar-se como SYS no 9i: connect sys/senha_do_sys as sysdba Para acessar normalmente como no Oracle 7/8/8i : altere o seguinte parâmetro no init: O7_DICTIONARY_ACCESSIBILITY=TRUE restarte o banco e tente se logar: connect sys/senha_do_sys |
|
Como procurar tratamento para mensagem de erro? |
UNIX: Existe um aplicativo chamado oerr que mostra a mensagem de erro e o que fazer para solucioná-la. Simplesmente digite: oerr tipo_do_erro número_do_erro Por exemplo: oerr ora 600 vai te orientar o que fazer se der ocorrer o erroORA-0600. Windows: No SQL*Plus: set serverout on exec dbms_output.put_line(sqlerrm(número_do_erro ) Porém esse método só mostra a mensagem do erro, e não o que fazer como solucioná-lo |
|
Definindo um banco de dados padrão no login |
Nas estações Windows para definir um banco de dados padrão basta adicionar uma variável de ambiente ao sistema operacional chamada LOCAL. Para isso, clique em iniciar->executar e digite REGEDIT. Depois procure dentro das pastas: Meu Computador->HKEY_LOCAL_MACHINE->SOFTWARE->ORACLE Dentro da pasta Oracle crie uma varíavel: clicando com o botão direito do mouse: Novo->Valor da Sequência->LOCAL Agora dê um duplo clique em local e entre com o valor do banco de dados que desejar. Se por acaso no trabalho todo dia vc se loga como: portal/minhasenha@oracle8i coloque na LOCAL o valor "oracle8i". Assim basta você se logar como portal/minhasenha que será feita a conexão em oracle8i sem problemas. |
|
Diretorios padrão no Windows |
Esses são alguns diretórios que o Oracle usa como padrão na instalação: ORACLE_HOME ficava no C:\ORAWIN95 nas versões 7 até 8.0; agora na 8i o ORACLE_HOME fica no C:\ORACLE\OraHome1 |
|
|
Finalizando listener |
em Windows ou UNIX: lsnrctl stop se for Oracle 8.0: lsnrctl80 stop |
|
iniciando listener |
em Windows ou UNIX: lsnrctl start se for Oracle 8.0: lsnrctl80 start |
|
status do listener |
em Windows ou UNIX: lsnrctl status se for Oracle 8.0: lsnrctl80 status |
|
APW - Agenda Pessoal via Web |
-- URL : http://www.oracle.trix.net -- Criado : 14 e 15/8/2000 -- Aplicativo : Agenda PL/SQL /* Esta aplicacao foi criada com o proposito totalmente DIDATICO, ou seja, para o aprendizado de aplicacoes web em PL/SQL. Trata-se de um sistema de consulta/cadastro e alteracao bem simples, envolvendo 3 tabelas: CIDADES, PFISICAS (das pessoas fisicas) e PJURIDICAS (das pessoas juridicas). Para o desenvolvimento de algo mais complexo basta adaptar a aplicacao e adicionar rotinas na medida do possivel. Numa futura implementacao poderia existir a mesma aplicacao, porem com suporte a varios usuarios, ou seja, varias agendas de varios usuarios, cada um com sua area publica e privada e cada um com a sua senha. Coloque o seu servidor web no ar (WebDB ou OAS) e chame o endereco: http://seu-site/sua-aplicacao/apw.inicio ========================================= |
|
Executar comandos DML (create, alter,etc) no 8i |
Em uma rotina PL/SQL , para executar um
comando DML, como por exemplo
um CREATE TABLE, utilize o comando EXECUTE IMMEDIATE
da seguinte maneira:
procedure teste_cria_tabela(nome varchar2)
as
begin
execute immediate ' create table '||nome||' ( teste char)' ;
end;
Essa procedure criará tabelas dinamicamente, basta passar
o parâmetro correto, por exemplo:
teste_cria_tabela('tabela1);
teste_cria_tabela('tabela2);
...
|
|
Tratando qualquer tipo de erro na rotina |
Numa rotina desse tipo: begin ... ... end; para tratar qualquer tipo de erro adicione as linhas: begin .. .. EXCEPTION when others then ..... end; Exemplo: declare v_nome varchar2(30); begin select nome into v_nome from funcionarios where ID=100; EXCEPTION when OTHERS then raise_application_error(-20000,' Erro no cadastro!'); end; |
|
Utilização das variáveis compostas do PL/SQL |
-------------------------------------------------------------------
Exemplo de utilizacao das variaveis compostas do PL/SQL
para a leitura de uma tabela e passa-la como parametro.
-------------------------------------------------------------------
O exemplo utiliza a tabela EMP do usuario SCOTT.
-------------------------------------------------------------------
Existem no exemplo 4 rotinas: a procedure le_Tabela faz
exatamente o que as 3 rotinas restantes fazem: le os
dados da tabela EMP e os exibe na tela do SQL*Plus.
-le_tabela - procedure que le os dados da EMP e os exibe
na tela
-pac_tabela - package que possui o tipo emp_tabela_type publico
-le_tabela2 - le a tabela EMP e joga pra variavel TABELA
-le_tabela3 - recebe uma variavel do tipo emp_tabela_type e
exibe o seu conteudo na tela.
-------------------------------------------------------------------
Analize o codigo fonte para melhor compreensao.
-------------------------------------------------------------------
Obs: poderia ter juntado as rotinas le_tabela2 e le_tabela3 dentro
da package pac_tabela
-------------------------------------------------------------------
Rode esses comandos no SQL*Plus para criacao dos 4 objetos
-------------------------------------------------------------------
create or replace package pac_tabela is
-- criando um vetor de linhas da tabela emp
type emp_tabela_type
is table of scott.emp%rowtype
index by binary_integer;
end pac_tabela;
/
-------------------------------------------------------------------
create or replace procedure le_tabela
as
-- criando um vetor de linhas da tabela emp
type emp_tabela_type
is table of scott.emp%rowtype
index by binary_integer;
tabela emp_tabela_type ;
-- para referenciar linha: tabela(numero)
-- para referenciar campo: tabela.campo
-- Exemplo: linha 5 , coluna sal: tabela(5).sal
cursor c_emp is
select * from scott.emp;
contador number :=1;
begin
dbms_output.put_line('Executando a rotina le_tabela...');
-- le dados da tabela
for rec_emp in c_emp loop
tabela(contador):=rec_emp;
contador:=contador+1;
end loop;
-- le dados da variavel para a tela do SQL*Plus
-- nao esqueca de digitar "set serverout on"
-- para conseguir ver o resultado
for n in reverse 1..contador-1 loop
dbms_output.put_line(initcap(tabela(n).ename)||' tem o cargo de '||lower(tabela(n).job)||'.');
end loop;
end le_tabela;
/
-------------------------------------------------------------------
create or replace procedure le_tabela2
as
tabela pac_tabela.emp_tabela_type ;
-- para referenciar linha: tabela(numero)
-- para referenciar campo: tabela.campo
-- Exemplo: linha 5 , coluna ename: tabela(5).ename
cursor c_emp is
select * from scott.emp;
contador number :=1;
begin
dbms_output.put_line('Executando a rotina le_tabela2...');
-- le dados da tabela
for rec_emp in c_emp loop
tabela(contador):=rec_emp;
contador:=contador+1;
end loop;
-- chama a rotina le_tabela3 passando parametros
le_tabela3(tabela);
end le_tabela2;
/
-------------------------------------------------------------------
create or replace procedure le_tabela3
(tabela in pac_tabela.emp_tabela_type)
as
begin
dbms_output.put_line('Executando a rotina le_tabela3...');
-- le dados da variavel para a tela do SQL*Plus
-- nao esqueca de digitar "set serverout on"
-- para conseguir ver o resultado
for n in reverse 1..tabela.count loop
dbms_output.put_line(initcap(tabela(n).ename)||' tem o cargo de '||lower(tabela(n).job)||'.');
end loop;
end le_tabela3;
/
-------------------------------------------------------------------
Esse foi o resultado no sqlplus:
-------------------------------------------------------------------
SQL> set serverout on
SQL> exec le_tabela
Executando a rotina le_tabela...
Miller tem o cargo de clerk.
Ford tem o cargo de analyst.
James tem o cargo de clerk.
Adams tem o cargo de clerk.
Turner tem o cargo de salesman.
King tem o cargo de president.
Scott tem o cargo de analyst.
Clark tem o cargo de manager.
Blake tem o cargo de manager.
Martin tem o cargo de salesman.
Jones tem o cargo de manager.
Ward tem o cargo de salesman.
Allen tem o cargo de salesman.
Smith tem o cargo de clerk.
PL/SQL procedure successfully completed
SQL> exec le_tabela2
Executando a rotina le_tabela2...
Executando a rotina le_tabela3...
Miller tem o cargo de clerk.
Ford tem o cargo de analyst.
James tem o cargo de clerk.
Adams tem o cargo de clerk.
Turner tem o cargo de salesman.
King tem o cargo de president.
Scott tem o cargo de analyst.
Clark tem o cargo de manager.
Blake tem o cargo de manager.
Martin tem o cargo de salesman.
Jones tem o cargo de manager.
Ward tem o cargo de salesman.
Allen tem o cargo de salesman.
Smith tem o cargo de clerk.
PL/SQL procedure successfully completed
-------------------------------------------------------------------
|
|
Colocar o IAS no ar |
No NT: inicialize o servico iAS (Apache) No unix: logue-se com o usuário que instalou o produto e digite: inicialize o script: startJserv.sh |
|
Colocar um site no ar (OAS versão 3) |
owsctl start wrb owsctl start www |
|
Colocar um site no ar (OAS versão 4) |
owsctl start ou: owsctl start -orb owsctl start -wrb all owsctl start -l www A porta de administração: owsctl start -nodemgr |
|
Tirar um site do ar (OAS versão 3) |
owsctl stop admin owsctl stop www owsctl stop |
|
Tirar um site do ar (OAS versão 4) |
owsctl stop A porta de administração: owsctl stop -nodemgr |
FSOFTWARES ® Todos os direitos reservados.
Redirecinar: http://www.fontesbrasil.com Melhor visualização 800 x 600