Você está na página 1de 7

Oracle XE 11g R2 / Oracle 11g R2

Desde a introduo do XML DB em Oracle 9i Release 2, o servidor Oracle tem continha um


servidor HTTP embutido, alm do servidor Apache HTTP. No Oracle 10g Release 2 este servidor HTTP
pode ser usado como uma porta de entrada embutido PL / SQL para executar aplicaes PL / SQL via
mod_plsql. A Administrao de Descritores De Acesso banco de dados (DADS) para o XML do servidor
HTTP DB realizada utilizando o pacote DBMS_EPG. Este artigo vou apresentar um exemplo simples
de seu uso. Vamos ativar o ambiente para criao de pginas html/php/css via PL/SQL.

Configurao bsica
Em primeiro lugar temos de garantir que temos acesso ao esquema de exemplo< TAMIS> e o
esquema XDB.
CONN sys/informar a senha AS SYSDBA
-- Criar esquema <TAMIS> se voc ainda no o tem.
@ C:\app\Electron\product\11.2.0\client_1\rdbms\admin\utlsampl.sql
@C:\app\Administrador\product\11.2.0\dbhome_1\RDBMS\ADMIN\utlsampl.sql
ALTER USER TAMIS IDENTIFIED BY tamis221204 ACCOUNT UNLOCK;

Em seguida, usamos o procedimento CREATE_DAD para criar um descritor de acesso ao banco


com um caminho virtual associada.
BEGIN
DBMS_EPG.create_dad (
dad_name => 'epg_dad',
-- trocar por tamis
path
=> '/epg_dad/*'); -- trocar por tamis
END;

Os mapeamentos atuais para um DAD especficos podem ser recuperadas usando o


procedimento get_all_dad_mappings.
SET SERVEROUTPUT ON SIZE UNLIMITED
DECLARE
l_paths DBMS_EPG.varchar2_table;
BEGIN
DBMS_EPG.get_all_dad_mappings (
dad_name => 'epg_dad',
paths
=> l_paths);
DBMS_OUTPUT.put_line('Mappings');
DBMS_OUTPUT.put_line('========');
FOR i IN 1 .. l_paths.count LOOP
DBMS_OUTPUT.put_line(l_paths(i));
END LOOP;
END;

Os mapeamentos associados com DADs existentes pode ser alterado, utilizando os


procedimentos e UNMAP_DAD MAP_DAD.
Joel.jsp@gmail.com | joel_jsp@outlook.com |

(55)479668-8829

BEGIN
DBMS_EPG.unmap_dad (
dad_name => 'epg_dad',
path
=> '/epg_dad/*');
DBMS_EPG.map_dad (
dad_name => 'epg_dad',
path
=> '/epg_dad/*');
END;

O procedimento SET_DAD_ATTRIBUTE usada para associar atributos com o DAD. No


exemplo abaixo, os banco de dados de nome de usurio e pginas padro atributos so definidos para
o DAD.

BEGIN
DBMS_EPG.set_dad_attribute (
dad_name
=> 'epg_dad',
attr_name => 'default-page',
attr_value => 'home');
DBMS_EPG.set_dad_attribute (
dad_name
=> 'epg_dad',
attr_name => 'database-username',
attr_value => TAMIS);
END;

Os atributos associados a um DAD especficos podem ser recuperadas usando o procedimento


GET_ALL_DAD_ATTRIBUTES. O exemplo a seguir deve apresentar uma lista de atributos, mas na
hora de escrever este procedimento no aparecem para trabalhar.
SET SERVEROUTPUT ON SIZE UNLIMITED;
DECLARE
l_attr_names
DBMS_EPG.varchar2_table;
l_attr_values DBMS_EPG.varchar2_table;
BEGIN
DBMS_OUTPUT.put_line('Attributes');
DBMS_OUTPUT.put_line('==========');
DBMS_EPG.get_all_dad_attributes (
dad_name
=> 'epg_dad',
attr_names => l_attr_names,
attr_values => l_attr_values);
FOR i IN 1 .. l_attr_names.count LOOP
DBMS_OUTPUT.put_line(l_attr_names(i) || '=' || l_attr_values(i));
END LOOP;
END;

