Créer une Table Comme au sein de PL/SQL?
Je suis en train de créer une table dans PL/SQL
comment je peux réaliser cela?
reçois
Rapport d'erreur:
ORA-00933: "commande SQL n'est pas correctement terminé"
voici le code que j'ai une erreur avec
DECLARE
station_id_ms1 NUMBER :=10347;
realtime_start DATE :=to_date('2012-01-01 00:00:00','YYYY-DD-MM HH24:MI:SS');
realtime_end DATE :=to_date('2012-07-01 00:00:00','YYYY-DD-MM HH24:MI:SS');
BEGIN
EXECUTE IMMEDIATE ('
CREATE TABLE new_table_name
AS
SELECT
((realtime - to_date(''01-JAN-1970'',''DD-MON-YYYY'')) * (86400)) AS realtime_ms1,
magnetic_ms_id,
ADC_value_pp_2_mgntc_fld_amp(ch2_value,ch2_gain_value,magnetic_ms_id,2) AS B_x_ms1,
ADC_value_pp_2_mgntc_fld_amp(ch1_value,ch1_gain_value,magnetic_ms_id,1) AS B_y_ms1,
real_nanosecs2*4/3*360/20e6 AS phase_x_ms1,
real_nanosecs1*4/3*360/20e6 AS phase_y_ms1
FROM
raw_mag
WHERE
magnetic_ms_id = '||station_id_ms1||'
AND realtime > '||realtime_start||'
AND realtime < '||realtime_end||'
AND ch1_tune_value = 0
AND realtime < pkg_timezone.change_timezone(gettime,''CET'',''UTC'')
');
END;
pourquoi
parce que vous ne pouvez pas exécuter des instructions DDL à l'intérieur de PL/SQL sans EXÉCUTION IMMÉDIATE.
qui ne demande que la question. Pourquoi PL/SQL? Pourquoi ne pas simplement créer la table? Il existe des scénarios où il est légitime, mais ils sont beaucoup plus nombreux que les cas où cette approche est erronée ou tout simplement faux.
Que voulez-vous dire? "create table" ne semble pas travailler sous PL/SQL! avez-vous un exemple qui montre que ça fonctionne? .... merci
ce que je veux dire c'est, schémas de base de données doit être stable. Nous wouldf s'attendre à des choses comme les tables de train de changer lentement, et ainsi créé avec scripts DDL, de préférence de scripts sous contrôle de code source. Une exigence de créer des tables dans PL/SQL ne correspondent pas à ce modèle. Maintenant, peut-être il ya un réel besoin pour créer des tables de manière dynamique, dans une tâche en arrière-plan. Mais le plus souvent c'est parce que le développeur méconnaît l'exigence et/ou ne sait pas comment écrire un Oracle base de données de l'application.
EXECUTE IMMEDIATE
? il suffit de créer le tableau.parce que vous ne pouvez pas exécuter des instructions DDL à l'intérieur de PL/SQL sans EXÉCUTION IMMÉDIATE.
qui ne demande que la question. Pourquoi PL/SQL? Pourquoi ne pas simplement créer la table? Il existe des scénarios où il est légitime, mais ils sont beaucoup plus nombreux que les cas où cette approche est erronée ou tout simplement faux.
Que voulez-vous dire? "create table" ne semble pas travailler sous PL/SQL! avez-vous un exemple qui montre que ça fonctionne? .... merci
ce que je veux dire c'est, schémas de base de données doit être stable. Nous wouldf s'attendre à des choses comme les tables de train de changer lentement, et ainsi créé avec scripts DDL, de préférence de scripts sous contrôle de code source. Une exigence de créer des tables dans PL/SQL ne correspondent pas à ce modèle. Maintenant, peut-être il ya un réel besoin pour créer des tables de manière dynamique, dans une tâche en arrière-plan. Mais le plus souvent c'est parce que le développeur méconnaît l'exigence et/ou ne sait pas comment écrire un Oracle base de données de l'application.
OriginalL'auteur Data-Base | 2012-03-06
Vous devez vous connecter pour publier un commentaire.
Vous devriez faire la char à jour conversion dans le plsql-chaîne exécution immédiate.
La date à laquelle vous avez déclaré sera "back-casting" pour un varchar2 dans la concaténation et la "re-casting" à une date encore pour l'exécution de l'instruction create table. Et de "toutes sortes de choses" peuvent se produire dans ces deux castes, de sorte que vous voulez vous assurer que vous êtes en contrôle de la façon dont la chaîne de caractères est interprété lors de la coulée d'une date.
OriginalL'auteur René Nyffenegger
Je voudrais utiliser lie pour station_id_ms1, realtime_start, realtime_end:
Oui, lie. cette valeur de requête :station_id_ms1, sera remplacé naturellement avec la valeur écrite dans station_id_ms1.
J'ai eu ce ORA-01027: "lier les variables ne permet pas, pour la définition des données de l'exploitation"
trouvé cette "Lier les variables sont autorisés dans les instructions DML (SELECT, UPDATE, DELETE) ou à l'intérieur des programmes, mais pas à l'intérieur de DDLs (le Langage de Définition de Données des déclarations)"
argh, dans ce cas, vous devriez être plus soigneusement avec la date de variables. Dans la requête doit apparaître to_date(variable, format). La déclaration est un texte. Date variable sera mis comme varchar2 (implicite cast)
OriginalL'auteur Florin Ghita