Scripts avançados de gravação
Objetivos Após concluir este apêndice, você poderá: Descrever o tipo de problemas que são resolvidos usando SQL para gerar SQL Gravar um script que gera um script de instruções DROP TABLE Gravar um script que gera um script de instruções INSERT INTO G - 2 Objetivos Neste apêndice, você aprenderá a gravar um script SQL para gerar um script SQL. Oracle Database 11g: Fundamentos de SQL II G - 2
Usando SQL para gerar SQL A SQL pode ser usada para gerar scripts em SQL. O dicionário de dados é: G - 3 Uma coleção das tabelas e views que contém as informações do banco de dados Criado e mantido pelo Oracle Server SQL Script SQL Dicionário de dados Usando SQL para gerar SQL A SQL pode ser uma ferramenta sofisticada para a geração de outras instruções SQL. Na maioria dos casos, isso envolve gravar um arquivo de script. É possível usar SQL de SQL para: Impedir código repetitivo Acessar informações do dicionário de dados Eliminar ou recriar objetos do banco de dados Gerar predicados dinâmicos que contenham parâmetros do tempo de execução Os exemplos usados nesta lição envolvem a seleção de informações no dicionário de dados. O dicionário de dados é uma coleção das tabelas e views que contém as informações sobre o banco de dados. Essa coleção é criada e mantida pelo Oracle Server. Todas as tabelas do dicionário de dados são de propriedade do usuário SYS. As informações armazenadas no dicionário de dados incluem os nomes dos usuários do Oracle Server, os privilégios concedidos aos usuários, os nomes de objetos do banco de dados, as restrições de trabalho e as informações de auditoria. Há quatro categorias de views do dicionário de dados. Cada categoria tem um prefixo distinto que reflete o uso ao qual se destina. Prefixo Descrição USER_ Contém detalhes dos objetos pertencentes ao usuário ALL_ DBA_ V$_ Contém detalhes dos objetos para os quais o usuário ganhou direitos de acesso e dos objetos pertencentes ao usuário Contém detalhes dos usuários com privilégios de DBA para acessar qualquer objeto do banco de dados Armazena informações sobre o desempenho e o bloqueio do servidor do banco de dados; disponível apenas para o DBA Oracle Database 11g: Fundamentos de SQL II G - 3
Criando um script básico SELECT 'CREATE TABLE ' table_name '_test ' 'AS SELECT * FROM ' table_name ' WHERE 1=2;' AS "Create Table Script" FROM user_tables; G - 4 Um script básico O exemplo no slide produz um relatório com as instruções CREATE TABLE em cada tabela de sua propriedade. Cada instrução CREATE TABLE produzida no relatório inclui a sintaxe para criar uma tabela usando o nome da tabela com um sufixo _test e tendo apenas a estrutura da tabela existente correspondente. O nome antigo da tabela é obtido da coluna TABLE_NAME da view de dicionário de dados USER_TABLES. A próxima etapa é melhorar o relatório para automatizar o processo. Observação: Você pode consultar as tabelas do dicionário de dados para exibir vários objetos de banco de dados de sua propriedade. As views do dicionário de dados frequentemente usadas incluem: USER_TABLES: Exibe a descrição das tabelas de propriedade do usuário USER_OBJECTS: Exibe todos os objetos de propriedade do usuário USER_TAB_PRIVS_MADE: Exibe todas as concessões nos objetos de propriedade do usuário USER_COL_PRIVS_MADE: Exibe todas as concessões nas colunas de objetos de propriedade do usuário Oracle Database 11g: Fundamentos de SQL II G - 4
Controlando o ambiente G - 5 SET ECHO OFF SET FEEDBACK OFF SET PAGESIZE 0 Instrução SQL SET FEEDBACK ON SET PAGESIZE 24 SET ECHO ON Defina as variáveis do sistema com os valores apropriados. Defina as variáveis do sistema novamente para os valores default. Controlando o ambiente Para executar as instruções SQL geradas, você deve capturá-las em um arquivo que possa ser executado. Você também dever planejar a limpeza da saída gerada e confirmar a supressão dos elementos, como cabeçalhos, mensagens de feedback, títulos superiores e assim por diante. No SQL Developer, é possível salvar essas instruções em um script. Para salvar o conteúdo da caixa Informar Instrução SQL, clique no ícone Salvar ou use o item de menu Arquivo > Salvar. Além disso, é possível clicar com o botão direito do mouse na caixa Informar Instrução SQL e selecionar a opção Salvar Arquivo no menu drop-down. Observação: Algumas instruções SQL*Plus não são suportadas pela Planilha SQL. Para obter a lista completa de instruções SQL*Plus com ou sem suporte na Planilha SQL, consulte o tópico Instruções SQL*Plus com e sem Suporte na Planilha SQL na Ajuda on-line do SQL Developer. Oracle Database 11g: Fundamentos de SQL II G - 5
O quadro completo SET ECHO OFF SET FEEDBACK OFF SET PAGESIZE 0 SELECT 'DROP TABLE ' object_name ';' FROM user_objects WHERE object_type = 'TABLE' / SET FEEDBACK ON SET PAGESIZE 24 SET ECHO ON G - 6 O quadro completo A saída do comando no slide é salva em um arquivo denominado dropem.sql no SQL Developer. Para salvar a saída em um arquivo no SQL Developer, use a opção Salvar Arquivo no painel Saída do Script. O arquivo dropem.sql contém os seguintes dados. Esse arquivo pode agora ser iniciado a partir do SQL Developer localizando, carregando e executando o arquivo de script. Oracle Database 11g: Fundamentos de SQL II G - 6
G - 7 Fazendo dump do conteúdo de uma tabela para um arquivo SET HEADING OFF ECHO OFF FEEDBACK OFF SET PAGESIZE 0 SELECT 'INSERT INTO departments_test VALUES (' department_id ', ''' department_name ''', ''' location_id ''');' AS "Insert Statements Script" FROM departments / SET PAGESIZE 24 SET HEADING ON ECHO ON FEEDBACK ON Fazendo dump de conteúdo para um arquivo Algumas vezes, é útil ter os valores das linhas de uma tabela em um arquivo de texto no formato de uma instrução INSERT INTO VALUES. Esse script pode ser executado para preencher a tabela, caso esta seja eliminada acidentalmente. O exemplo no slide produz instruções INSERT para a tabela DEPARTMENTS_TEST, capturada no arquivo data.sql usando a opção Salvar Arquivo no SQL Developer. O conteúdo do arquivo de script data.sql é apresentado a seguir: INSERT INTO departments_test VALUES (10, 'Administration', 1700); INSERT INTO departments_test VALUES (20, 'Marketing', 1800); INSERT INTO departments_test VALUES (50, 'Shipping', 1500); INSERT INTO departments_test VALUES (60, 'IT', 1400);... Oracle Database 11g: Fundamentos de SQL II G - 7
G - 8 Fazendo dump do conteúdo de uma tabela para um arquivo Origem '''X''' '''' '''' department_name '''' ''', ''' ''');' Resultado 'X' ' 'Administration' Fazendo dump de conteúdo para um arquivo (continuação) Talvez você tenha percebido o grande número de sinais de aspas simples no slide anterior. Um conjunto de quatro sinais de aspas simples produz um único sinal de aspas na instrução final. Lembre-se de que esse caractere e os valores de data devem ser colocados entre aspas. Dentro dessa string, para exibir um sinal de aspas simples, adicione outro sinal de aspas simples como prefixo. Por exemplo, no quinto exemplo no slide, as aspas circundantes são para toda a string. O segundo sinal de aspas atua como um prefixo para a exibição do terceiro sinal de aspas. Assim, o resultado é um único sinal de aspas, seguido por um parêntese, seguindo por um pontoe-vírgula. ',' '); Oracle Database 11g: Fundamentos de SQL II G - 8
Gerando um predicado dinâmico COLUMN my_col NEW_VALUE dyn_where_clause SELECT DECODE('&&deptno', null, DECODE ('&&hiredate', null, ' ', 'WHERE hire_date=to_date(''' '&&hiredate'',''dd-mon-yyyy'')'), DECODE ('&&hiredate', null, 'WHERE department_id = ' '&&deptno', 'WHERE department_id = ' '&&deptno' ' AND hire_date = TO_DATE(''' '&&hiredate'',''dd-mon-yyyy'')')) AS my_col FROM dual; SELECT last_name FROM employees &dyn_where_clause; G - 9 Gerando um predicado dinâmico O exemplo no slide gera uma instrução SELECT que recupera os dados de todos os funcionários em um departamento que tenham sido admitidos em um dia específico. O script gera a cláusula WHERE dinamicamente. Observação: Depois de posicionar a variável do usuário, use o comando UNDEFINE para deletá-lo. A primeira instrução SELECT solicita que você informe o número do departamento. Se você não especificar um número de departamento, este será tratado como nulo pela função DECODE e o usuário receberá uma solicitação para informar a data de admissão. Se você não informar a data de admissão, esta será tratada como nula pela função DECODE e a cláusula WHERE dinâmica gerada também será nula, fazendo com que a segunda instrução SELECT recupere todas a linhas da tabela EMPLOYEES. Observação: A variável NEW_V[ALUE] especifica uma variável para reter um valor de coluna. É possível referenciar a variável nos comandos TTITLE. Use NEW_VALUE para exibir os valores de coluna ou a data no título superior. Inclua a coluna em um comando BREAK com a ação SKIP PAGE. O nome da variável não pode conter um símbolo de cerquilha (#). NEW_VALUE é útil para relatórios-mestre/detalhados em que haja um novo registro-mestre para cada página. Oracle Database 11g: Fundamentos de SQL II G - 9
Gerando um predicado dinâmico (continuação) Observação: Aqui, a data de admissão deve ser especificada no formato DD-MON-YYYY. A instrução SELECT no slide pode ser interpretada como segue: IF (<<deptno>> is not entered) THEN IF (<<hiredate>> is not entered) THEN return empty string ELSE return the string WHERE hire_date = TO_DATE('<<hiredate>>', 'DD-MON-YYYY') ELSE IF (<<hiredate>> is not entered) THEN return the string WHERE department_id = <<deptno>> entered' ELSE return the string WHERE department_id = <<deptno>> entered AND hire_date = TO_DATE(' <<hiredate>>', 'DD-MON-YYYY') END IF A string retornada torna-se o valor da variável DYN_WHERE_CLAUSE, que será usada na segunda instrução SELECT. Observação: Use SQL*Plus para esses exemplos. Quando o primeiro exemplo no slide é executado, o usuário recebe uma solicitação para informar os valores DEPTNO e HIREDATE: O seguinte valor para MY_COL é gerado: Quando o segundo exemplo no slide for executado, a seguinte saída será gerada: Oracle Database 11g: Fundamentos de SQL II G - 10
Resumo Neste apêndice, você aprendeu que: É possível gravar um script SQL para gerar outro script SQL Os arquivos de script frequentemente usam o dicionário de dados É possível capturar a saída em um arquivo G - 11 Resumo A SQL pode ser usada para gerar scripts SQL. Esses scripts podem ser usados para impedir código repetitivo, eliminar ou recriar objetos, obter ajuda a partir do dicionário de dados e gerar predicados dinâmicos que contenham parâmetros de tempo de execução. Oracle Database 11g: Fundamentos de SQL II G - 11