A funo GET_DAD_ATTRIBUTE usado para recuperar o valor de um atributo especfico, e


revela que os atributos esto corretamente definidas, apesar de a sada do exemplo anterior.

SET SERVEROUTPUT ON SIZE UNLIMITED


DECLARE

Joel.jsp@gmail.com | joel_jsp@outlook.com |

(55)479668-8829

l_attr_name
l_attr_value

VARCHAR2(30);
VARCHAR2(30);

PROCEDURE my_get_dad_attribute (p_dad_name


IN
p_attr_name IN
l_attr_value VARCHAR2(30);
BEGIN
l_attr_value := DBMS_EPG.get_dad_attribute (
dad_name => p_dad_name,
attr_name => p_attr_name);

VARCHAR2,
VARCHAR2) AS

DBMS_OUTPUT.put_line(p_attr_name || '=' || l_attr_value);


END;
BEGIN
DBMS_OUTPUT.put_line('Attribute');
DBMS_OUTPUT.put_line('=========');
l_attr_name := 'authentication-mode';
my_get_dad_attribute('epg_dad', 'default-page');
my_get_dad_attribute('epg_dad', 'database-username');
my_get_dad_attribute('epg_dad', 'authentication-mode');
END;

O procedimento DELETE_DAD_ATTRIBUTE utilizado para remover os atributos PAI.


BEGIN
DBMS_EPG.delete_dad_attribute (
dad_name
=> 'epg_dad',
attr_name => 'default-page');
END;

O procedimento AUTHORIZE_DAD usado para habilitar o acesso ao esquema especificado


atravs da DAD. Se o parmetro do usurio no for especificado o usurio atual assumido. Se vrios
usurios esto autorizados o atributo de banco de dados-username usado para decidir qual usar.
BEGIN
DBMS_EPG.authorize_dad (
dad_name => 'epg_dad',
user
=> TAMIS);
END;

A autorizao pode ser invertida utilizando o procedimento DEAUTHORIZE_DAD.


BEGIN
DBMS_EPG.deauthorize_dad (
dad_name => 'epg_dad',
user
=> TAMIS);
END;

Joel.jsp@gmail.com | joel_jsp@outlook.com |

(55)479668-8829

Testando a aplicao
Uma vez que o DAD est configurado precisamos compilar um procedimento para o esquema
TAMIS para que o pai pode ser testado.
CREATE OR REPLACE PROCEDURE tamis.home IS
BEGIN
HTP.htmlopen;
HTP.headopen;
HTP.title('Bem vindo a pgina de testes!');
HTP.headclose;
HTP.bodyopen;
HTP.print('Essa somente uma pgina de testes! DateTime: ' || TO_CHAR(SYSTIMESTAMP));
HTP.bodyclose;
HTP.htmlclose;
END home;

O servidor HTTP embutido deve registar-se automaticamente com o ouvinte. A documentao


DB XML sugere que a porta 8080 deve ser apresentado para o acesso HTTP automaticamente. Na
minha experincia, isso no parece ser o caso, ento eu fui forado a aditadas as seguintes entradas
no DESCRIPTION_LIST do arquivo listener.ora. O ouvinte deve ser recarregado ou reiniciado antes de
quaisquer testes que so realizados.
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=8080))(Presentation=HTTP)(Session=RAW)
)
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=2100))(Presentation=FTP)(Session=RAW)
)

O pai pode agora ser testada, chamando o seguinte URL em um navegador.


http://<server-name>:8080/epg_dad/home
http://localhost:8080/epg_dad/home

Uma vez que voc se convenceu de que o pai trabalha voc est pronto para desenvolver
aplicaes web PL / SQL usando o Web Toolkit PL / SQL ou PL / SQL Server Pages.

Habilitando o repositrio
Se voc deseja habilitar o acesso annimo para o repositrio DB XML, o cdigo a seguir cria o
elemento "<allow-repository-anonymous-access>" (allow-de acesso annimo repositrio) se ele estiver
ausente, ou o atualiza, se ele j est presente no arquivo xdbconfig.xml.
CONN sys/password AS SYSDBA
SET SERVEROUTPUT ON
DECLARE
l_configxml XMLTYPE;
l_value
VARCHAR2(5) := 'true'; -- (true/false)
BEGIN
l_configxml := DBMS_XDB.cfg_get();

