Pular para o conteúdo

Palavras reservadas em banco de dados: Definições e exemplos no Oracle

Trabalhando com palavras reservadas no Banco de Dados Oracle

INTRODUÇÃO

Palavras reservadas em banco de dados são palavras chaves utilizadas em definições de sintaxe. Uma palavra chave pode ser sempre reservada ou somente em casos específicos.

O Oracle possui uma view chamada  v$reserved_words, onde é possível a visualização das palavras que são tidas como reservadas. Cada palavra é reservada de acordo com uma definição específica, sendo elas apresentadas nos cenários a seguir:

1

Figura 1 – V$reserved_words

  • Cenário 1 : Palavra chave utilizada como Identificador : Palavras chaves utilizadas como identificadores apresentam valor igual à ‘Y’ de Yes na coluna   RESERVED (Primeiro R na sequência de coluna da view). Segue abaixo um exemplo de um erro sendo reportado durante a criação de usuário, utilizando a palavra reservada minus.
SQL> create user MINUS identified by MINUS;

create user MINUS identified by 'MINUS'

           *

ERROR at line 1:

ORA-01935: missing user or role name

— Com isso, segue uma consulta na view com o intuito de se verificar se há alguma palavra reservada no Oracle que contenha a string ‘MIN’ e que seja reconhecida como uma palavra reservada de identificador.

SQL> select * from v$reserved_words where reserved='Y' and keyword like '%MIN%';

KEYWORD                            LENGTH R R R R D
------------------------------ ---------- - - - - -
MINUS                                   5 Y N N N N

— No entanto, há como forçar a criação do usuário, mesmo que a palavra seja uma palavra reservada. Todavia, ressalta-se que não é uma boa prática.

SQL> CREATE USER "MINUS" IDENTIFIED BY "MINUS";

User created.
  • Cenário 2 : Palavra chave utilizada como Tipo do nome e palavra chave utilizada como identificador em situações específicas: Palavras chaves utilizadas como tipos de nomes apresentam valor igual à ‘Y’ de Yes na coluna   RES_TYPE (Segundo R na sequência de coluna da view), enquanto que palavras chaves utilizadas como identificadores em situações específicas,  apresentam valor igual à ‘Y’ de Yes na coluna   RES_SEMI (Quarto R na sequência de coluna da view).  Segue um exemplo abaixo de erro reportado durante a criação de um tipo:
SQL> CREATE TYPE audit AS TABLE OF VARCHAR2(10)  
/

CREATE TYPE empregados AS object (
  cod  INTEGER(4),
  nome    VARCHAR2(25),
courses audit )
/  2  CREATE TYPE audit AS TABLE OF VARCHAR2(10)

           *

ERROR at line 1:

ORA-02302: invalid or missing type name

— Sendo assim, segue uma consulta na view com o intuito de se verificar se há alguma palavra reservada no Oracle que contenha a string ‘AUD’ e que seja reconhecida como uma palavra reservada. Note o valor igual à ‘Y’ para o quarto R da view, representando uma palavra reservada de identificador em situações específicas :

SQL>  SELECT * FROM v$reserved_words where KEYWORD LIKE '%AUD%';

KEYWORD                            LENGTH R R R R D
------------------------------ ---------- - - - - -
AUDIT                                   5 N N N Y N
NOAUDIT                                 7 N N N Y N
-- Utilizamos o mesmo PL/SQL acima, apenas trocando o tipo do nome definido como Audit para Auditoria_banco e, com isso, o erro não mais persistiu. Uma vez que, a segunda opção não é uma palavra reservada do Oracle, ao contrário da primeira:

SQL> CREATE TYPE auditoria_banco AS TABLE OF VARCHAR2(10)  
/

CREATE TYPE empregados AS object (
  cod  INTEGER(4),
  nome    VARCHAR2(25),
courses  auditoria_banco )
/  2  

Type created.

SQL>   2    3    4    5  

