2013-02-06 4 views
0

Je pl/sql bloc anonyme comme ci-dessousOracle "dans" clause dans la version Oracle ci-dessous 11g

declare 
    v_count pls_integer := 0; 
begin 
    select count(1) from product_component_version 
    into v_count 
    where product like '%Enterprise%'; 
    if v_count = 0 then 
    raise program_error; 
    end if; 
exception 
    when program_error then 
    raise_application_error (-20001, 'This is valid for Oracle Enterprise Edition   only!'); 
end; 

Lorsque je tente d'exécuter ce qui précède, je reçois l'erreur ci-dessous

ORA-06550: line 5, column 5: 
PL/SQL: ORA-00933: SQL command not properly ended 

Ce qui n'est rien d'autre que l'instruction "into v_count". Selon ma compréhension de la syntaxe est fausse et quand j'ai changé ce statemnt comme ci-dessous, il fonctionne très bien. Je l'ai testé dans "Oracle Database 11g Enterprise Edition version 11.2.0.1.0 - 64bit".

Mais le script original est disponible dans toutes nos anciennes versions de notre produit. Je voudrais savoir que la syntaxe du script original est supportée dans les anciennes versions d'Oracle. Ou pouvez-vous s'il vous plaît laissez-moi savoir toute information sur ce qui peut répondre à ma confusion?

Merci, Vijay

+4

Je ne pense pas que la première syntaxe était * jamais * pris en charge. –

+1

"le script est disponible"? Ce n'est pas stocké dans DB, donc je suppose que ce code ne fonctionne pas dans un fichier quelque part (et n'est jamais utilisé). Comment savez-vous que ce code est utilisé (quelle que soit la version)? – tbone

Répondre

3

Avec un bloc d'essai:

declare 
    x dual.dummy%type; 
begin 
    select dummy from dual into x; 
end; 
/

Dans Oracle 9iR2 (9.2.0.8 sous Solaris), 10gR2 (10.2.0.5 sur Solaris) et 11gR2 (11.2.0.3 sous Linux) Je reçois exactement la même erreur:

select dummy from dual into x; 
          * 
ERROR at line 4: 
ORA-06550: line 4, column 28: 
PL/SQL: ORA-00933: SQL command not properly ended 
ORA-06550: line 4, column 5: 
PL/SQL: SQL Statement ignored 

Je ne crois pas qu'il ait jamais été supporté comme vous l'aviez, même si je n'ai pas de base de données 8i ou antérieure à tester. Vous avez dit "le script original est disponible dans toutes nos anciennes versions de notre produit", mais est-ce qu'il a déjà été exécuté, et si oui, pouvez-vous identifier une version exacte sur laquelle aucune erreur n'a été signalée?

+0

Sans rapport avec la question d'origine, pourquoi ne pas utiliser '% ROWTYPE' et' select * '? Il est plus rapide de taper – Plouf

+1

@Plouf - pas de raison particulière; habitude d'éviter 'select *' peut-être, et l'OP sélectionnant une seule valeur plutôt qu'une ligne; et cela ne fait aucune différence à l'effet. Est-ce que songer à sauver 6 keypresses (si vous comptez "shift-8" pour obtenir "*" comme un seul) est considéré comme une optimisation prématurée? * 8-) –

+0

Pourrait être. :-) Mais je préfère le mettre comme une habitude. Et +1 pour le prématuré qui est trop souvent oublié en citant – Plouf

0

Même si je ne pense pas à choisir dummy de dual en x;

essayez ceci:

declare 
    v_count pls_integer := 0; 
begin 
    select count(1) into v_count from product_component_version 

    where product like '%Enterprise%'; 
    if v_count = 0 then 
    raise program_error; 
    end if; 
exception 
    when program_error then 
    raise_application_error (-20001, 'This is valid for Oracle Enterprise Edition   only!'); 
end; 
+0

La question montre la syntaxe valide aussi, ce n'est pas le problème; c'est si (et comment) la syntaxe invalide a déjà fonctionné. –