2010-08-21 11 views
-1

J'essaye de créer une table avec une colonne automatique, dont la valeur est calculée en utilisant une fonction que j'ai définie. Cependant, quand j'essaye de créer la table je continue à obtenir ora-00907: parenthèse droite manquante. Quelqu'un peut-il aider?ORA-00907 en essayant de créer une table avec une colonne automatique

Voici le code CREATE:

CREATE TABLE NEW_EMP2 (
SSN CHAR(9), 
EMP_NUM2 CHAR(5) automatic as newemp2id(SSN), 
Fname VARCHAR2(15), 
Lname VARCHAR2(15), 
Bdate DATE 
) 

Voici le code de la fonction newemp2id:

CREATE OR REPLACE FUNCTION newemp2id (i_ssn NCHAR) RETURN NCHAR 
IS 
BEGIN 
RETURN 'E'||(1000+SUBSTR(i_ssn,6,4)); 
END 

Toute aide sur ce serait grandement apprécié, merci! MISE À JOUR: J'utilise Oracle Express Edition sur une machine Windows Vista, au cas où cela ferait une différence.

Répondre

3

Je n'avais pas entendu parler de la syntaxe avant cela, mais tout ce que j'ai pu trouver est this PDF for Oracle RDB. RDB was/is a separate product for Oracle databases ... Confirmed - not supported on 10g

Utilisez un BEFORE INSERT trigger au lieu, parce que je ne crois pas que la syntaxe que vous utilisez est valide pour Oracle Express (10g efficace) - il n'y a aucune mention dans la documentation CREATE TABLE ou ALTER TABLE.

Je ne suis pas friand d'utiliser les déclencheurs, je préfère avoir une seule procédure stockée pour insérer dans la table donnée (s) & ne permet à quiconque d'utiliser la procédure plutôt que l'accès de la table directe ...

CREATE OR REPLACE TRIGGER newemp2_before_insert 
BEFORE INSERT 
    ON new_mep2 
    FOR EACH ROW 
BEGIN 

    -- Update created_by field to the username of the person performing the INSERT 
    :new.emp_num2 := newemp2id(new.ssn) 
END; 

Bien franchement, cela est trop compliqué quand il pourrait être traité dans une vue:

CREATE VIEW vw_emp AS 
    SELECT t.ssn, 
     'E'||(1000+SUBSTR(i_ssn,6,4)) AS emp_num2 
    FROM NEW_EMP2 t 
+0

C'est la bonne chose à propos des colonnes virtuelles - ils vont économiser sur la création de vues inutiles et les données dénormalisées. Je pense qu'il est même possible de leur imposer des contraintes. Un jour, nous aurons Oracle 11! – JulesLt

1

Qu'est-ce qu'une colonne automatique est supposée être? Voulez-vous dire une colonne virtuelle purement calculée, c'est-à-dire virtuelle? Ensuite, votre déclaration devrait ressembler à ceci:

CREATE TABLE NEW_EMP2 (
SSN CHAR(9), 
EMP_NUM2 CHAR(5) GENERATED ALWAYS AS (newemp2id(SSN)) VIRTUAL, 
Fname VARCHAR2(15), 
Lname VARCHAR2(15), 
Bdate DATE 
) 

Et vos fonctions doivent déclarer déterministe:

CREATE OR REPLACE FUNCTION newemp2id (i_ssn NCHAR) RETURN NCHAR DETERMINISTIC 
IS 
BEGIN 
RETURN 'E'||(1000+SUBSTR(i_ssn,6,4)); 
END 

Si je ne me trompe pas, les colonnes virtuelles ont été introduites avec Oracle 11g.

+0

express est Oracle 10g –

+0

Selon ce document (http://www.oracle.com/technetwork/database/rdb /automatic-columns-132042.pdf) Oracle a pris en charge comput colonnes ed et automatiques depuis v7.1. Je suis nouveau à Oracle, donc si le produit décrit dans l'article est différent, alors c'est mon problème ... –

+0

@Brian Driscoll: Oracle RDB est uniquement pour OpenVMS - ce n'est pas le RDBMS Oracle que vous utilisez. –

1

Oracle Express est Oracle 10g.

Selon le manuel (http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7002.htm#i2095331) il n'y a pas mot-clé « automatique » et Oracle 10 n'a jamais pris en charge « colonnes calculées »

Oracle 11g supporte les colonnes virtuelles, mais ils sont créés à l'aide GENERATED ALWAYS, même pas 11g Oracle a un automatic mot-clé

Pourquoi pensez-vous que cela devrait fonctionner dans Oracle?

+0

s'il vous plaît voir mon commentaire ci-dessus –