Joel.jsp@gmail.com | joel_jsp@outlook.com |

(55)479668-8829

IF l_configxml.existsNode('/xdbconfig/sysconfig/protocolconfig/httpconfig/allowrepository-anonymous-access') = 0 THEN
-- Add missing element.
SELECT insertChildXML
(
l_configxml,
'/xdbconfig/sysconfig/protocolconfig/httpconfig',
'allow-repository-anonymous-access',
XMLType('<allow-repository-anonymous-access
xmlns="http://xmlns.oracle.com/xdb/xdbconfig.xsd">' ||
l_value ||
'</allow-repository-anonymous-access>'),
'xmlns="http://xmlns.oracle.com/xdb/xdbconfig.xsd"'
)
INTO
l_configxml
FROM
dual;
DBMS_OUTPUT.put_line('Element inserted.');
ELSE
-- Update existing element.
SELECT updateXML
(
DBMS_XDB.cfg_get(),
'/xdbconfig/sysconfig/protocolconfig/httpconfig/allow-repository-anonymousaccess/text()',
l_value,
'xmlns="http://xmlns.oracle.com/xdb/xdbconfig.xsd"'
)
INTO
l_configxml
FROM
dual;
DBMS_OUTPUT.put_line('Element updated.');
END IF;
DBMS_XDB.cfg_update(l_configxml);
DBMS_XDB.cfg_refresh;
END;

Uma vez que o o "<allow-de acesso annimo repositrio>" elemento definido como "true", o
acesso annimo para o repositrio DB XML ativado por desbloquear a conta do banco de dados
annimos.
CONN sys/password AS SYSDBA
ALTER USER anonymous ACCOUNT UNLOCK;

Removendo o acesso annimo para o repositrio DB XML pode ser realizado atravs do
bloqueio da conta de banco de dados annimos, ou definir o elemento "<allow-de acesso annimo
repositrio>" de volta para "false".
Se voc precisar remover o elemento "<acesso permitir-repositrio-anonymous>" inteiramente,
ele pode ser realizado utilizando o seguinte cdigo.
CONN sys/password AS SYSDBA
SET SERVEROUTPUT ON
DECLARE
l_configxml XMLTYPE;

Joel.jsp@gmail.com | joel_jsp@outlook.com |

(55)479668-8829

BEGIN
l_configxml := DBMS_XDB.cfg_get();
IF l_configxml.existsNode('/xdbconfig/sysconfig/protocolconfig/httpconfig/allowrepository-anonymous-access') != 0 THEN
SELECT deleteXML
(
l_configxml,
'/xdbconfig/sysconfig/protocolconfig/httpconfig/allow-repositoryanonymous-access',
'xmlns="http://xmlns.oracle.com/xdb/xdbconfig.xsd"'
)
INTO
l_configxml
FROM
dual;
DBMS_XDB.cfg_update(l_configxml);
DBMS_XDB.cfg_refresh;
DBMS_OUTPUT.put_line('Element deleted.');
END IF;
END;

O DROP_DAD utilizado para remover um PAI indesejado.


-- LIMPE O DAD
BEGIN
DBMS_EPG.drop_dad (
dad_name => 'epg_dad');
END;

- Bloquear os usurios novamente.


ALTER USER scott ACCOUNT LOCK;

Esse artigo foi desenvolvido por Joel Schecheleski, para ensinar de forma prtica como configurar o banco
de dados para aceitar via browser Funes e Procedimentos HTP. Para quem tiver dvidas existe uma procedure
de banco de dados capaz de fazer todas as configuraes acima informadas, bastando informar somente o usurio
que ter acesso ao repositrio do banco de dados. Em caso de dvidas entre em contato.

Joel.jsp@gmail.com | joel_jsp@outlook.com |

(55)479668-8829

Joel.jsp@gmail.com | joel_jsp@outlook.com |

(55)479668-8829