2009-08-30 5 views
0

J'ai passé des heures à essayer de trouver une solution à ce problème, mais comme je suis incapable de trouver, j'ai décidé de demander ici.Problème lors de la sélection par ROWID dans la procédure

Je suis en train de faire une procédure pour extraire des informations d'une table basée sur ROWID de la ligne et avec les résultats que je fais une requête personnalisée en utilisant execute immediate. J'ai réduit le problème aux lignes suivantes, que je suis d'exécution directement dans SQL Developer:

declare 
    row_id ROWID; 
    consulta VARCHAR2(1000); 
begin 
    row_id := 'AAAEC5AAFAAAADHAAC'; 
    select 'insert into ' || 
    (select TABLA  from BITACORA where rowid = row_id) || ' values(' || 
    (select VALOR_VIEJO from BITACORA where rowid = row_id) || ')' 
    into Consulta from dual; 
    DBMS_OUTPUT.PUT_LINE(Consulta); 
    --execute immediate Consulta;   
end; 

Les lignes précédentes ne fonctionne pas comme il est. Lorsque j'imprime le contenu de Consulta il montre:

insert into values() 

mais si j'élimine la variable row_id et le mettre directement dans les requêtes comme celle-ci, cela fonctionne:

declare 
    consulta VARCHAR2(1000); 
begin 
    select 'insert into ' || 
    (select TABLA  from BITACORA where rowid = 'AAAEC5AAFAAAADHAAC') || ' values(' || 
    (select VALOR_VIEJO from BITACORA where rowid = 'AAAEC5AAFAAAADHAAC') || ')' 
    into Consulta from dual; 
    DBMS_OUTPUT.PUT_LINE(Consulta); 
    --execute immediate Consulta;   
end; 

Afficher ce que j'attendais, Quelque chose comme:

insert into MI_TABLA values(1,'Hola','Adios',3,1) 

Ceci n'est pas lié au travail, donc il n'y a pas de problèmes de performance/sécurité. Merci pour vos commentaires.

+0

Pouvez-vous essayer de mettre rowid =: row_id? –

+0

Oui, j'ai essayé et il me donne une erreur :(, pense que c'est parce que: est utilisé uniquement pour les variables out –

Répondre

0

Pouvez-vous obtenir un expliquer le plan de cette:

select TABLA  from BITACORA where rowid = 'AAAEC5AAFAAAADHAAC'; 

et ceci:

select TABLA  from BITACORA where rowid = :1; 

Cela dépend de quelle version d'Oracle que vous êtes, mais essayez ceci:

explain plan for 
select TABLA  from BITACORA where rowid = 'AAAEC5AAFAAAADHAAC'; 

select plan_table_output from table(dbms_xplan.display('plan_table',null,'serial')); 

delete from plan table; 

Et puis ceci:

explain plan for 
select TABLA  from BITACORA where rowid = :1; 

select plan_table_output from table(dbms_xplan.display('plan_table',null,'serial')); 

delete from plan table; 

Mettez à jour votre question avec la sortie et cela pourrait donner d'autres indices.

0

Pourquoi sélectionnez-vous DUAL? Sauf si vous avez omis quelque chose d'essentiel dans votre simplification cela devrait fonctionner pour vous:

declare 
    row_id ROWID; 
    consulta VARCHAR2(1000); 
begin 
    row_id := 'AAAEC5AAFAAAADHAAC'; 
    select 'insert into ' ||TABLA || ' values(' ||VALOR_VIEJO|| ')' 
    into Consulta 
    where rowid = row_id; 
    DBMS_OUTPUT.PUT_LINE(Consulta); 
    execute immediate Consulta;   
end; 
/
1

Vous pourriez avoir à utiliser la fonction de conversion CHARTOROWID():

row_id := CHARTOROWID('AAAEC5AAFAAAADHAAC'); 

Selon le oracle doc, cela pas nécessaire pour le type de données urowid.

Questions connexes