Comment puis-je modifier une séquence dans le SQL dynamique?
Je suis en train de créer un script pour migrer les données d'une DB à l'autre. Une chose que je ne suis pas actuellement en mesure de faire est de définir la nextval d'une séquence à l'nextval d'une séquence dans une autre base de données.
J'ai obtenu la différence dans les valeurs de user_sequences, et ont généré suivant les instructions SQL dynamiques:
execute immediate 'alter sequence myseq increment by 100';
execute immediate 'select myseq.nextval from dual';
execute immediate 'alter sequence myseq increment by 1';
commit;
Mais rien ne se passe. Ce qui me manque? Si j'exécute le même états en dehors de la procédure, qu'ils fonctionnent très bien:
alter sequence myseq increment by 100;
select myseq.nextval from dual;
alter sequence myseq increment by 1;
commit;
MODIFIER: toutes mes Excuses à tous pour ne pas être clair. Je suis en fait en changeant la séquence dans la même DB. Je suis le seul à l'obtention de la valeur à partir d'une distance DB. Peut-être qu'il était inutile de parler de la distance DB que ça n'affecte pas les choses. J'ai seulement mentionné pour expliquer ce que mes objectifs étaient.
L'étape 1. Je reçois le nextval de la séquence à partir d'une distance DB.
select (select last_number
from dba_sequences@remoteDB
where upper(sequence_name) = upper(v_sequence_name)) - (select last_number
from user_sequences
where upper(sequence_name) = upper(v_sequence_name)) increment_by
from dual;
L'étape 2. - Je générer des instructions SQL dynamiques avec cette valeur:
execute immediate 'alter sequence myseq increment by 100';
execute immediate 'select myseq.nextval from dual';
execute immediate 'alter sequence myseq increment by 1';
commit;
Aucune erreur n'a été soulevée, mais rien ne s'est passé. Quand j'ai écrit les instructions SQL avec DBMS_OUTPUT.PUT_LINE et a couru dehors, ils ont travaillé.
Oui, je n'ai pas de message d'erreur (les erreurs sont enregistrées). Désolé je n'étais pas clair avant - je suis en fait en changeant la séquence de la même DB à laquelle il appartient. Le PL/SQL procédure se termine avec succès. Je suis l'aide de 10g 10.2.0.5.0 - 64bi
Si vous êtes en cours d'exécution sur ce teh base de données locale pourquoi avez-vous besoin d'utiliser le SQL dynamique?
Hmm je l'ai juste essayé sans SQL dynamique - pour ne pas me mettre tout de modifier les instructions à l'intérieur du PL/SQL bloc, sauf si c'est du SQL dynamique. Il dit: "a Rencontré le symbole "ALTER" lorsque attend que l'un des suivants...". Mon intention est de disposer d'une procédure, je peux utiliser pour actualiser les données quand j'en ai besoin. Et j'ai besoin d'avoir un PL/SQL bloc pour obtenir la valeur de la distance DB - ça ne marchera pas avec une sous-requête pour obtenir la valeur de "modifier la séquence de myseq incrément par X":
Hmm je l'ai juste essayé sans SQL dynamique - pour ne pas me mettre tout de modifier les instructions à l'intérieur du PL/SQL bloc, sauf si c'est du SQL dynamique. Il dit: "a Rencontré le symbole "ALTER" lorsque attend que l'un des suivants...". Mon intention est de disposer d'une procédure, je peux utiliser pour actualiser les données quand j'en ai besoin. Et j'ai besoin d'avoir un PL/SQL bloc pour obtenir la valeur de la distance DB - ça ne marchera pas avec une sous-requête pour obtenir la valeur de "modifier la séquence de myseq incrément par X".
OriginalL'auteur Zesty | 2012-04-30
Vous devez vous connecter pour publier un commentaire.
Maintenant, vous avez bien expliqué à vos besoins voici un peu de code. J'ai écrit ce donc, il va travailler pour toute la séquence dans votre schéma.
La procédure n'a pas besoin de s'ENGAGER parce que les instructions DDL émettre un commit implicite (deux en fait).
Vous pouvez l'exécuter et de voir le synchronisés valeur comme ceci (dans SQL*PLus):
l'homme! Enfin, cela a fonctionné! Je souhaite que je pourrais vous donner +de 10!
OriginalL'auteur APC
Je n'étais pas tout à fait en mesure de comprendre ce que tu veux dire, mais ici, c'est un sauvage deviner:
Je ne vois pas dans votre code, mais vous parlez de l'exécution de DDL (
CREATE
,ALTER
etc.) sur une autre base de données, donc je suppose que vous utilisez des Liens de Base de données. Il n'est pas possible à l'utilisation de la Base de données des Liens de DDL d'exécution sur une autre base de données. Vous pourriez envisager.Après les informations fournies, ce pourrait être ce dont vous avez besoin. Et si vous souhaitez définir la valeur courante de la séquence, vous ne pouvez pas, selon cette la documentation, vous avez besoin de drop/create:
OriginalL'auteur Erkan Haspulat
Aussi, DDL dans SQL dynamique pacakges nécessite
AUTHID CURRENT_USER
lors de la déclaration de la spécification de paquetage, si vous voulez avoir les informations d'identification de l'utilisateur actuel
OriginalL'auteur moleboy
J'ai pris le code fourni par l'APC et modifiés comme ci-dessous:
OriginalL'auteur anand maurya