Type created.
  • Cenário 3 : Palavra chave utilizada  como nome de atributo e palavra chave como duplicata de outra palavra chave: Palavras chaves utilizadas como nomes de atributos apresentam valor igual à ‘Y’ de Yes na coluna   RES_ATTR (Terceira R na sequência de coluna da view). Um atributo é um dado associado para cada especificação de uma entidade ou em alguns casos, relacionamentos. No entanto, palavra chave utilizada como duplicata de outra palavra chave, apresentam valor igual à ‘Y’ de Yes na coluna DUPLICATE. No entanto, palavras reservadas como duplicata de outra palavras, não são apenas as definidas como  ‘Y’ na view v$reserved_words e, sim, também as palavras já existentes, como por exemplo, em nomes de objetos.

Segue abaixo a representação de um objeto que já possui um determinado nome, e o usuário tenta criar outro objeto com este nome já existente.

SQL> CREATE TABLE tb(
ID_rg varchar(15) primary key,
Nome  varchar(15)
);   2    3    4  

Table created.

SQL> create table bruno.tb_jogadores as select * from tb;

Table created.

SQL> create public synonym tb_jogadores for Laura.tb_jogadores;

Synonym created.

SQL> create public synonym tb_jogadores for bruno.tb_jogadores
 2  ;

create public synonym tb_jogadores for bruno.tb_jogadores

                     *

ERROR at line 1:

ORA-00955: name is already used by an existing object

— A Oracle fornece um HELP  das palavras reservadas do banco de dados. Para acessá-lo, basta digitar a sintaxe ‘Help Reserved Words’. Segue exemplo abaixo.

SQL> HELP RESERVED WORDS

RESERVED WORDS (PL/SQL)
-----------------------
PL/SQL Reserved Words have special meaning in PL/SQL, and may not be used
for identifier names (unless enclosed in "quotes").

An asterisk (*) indicates words are also SQL Reserved Words.

ALL*            DESC*           JAVA            PACKAGE         SUBTYPE
ALTER*          DISTINCT*       LEVEL*          PARTITION       SUCCESSFUL*
AND*            DO              LIKE*           PCTFREE*        SUM
ANY*            DROP*           LIMITED         PLS_INTEGER     SYNONYM*
ARRAY           ELSE*           LOCK*           POSITIVE        SYSDATE*
AS*             ELSIF           LONG*           POSITIVEN       TABLE*
ASC*            END             LOOP            PRAGMA          THEN*
AT              EXCEPTION       MAX             PRIOR*          TIME
AUTHID          EXCLUSIVE*      MIN             PRIVATE         TIMESTAMP
AVG             EXECUTE         MINUS*          PROCEDURE       TIMEZONE_ABBR
BEGIN           EXISTS*         MINUTE          PUBLIC*         TIMEZONE_HOUR
BETWEEN*        EXIT            MLSLABEL*       RAISE           TIMEZONE_MINUTE
BINARY_INTEGER  EXTENDS         MOD             RANGE           TIMEZONE_REGION
BODY            EXTRACT         MODE*           RAW*            TO*
BOOLEAN         FALSE           MONTH           REAL            TRIGGER*
BULK            FETCH           NATURAL         RECORD          TRUE
BY*             FLOAT*          NATURALN        REF             TYPE
CHAR*           FOR*            NEW             RELEASE         UI
CHAR_BASE       FORALL          NEXTVAL         RETURN          UNION*
CHECK*          FROM*           NOCOPY          REVERSE         UNIQUE*
CLOSE           FUNCTION        NOT*            ROLLBACK        UPDATE*
CLUSTER*        GOTO            NOWAIT*         ROW*            USE
COALESCE        GROUP*          NULL*           ROWID*          USER*
COLLECT         HAVING*         NULLIF          ROWNUM*         VALIDATE*
COMMENT*        HEAP            NUMBER*         ROWTYPE         VALUES*
COMMIT          HOUR            NUMBER_BASE     SAVEPOINT       VARCHAR*
COMPRESS*       IF              OCIROWID        SECOND          VARCHAR2*
CONNECT*        IMMEDIATE*      OF*             SELECT*         VARIANCE
CONSTANT        IN*             ON*             SEPERATE        VIEW*
CREATE*         INDEX*          OPAQUE          SET*            WHEN
CURRENT*        INDICATOR       OPEN            SHARE*          WHENEVER*
CURRVAL         INSERT*         OPERATOR        SMALLINT*       WHERE*
CURSOR          INTEGER*        OPTION*         SPACE           WHILE
DATE*           INTERFACE       OR*             SQL             WITH*
DAY             INTERSECT*      ORDER*          SQLCODE         WORK
DECIMAL*        INTERVAL        ORGANIZATION    SQLERRM         WRITE
DECLARE         INTO*           OTHERS          START*          YEAR
DEFAULT*        IS*             OUT             STDDEV          ZONE
DELETE*         ISOLATION

