2009-07-13 6 views
0

Existe-t-il un équivalent SQL à #define?#define Equivalent pour Oracle SQL?

J'utilise NUMBER(7) pour ID dans mon DB et je voudrais faire quelque chose comme:

#define ID NUMBER(7) 

Je pourrais utiliser ID dans la création de mes tableaux:

CREATE table Person (
    PersonID ID, 
    Name VARCHAR2(31) 
) 

Cette me permettra de changer facilement le type de tous mes identifiants si je me rends compte que j'ai besoin de plus/moins d'espace plus tard.

+0

Votre intention est-elle d'autoriser la redéfinition dynamique de la colonne, c'est-à-dire de modifier la définition de la colonne dans plusieurs tables par une seule modification après la création de la table? Je vois que quelques réponses semblent viser à définir globalement l'attribut pour la première création de la table. – dpbradley

+0

Je veux seulement utiliser la variable pour la première fois, quand la table est créée. J'ai beaucoup de tables qui utiliseront l'ID 'type' et si je décide à mi-chemin de la création du schéma pour changer la taille de l'ID, je veux pouvoir le changer en un seul endroit. – jjnguy

+0

Mais alors, n'auriez-vous pas la moitié des tables avec une taille d'identification et la moitié avec une autre? – dpbradley

Répondre

4

Dans les scripts SQL Plus, vous pouvez utiliser une variable de substitution comme ceci:

DEFINE ID = "NUMBER(7)" 

CREATE table Person (
    PersonID &ID., 
    Name VARCHAR2(31) 
); 
0

Les définitions de base (similaires à la définition C#) sont appelées directives d'interrogation. la directive inquiry ne peut pas être utilisée pour définir des macros.

Vous pouvez lire sur les directives d'enquête here mais je pense que ce dont vous avez besoin c'est une constante simple.

constant_name CONSTANT datatype := VALUE; 
+0

Notez que vous pouvez définir une constante comme ID, mais le type dans l'instruction create table doit être ID% TYPE, pas seulement ID. Si vous changez le type de l'ID, vous modifiez également tous les champs et vars qui ont un ID% TYPE, exactement comme vous le souhaitez. – Jonathan

+0

Je déteste demander, mais pourriez-vous essayer de me donner un exemple spécifique pour mon cas? Je suis très nouveau à sql. – jjnguy

+0

bien sûr, désolé pour le plus tard, j'étais sous la douche. Je vais vous laisser un morceau de code dans une autre réponse en ce moment. – Jonathan

0

Non, il n'y a aucun moyen de créer ce type de définition dynamique dans Oracle. Bien qu'Oracle ait le concept de types de colonnes définis par l'utilisateur qui vous permettent de définir globalement ce type dans un seul objet, une fois que vous avez créé une table contenant une colonne de ce type, la définition est gelée et vous obtenez un "ORA-02303: ne peut pas supprimer ou remplacer un type avec des dépendances de type ou de table "si vous essayez de redéfinir le type.

0

Je recommande fortement d'obtenir aurait une copie de PowerAMC, que vous vous permettent de le faire grâce à l'utilisation de domaines.

-1

Ce code déclare deux constantes. Nous n'allons pas utiliser les constantes elles-mêmes, mais leurs types. Dans l'instruction create table, nous déclarons Name et Blood comme "Le même type de blood_type et name_type". Si plus tard nous avons besoin de plus d'espace, nous n'avons qu'à changer les types de constantes et tous les champs déclarés avec% TYPE dans le script seront affectés. J'espère que cela t'aidera.

DECLARE 
    blood_type CONSTANT CHAR; 
    name_type CONSTANT varchar2(10); 
BEGIN 
    create table patient (
     Name name_type%TYPE, 
     Blood blood_type%TYPE 

) 
END; 
/

ÉDITÉE: comme dpbradley dit qu'il ya un problème avec ce code. Oracle ne laisse pas créer des tables directement dans un bloc de début. Le paquet DBMS_SQL doit être utilisé pour créer une table de façon dinamique et cela rendrait la solution illisible et inconfortable. Pardon.

+0

Je ne pense pas que ce soit correct SQL ou PL/SQL – dpbradley