[Oracle 10.2] Erreur dans fonction stocké PL/SQL

Erreur dans fonction stocké PL/SQL [Oracle 10.2] - SQL/NoSQL - Programmation

Marsh Posté le 25-01-2007 à 10:34:50    

Bonjour,
J'ai une erreur dasn un fonction stockée :
 

Code :
  1. CREATE OR REPLACE
  2. FUNCTION DEBUG (
  3.     debut IN DATE,
  4.     fin IN DATE,
  5. ) RETURN PLS_INTEGER
  6.    
  7. BEGIN
  8.    
  9.         FOR c IN (
  10.             SELECT owner, table_name, constraint_name
  11.             FROM all_constraints
  12.             WHERE constraint_type = 'R'
  13.             AND lower(table_name) IN ('a', 'b', 'c')
  14.         ) LOOP
  15.             EXECUTE IMMEDIATE 'ALTER TABLE ' || contrainte.owner || '.' || contrainte.table_name || ' DISABLE CONSTRAINT ' || contrainte.constraint_name ;
  16.            
  17.         END LOOP;
  18. END DEBUG


 
J'ai l'erreur ;

Code :
  1. Erreur -14552 : ORA-14552: opération DDL, COMMIT ou ROLLBACK interdite dans une instruction DML ou une interrogation


 
Je ne comprends pas pourquoi. Merci pour votre aide.


Message édité par pegase06 le 25-01-2007 à 10:58:09
Reply

Marsh Posté le 25-01-2007 à 10:34:50   

Reply

Marsh Posté le 25-01-2007 à 10:37:05    

Déjà, il manque un END à ton fonction (y'a un BEGIN, mais pas de END correspondant).
Ceci dit, vu l'erreur, ça doit pas venir de là.


Message édité par MagicBuzz le 25-01-2007 à 10:37:33
Reply

Marsh Posté le 25-01-2007 à 10:37:49    

J'ai mis que le début de la fonction ou apparait l'erreur. :)
Si je met en commentaire la ligne EXECUTE IMMEDIATE, je n'ai pas de problème.


Message édité par pegase06 le 25-01-2007 à 10:39:35
Reply

Marsh Posté le 26-01-2007 à 14:04:03    

je ne pense pas que tu puisses supprimer des contraintes en étant en select sur la table. ceci dit je n'en suis pas sûr.
essaie plutôt de stocker ca dans un tableau, de dérouler le tableau et de supprimer les contraintes.

Reply

Marsh Posté le 26-01-2007 à 15:32:36    

Sans conviction :tu pars sur un "FOR c IN" et tu y fais référence par contrainte.owner au lieu de c.owner.
 
Ensuite tu l'utilises à partir d'ou cette fonction ? Pourquoi ne pas faire une procédure qui semble plus approprié à mon goût ?
 
Et donc à tout hasard, n'essayerais tu pas de lancer cette fonction depuis un ordre SQL ? Si oui, peut tu tester si elle marche depuis un bloc PL/SQL anonyme ? Micii ! Si non, ben je continue à chercher :) !

Message cité 1 fois
Message édité par darkfrost le 26-01-2007 à 15:43:20
Reply

Marsh Posté le 26-01-2007 à 20:18:32    

darkfrost a écrit :

Sans conviction :tu pars sur un "FOR c IN" et tu y fais référence par contrainte.owner au lieu de c.owner.
 
Ensuite tu l'utilises à partir d'ou cette fonction ? Pourquoi ne pas faire une procédure qui semble plus approprié à mon goût ?
 
Et donc à tout hasard, n'essayerais tu pas de lancer cette fonction depuis un ordre SQL ? Si oui, peut tu tester si elle marche depuis un bloc PL/SQL anonyme ? Micii ! Si non, ben je continue à chercher :) !


Merci pour ton aide. J'ai finalement trouvé la cause du bug : on ne peut pas lancer en SQL une procédure PL/SQL qui effectue des opérations DDL CREATE, ALTER... ou COMMIT (le EXECUTE IMMEDIATE fait un COMMIT implicite). Il faut impérativement passé par une commande PL/SQL genre BEGIN retour := debug(...); END;


Message édité par hugo25 le 26-01-2007 à 20:20:05
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed