Instructions DDL en PL/SQL?
Je suis en train d'essayer le code ci-dessous pour créer une table dans PL/SQL:
DECLARE
V_NAME VARCHAR2(20);
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE TEMP(NAME VARCHAR(20))';
EXECUTE IMMEDIATE 'INSERT INTO TEMP VALUES(''XYZ'')';
SELECT NAME INTO V_NAME FROM TEMP;
END;
/
La SELECT
instruction échoue avec ce message d'erreur:
PL/SQL: ORA-00942: table or view does not exist
Est-il possible de CREATE, INSERT and SELECT
le tout dans un seul PL/SQL Bloquer l'un après l'autre?
- pourquoi vous utilisez sql dynamique? il est plus lent et dangereux. et insérer les œuvres?
- C'est une mauvaise idée. C'est une commune de construire dans certains autres saveurs de SGBDR tels que SQL Server, mais Oracle offre la meilleure des approches. Pour plus d'informations lire cette vieille réponse de la mine: stackoverflow.com/a/1193443/146325
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous êtes en train de faire quelque chose comme ce qui suit:
Au moment de la compilation de la table,
TEMP
, n'existe pas. Il n'a pas encore été créé. Comme il n'existe pas, vous ne pouvez pas sélectionner à partir d'elle; par conséquent, vous devez SÉLECTIONNER de manière dynamique. Il n'y a pas réellement besoin de faire un SELECT dans ce particulier situation si vous pouvez utiliser laretour en
syntaxe.Cependant, ayant besoin de créer dynamiquement des tableaux est habituellement une indication d'un mal conçu schéma. Il ne devrait pas vraiment être nécessaire.
Je peux recommander René Nyffenegger de l' post "Pourquoi est-SQL dynamique mauvais?" pour des raisons pourquoi vous devez éviter de SQL dynamique, si possible, à partir d'un point de vue des performances. S'il vous plaît être conscient que vous êtes beaucoup plus ouvert à la L'injection SQL et utiliser des variables de liaison et
DBMS_ASSERT
pour aider à protéger contre elle.Si vous exécutez le programme plusieurs fois, vous obtiendrez une erreur, même après la modification du programme pour exécuter l'instruction select SQL dynamique ou à l'aide d'un retour dans la clause.
Car lorsque vous exécutez le programme de la première fois qu'il va créer la table sans aucun problème, mais lorsque vous l'exécutez la prochaine fois que le tableau déjà créé la première fois et que vous n'avez pas une instruction drop qu'il va provoquer une erreur: "Table existe déjà dans la Base de données".
Donc, ma suggestion est avant de créer une table dans une pl/sql programme de toujours vérifier si il y a une table avec le même nom existe déjà dans la base de données ou non. Vous pouvez faire cette vérification à l'aide d'un dictionnaire de Données vues /système de tables qui stockent les métadonnées en fonction de votre type de base de données.
Par Exemple dans Oracle, vous pouvez utiliser les vues suivantes pour décider si une des tables doit être créé ou non:
DBA_TABLES ,
ALL_TABLES,
USER_TABLES