RESERVED WORDS (SQL)
--------------------
SQL Reserved Words have special meaning in SQL, and may not be used for
identifier names unless enclosed in "quotes".

An asterisk (*) indicates words are also ANSI Reserved Words.

Oracle prefixes implicitly generated schema object and subobject names
with "SYS_". To avoid name resolution conflict, Oracle discourages you
from prefixing your schema object and subobject names with "SYS_".

ACCESS          DEFAULT*         INTEGER*        ONLINE          START
ADD*            DELETE*          INTERSECT*      OPTION*         SUCCESSFUL
ALL*            DESC*            INTO*           OR*             SYNONYM
ALTER*          DISTINCT*        IS*             ORDER*          SYSDATE
AND*            DROP*            LEVEL*          PCTFREE         TABLE*
ANY*            ELSE*            LIKE*           PRIOR*          THEN*
AS*             EXCLUSIVE        LOCK            PRIVILEGES*     TO*
ASC*            EXISTS           LONG            PUBLIC*         TRIGGER
AUDIT           FILE             MAXEXTENTS      RAW             UID
BETWEEN*        FLOAT*           MINUS           RENAME          UNION*
BY*             FOR*             MLSLABEL        RESOURCE        UNIQUE*
CHAR*           FROM*            MODE            REVOKE*         UPDATE*
CHECK*          GRANT*           MODIFY          ROW             USER*
CLUSTER         GROUP*           NOAUDIT         ROWID           VALIDATE
COLUMN          HAVING*          NOCOMPRESS      ROWNUM          VALUES*
COMMENT         IDENTIFIED       NOT*            ROWS*           VARCHAR*
COMPRESS        IMMEDIATE*       NOWAIT          SELECT*         VARCHAR2
CONNECT*        IN*              NULL*           SESSION*        VIEW*
CREATE*         INCREMENT        NUMBER          SET*            WHENEVER*
CURRENT*        INDEX            OF*             SHARE           WHERE
DATE*           INITIAL          OFFLINE         SIZE*           WITH*
DECIMAL*        INSERT*          ON*             SMALLINT*

CONCLUSÃO

A view v$reserved_words é uma ótima view que possibilita ao administrador de banco de dados um conhecimento do contexto das palavras que são definidas como reservadas na base de dados e, com isso, evitando equívocos  em sintaxes para criação de um determinado objeto, usuário ou qualquer  comando PL/SQL, quando utilizado na base de dados.

REFERÊNCIAS

Bruno Reis

Bruno Reis

DBA ORACLE  na International Business Machines (IBM), fornecendo suporte para grandes clientes. Técnico em Informática pela Escola Técnica Polivalente de Americana e estudante de Ciência Computação . Mantenedor do Weblog sobre Banco de Dados Oracle e Gerenciamento de Serviços de TI: www.brunors.com

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Marcações:
plugins premium WordPress