Criar tabela DDL com execução imediata
Você deve estar pensando que qual poderia ser o problema em executar um CREATE TABLE DDL? Certo, sem problemas, desde que você os execute com SQL. Mas quando se trata de executá-los com PL/SQL, é meio difícil.
Então, primeiro, o que são instruções DDL no Oracle Database?
DDL significa Linguagem de Definição de Dados. Usando instruções DDL, podemos criar ou modificar os objetos do banco de dados, bem como os esquemas. Essas declarações são:
- CRIAR,
- DROP e
- ALTER.
É sempre uma boa prática fazer o layout de seus esquemas e objetos com antecedência e criá-los no estágio inicial de seu projeto. Se possível, devemos fazer esse trabalho usando SQL. Isso poderia ser muito mais rápido e muito mais limpo. Mas às vezes nem sempre é possível, nessa situação podemos contar com recursos como Native Dynamic SQL no Oracle Database.
O SQL dinâmico nativo nos permite executar instruções SQL como DDL ou DML diretamente por meio de nosso PL/SQL.
Por que não podemos executar DDL por meio de um programa PL/SQL?
Se você ainda está se perguntando se executar a instrução DDL com PL/SQL é tão complicado, vamos tentar criar uma tabela através de um programa PL/SQL.
SET SERVEROUTPUT ON; BEGIN CREATE TABLE tut_82 ( tut_num NUMBER(3), tut_name VARCHAR2 (50)); END; /
Eu sei que essa abordagem teria sido sua primeira ideia se eu tivesse pedido para você criar uma tabela por meio de um programa PL/SQL. Quero dizer, isso parece perfeito, o que poderia dar errado?
Não há nada de errado com este programa, o único problema aqui é que PL/SQL não suporta diretamente instruções DDL. Para executar uma instrução DDL usando PL/SQL, precisamos da ajuda do pacote DBMS_SQL ou da maneira avançada e aprimorada do SQL NATIVE DYNAMIC.
Você pode verificar isso por si mesmo. Vá em frente e execute o programa acima. Na execução, você receberá um erro que se parece com o mostrado na imagem abaixo.
Então, qual é a maneira correta de executar um DDL por meio de um programa PL/SQL?
Você pode executar um programa DDL por meio de PL/SQL usando o pacote DBMS_SQL ou usando a instrução Execute Immediate do SQL dinâmico nativo. A última opção é a mais utilizada, especialmente nos dias de hoje devido ao seu melhor desempenho e sintaxe fácil de aprender.
Como executar CREATE TABLE DDL usando Execute Immediate no banco de dados Oracle?
Etapa 1:Prepare seu DDL com antecedência.
Embora não seja necessário, sugiro que você prepare seu DDL com antecedência, dessa forma você pode pelo menos eliminar as chances de obter erros sintáticos devido à sintaxe de sua instrução DDL.
No nosso caso, queremos executar um CREATE TABLE DDL, então vamos escrever um DDL para criar uma tabela primeiro.
CREATE TABLE tut_82 ( tut_num NUMBER (3), tut_name VARCHAR2 (50) )
Essa instrução DDL criará uma tabela com o nome tut_82 com duas colunas tut_num do tipo de dados NUMBER e tut_name do tipo de dados VARCHAR2.
Lembre-se aqui, não termine sua instrução SQL (aquela que você deseja executar com EXECUTE IMMEDIATE) com um ponto e vírgula.
Etapa 2:Execute seu DDL por meio do programa PL/SQL usando Execute Immediate.
Depois de preparar seu DDL, você precisa escrever seu programa PL/SQL.
SET SERVEROUTPUT ON; DECLARE ddl_qry VARCHAR2 (150); BEGIN ddl_qry := 'CREATE TABLE tut_82( tut_num NUMBER(3), tut_name VARCHAR2(50) )'; EXECUTE IMMEDIATE ddl_qry; END; /
No bloco PL/SQL acima declaramos uma variável com o nome ddl_qry. Usamos essa variável para manter nossa instrução DDL que preparamos na etapa 1.
Informações:
Uma coisa que você precisa ter certeza aqui é que, a variável que você usará para manter a instrução SQL que você deseja executar com sua instrução EXECUTE IMMEDIATE deve ser sempre do tipo de dados VARCHAR2> e ter muita largura de dados para que seu DDL possa caber nele facilmente.
Na seção de execução deste bloco PL/SQL temos duas instruções executáveis. Essas declarações são:
Declaração 1:Declaração de atribuição
Na primeira instrução, armazenamos nosso DDL Create Table na variável ddl_qry usando o operador de atribuição (em PL/SQL, o operador de atribuição é a combinação de dois pontos e sinal de igual).
Declaração 2:A declaração do Poderoso Executar Imediato
A segunda instrução é a instrução Execute. Para executar um DDL dinamicamente, primeiro você deve escrever a frase reservada ‘Execute Immediate’ seguida do nome da variável na qual você armazenou seu DDL como fizemos acima.
Se desejar, você também pode escrever seu DDL diretamente após a frase ‘Frase Reservada’. É completamente uma escolha pessoal. Eu gosto de usar a abordagem anterior em que usamos Variable para manter o DDL porque, antes de tudo, isso faz com que seu código pareça limpo e limpo, além disso, também facilita muito o rastreamento de erros.
Mas Manish, também quero aprender a outra maneira de escrever a instrução DDL.
Claro, não há nada de errado em aprender algo novo.
BEGIN EXECUTE IMMEDIATE 'CREATE TABLE tut_82( tut_num NUMBER(3), tut_name VARCHAR2(50) )'; END; /
A abordagem alternativa para o código acima é escrever a instrução DDL diretamente na sua instrução Execute Immediate. Para isso, basta escrever primeiro a frase reservada Execute Immediate seguida da instrução DDL que você deseja executar dinamicamente.
Em qualquer uma das maneiras, você só precisa cuidar de algumas coisas enquanto escreve o DDL para Execute Immediate.
Primeiro:sempre coloque sua instrução SQL entre aspas simples
Lembre-se sempre de que Execute Immediate trata DDL ou DML ou qualquer outra instrução SQL suportada que você deseja executar dinamicamente como uma string do tipo de dados VARCHAR2 e em PL/SQL colocamos qualquer caractere ou string VARCHAR2 em um par de aspas simples. Portanto, sempre certifique-se de colocar sua instrução SQL que você deseja executar usando Execute Immediate em um par de aspas simples.
Segundo:cuide do ponto e vírgula.
Caso você esteja escrevendo uma instrução SQL para Execute Immediate, você deve colocar o ponto e vírgula (;) fora das aspas simples nas quais você incluiu sua instrução SQL. Por outro lado, se você estiver escrevendo um bloco PL/SQL para execução dinâmica usando Execute Immediate, você deve colocar o ponto e vírgula no final do seu bloco PL/SQL antes das aspas simples de fechamento, bem como fora das aspas simples de fechamento.
Esse é o tutorial detalhado sobre como executar a instrução Create Table DDL usando a instrução EXECUTE IMMEDIATE do Native Dynamic SQL no Oracle Database. Espero que tenham gostado e aprendido algo novo.
Certifique-se de se inscrever no meu canal do YouTube, pois no próximo tutorial aprenderemos algo novo e interessante sobre o SQL dinâmico. Você também pode me seguir no meu Twitter e Facebook.
Obrigado e tenha um ótimo dia!