// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Criando uma Aplicação Orientada pelo Banco de Dados com o PHP
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Criando uma Aplicação Orientada pelo Banco de Dados com o PHP - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Criando uma Aplicação Orientada pelo Banco de Dados com o PHP

= Lição 1b: Criando Tabelas do Banco de Dados Oracle
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Lição 1b: Criando Tabelas do Banco de Dados Oracle - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Lição 1b: Criando Tabelas do Banco de Dados Oracle


Esta lição descreve a última etapa preliminar no desenvolvimento da aplicação da Lista de Desejos: a criação de um banco de dados de amostra com dados de teste. Para concluir as etapas deste tutorial, você precisará de um banco de dados para armazenar os dados dos wishers. Com o NetBeans IDE, você pode realizar todas essas atividades usando a interface do IDE. 
Antes de começar, veja os requisitos do tutorial descritos em link:wish-list-tutorial-main-page.html[+Criando uma Aplicação CRUD com PHP - Página Principal+].

O documento atual é uma parte do tutorial Criando uma Aplicação CRUD no NetBeans IDE para PHP.



== Criando o Usuário do Banco de Dados

Nesse procedimento, primeiro você cria um usuário e, em seguida, cria as tabelas como aquele usuário.

Você pode criar um usuário com as ferramentas do Oracle ou conetando o NetBeans IDE ao banco de dados e usando o editor SQL do IDE. O NetBeans 7.0, atualmente disponível apenas como buids beta ou de desenvolvimento, fornece conexão aprimorada a bancos de dados Oracle. Para saber como conectar o NetBeans IDE ao Banco de Dados Oracle e como criar um usuário naquele banco de dados, consulte o tutorial link:../ide/oracle-db.html[+Conectando-se a um Banco de Dados Oracle+].

Usando a ferramenta de sua preferência, crie o seguinte usuário:

|===
|Nome do Usuário |phpuser 

|Password |phpuserpw 

|Privilégios do Sistema |CREATE TABLE 

|CREATE VIEW 

|CREATE SEQUENCE 

|CREATE TRIGGER 

|Atribuições (Banco de Dados Oracle 10.x) |CONNECT 

|RESOURCE 
|===

Segue um exemplo de conjunto de comandos SQL para criar esst usuário. Esses comandos presumem que o banco de dados tem os espaços de tabela USERS e TEMP.


[source,sql]
----

drop user phpuser cascade;
create user phpuser identified by phpuserpw;
grant connect, resource to phpuser;
alter user phpuser default tablespace users temporary tablespace temp account unlock;
----


== Criando a Estrutura do Banco de Dados de Amostra

Para organizar e armazenar todos os dados necessários, você precisa de duas tabelas:

* Uma tabela de wishers para armazenar nomes e senhas de usuários registrados
* Uma tabela de desejos para armazenar descrições de desejos

image::images/wishlist-db.png[]

A tabela de wishers contém três campos:

1. id - a identificação exclusiva de um wisher. Este campo é usado como a Chave Primária
2. nome
3. senha

A tabela de desejos contém quatro campos:

1. id - a identificação exclusiva de um desejo. O campo é usado como a Chave Primária
2. wisher_id - a identificação do wisher a quem o desejo pertence. O campo é usado como a Chave Estrangeira.
3. descrição
4. due_date - a data para a qual o desejo foi solicitado

As tabelas são relacionadas por meio do wisher ID. Todos os campos são obrigatórios, exceto due_date em desejos.


== Criando o Esquema do Banco de Dados Oracle

1. Faça log-in no banco de dados como o usuário que você criou.

Se estiver se conectando por meio do NetBeans IDE, crie uma conexão com o nome e a senha do novo usuário. Assegure-se de selecionar o esquema com o mesmo nome que o do usuário. (Consulte a seção link:../ide/oracle-db.html#connect[+Estabelecendo uma Conexão com o Banco de Dados Oracle+] do tutorial Conectando-se a um Banco de Dados Oracle.)

2. Para criar a tabela wishers, execute a seguinte consulta SQL:

[source,sql]
----

create table wishers (id number not null,name varchar2(50) unique not null, password varchar2(50) not null, constraint wishers_pk primary key(id));
----
3. Para criar a tabela wishes, execute a consulta SQL a seguir. Observe que você cria uma chave estrangeira que associa wishes com um wisher.

source,sql]
----

create table wishes (id number not null, wisher_id number not null,description varchar2(255) not null, due_date date, constraint wishes_pk primary key(id), constraint wishes_fk1 foreign key(wisher_id) references wishers(id));
----
4. Verifique se as novas tabelas são adicionadas no banco de dados. Se você estiver usando o NetBeans IDE para se conetar ao banco de dados, acesse a janela Serviços do nó de conexão jdbc:oracle:thin:@localhost:1521:XE [phpuser on PHPUSER]. As novas tabelas serão listadas no nó Tabelas. (Se elas não aparecerem, clique com o botão direito do mouse na conexão e selecione Atualizar.) 

image::images/tables-in-services-window.png[]

Observação: Você pode fazer download de um conjunto de comandos SQL para criar as tabelas do Banco de Dados Oracle link:https://netbeans.org/projects/www/downloads/download/php%252FSQL-files-for-Oracle.zip[+aqui+].


== Adicionando Sequências e triggers para Incrementar os Valores de ID

Com o Banco de Dados Oracle, você deve especificar uma sequência para incrementar um valor. Para que o valor seja incrementado quando um novo membro é adicionado a uma tabela, você adiciona um trigger.

1. Para adicionar uma sequência na tabela wishers, execute o seguinte comando SQL:

[source,sql]
----

create sequence wishers_id_seq start with 1 increment by 1;
----
2. Para acionar a sequência na coluna ID da tabela wishers quando você adiciona um novo wisher, execute o seguinte comando SQL:

[source,sql]
----

create or replace trigger wishers_insert
before insert on wishers
for each row
begin
    select wishers_id_seq.nextval into :new.id from dual;
end;
/
----
3. Adicione uma sequência à tabela wishes.

[source,sql]
----

create sequence wishes_id_seq start with 1 increment by 1;
----
4. Add a trigger to run the sequence on the ID column of the wishes table when you add a new wish.

[source,sql]
----
4. Adicione um trigger para executar a sequência na coluna ID da tabela wishes quando você adiciona um novo wish.

[source,sql]
----

create or replace trigger wishes_insert
before insert on wishes
for each row
begin
    select wishes_id_seq.nextval into :new.id from dual;
end;
/
----

Observação: Você pode fazer download de um conjunto de comandos SQL para criar as tabelas do Banco de Dados Oracle, incluindo sequências e triggers, link:https://netbeans.org/projects/www/downloads/download/php%252FSQL-files-for-Oracle.zip[+aqui+].


== Inserindo os Dados de Teste

Para testar a aplicação, você precisará de alguns dados no banco de dados. O exemplo abaixo mostra como adicionar dois wishers e quatro desejos.

1. Adicione um wisher chamado Tom com a senha "tomcat".

[source,sql]
----

insert into wishers (name, password) values ('Tom','tomcat');
----
2. Adicione um wisher chamado Jerry com a senha "jerrymouse".

[source,sql]
----

insert into wishers (name, password) values ('Jerry', 'jerrymouse');commit;
----
3. Adicione os wishes.

[source,sql]
----

insert into wishes (wisher_id, description, due_date) values (1, 'Sausage', to_date('2008-04-01', 'YYYY-MM-DD'));
insert into wishes (wisher_id, description) values (1, 'Icecream');insert into wishes (wisher_id, description, due_date) values (2, 'Cheese', to_date('2008-05-01', 'YYYY-MM-DD'));
insert into wishes (wisher_id, description)values (2, 'Candle');
commit;
----
4. Verifique se você adicionou dados de teste. Se você estiver usando o NetBeans IDE para exibir os dados de teste, clique com o botão direito do mouse na tabela relevante e, no menu de contexto, selecione Exibir Dados. 

image::images/view-test-data.png[]

Para obter um entendimento geral dos princípios de bancos de dados e padrões de design, consulte o tutorial: link:http://www.tekstenuitleg.net/en/articles/database_design_tutorial/1[+http://www.tekstenuitleg.net/en/articles/database_design_tutorial/1+].

Para obter mais informações sobre a sintaxe das instruções  ``CREATE TABLE``  do Oracle, consulte link:http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7002.htm[+http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7002.htm+].

Observação: Você pode fazer download de um conjunto de comandos SQL para criar as tabelas do Banco de Dados Oracle link:https://netbeans.org/projects/www/downloads/download/php%252FSQL-files-for-Oracle.zip[+aqui+].


== Próxima Etapa

link:wish-list-lesson2.html[+Próxima Lição >>+]

link:wish-list-tutorial-main-page.html[+Voltar à página principal do Tutorial+]


link:/about/contact_form.html?to=3&subject=Feedback:%20PHP%20Wish%20List%20CRUD%201:%20Create%20Oracle%20Database%20Tables[+Envie-nos Seu Feedback+]


Para enviar comentários e sugestões, obter suporte e manter-se informado sobre os desenvolvimentos mais recentes das funcionalidades de desenvolvimento PHP do NetBeans IDE, link:../../../community/lists/top.html[+junte-se à lista de correspondência users@php.netbeans.org+].

link:../../trails/php.html[+Voltar à Trilha de Aprendizado PHP+]

