Domanda

Penso che potrei perdermi qualcosa qui.Ecco la parte rilevante del trigger:

CURSOR columnNames (inTableName IN VARCHAR2) IS 
   SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = inTableName;
/* Removed for brevity */
OPEN columnNames('TEMP');

Ed ecco il messaggio di errore che ricevo,

27/20   PLS-00306: wrong number or types of arguments in call to 'COLUMNNAMES'
27/2    PL/SQL: Statement ignored

Se capisco correttamente la documentazione, dovrebbe funzionare, ma poiché non lo è, devo fare qualcosa di sbagliato.Qualche idea?


@Matteo - Apprezzo l'aiuto, ma il motivo per cui sono confuso è perché questo pezzo di codice non funziona per me e solleva gli errori a cui si fa riferimento.Abbiamo altri trigger nel database con un codice quasi identico a quello, quindi non sono sicuro se si tratta di qualcosa che ho fatto di sbagliato o di qualcosa relativo al modo in cui sto cercando di memorizzare il trigger, ecc.


@Matteo - Beh, adesso mi sento in imbarazzo.Ho copiato/incollato il codice che hai fornito in un nuovo trigger e ha funzionato correttamente.Quindi sono tornato al trigger originale, l'ho provato e ho ricevuto di nuovo il messaggio di errore, tranne che questa volta ho iniziato a eliminare elementi dal trigger e dopo aver eliminato questa riga,

FOR columnName IN columnNames LOOP

Le cose sono andate bene.Quindi si scopre che dove pensavo fosse l'errore, in realtà non era dove si trovava l'errore.

È stato utile?

Soluzione

@Rapinare

Se taglia/incolli il codice che ho qui, funziona?

Come/dove stai chiamando il tuo codice?è in un trigger, vero?

La query che hai scritto qui riguarda effettivamente il codice che produce l'errore, o solo un esempio (ad esempio, puoi riprodurre l'errore con la query che hai sopra)

Altri suggerimenti

Per chiarire la causa del problema.Come dici tu

OPEN nomecolonna('TEMP');

ha lavorato mentre

FOR nomecolonna IN nomicolonna LOOP

no.L'istruzione FOR funzionerebbe bene se includesse anche il parametro in questo modo:

FOR nomecolonna IN nomicolonna('TEMP') LOOP

Non mostri il codice in cui recuperi le righe, quindi non posso dirti il ​​tuo scopo, ma dove lavoro OPEN è comunemente usato per recuperare la prima riga (in questo caso, il nome della prima colonna della tabella data) mentre il FOR viene utilizzato per scorrere tutte le righe restituite.

@Commento di Rob.Non mi è consentito commentare, quindi aggiorno qui.Il parametro mancante è quello che descrivo sopra.Hai aggiunto una risposta affermando che hai semplicemente eliminato il ciclo FOR.Non sembrava che tu, in quel momento, avessi capito perché cancellarlo faceva la differenza.Ecco perché ho tentato di spiegare poiché, a seconda delle tue necessità, il ciclo FOR potrebbe essere una soluzione migliore.

Funziona bene per me.

create or replace procedure so_test_procedure as 
 CURSOR columnNames (inTableName IN VARCHAR2) IS 
   SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = inTableName; 
BEGIN      
 OPEN columnNames('TEMP');
 CLOSE columnNames;
END;

procedure so_test_procedure Compiled.
execute so_test_procedure();

anonymous block completed
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top