Domanda

Tutti,

Sono molto nuovo con le procedure memorizzate in generale, ma sto lottando soprattutto con quelle in Oracle. Ho creato un esempio molto semplice di ciò che sto cercando di realizzare e sto ancora ottenendo lo stesso errore con questa versione semplificata.

La procedura memorizzata di esempio è la seguente:

CREATE OR REPLACE PROCEDURE ashish_test
AUTHID CURRENT_USER IS
BEGIN
     DECLARE
          v_tab     VARCHAR2(50);
          v_strSQL  VARCHAR2(50);
     BEGIN
          v_strSQL := 'SELECT * FROM :1';
          v_tab    := 'ex.emp';
          EXECUTE IMMEDIATE v_strSQL USING v_tab;
     END;
END;

Quando chiamo la procedura memorizzata sopra usando CALL ashish_test () , ottengo:

Messaggio di errore http://web1.twitpic.com/img /12831839-06a3ea536df5d5a0a839eb83d9e59d25.4a3936b8-scaled.jpg

Basato su questo articolo (Cerca l'esempio 7-1), la parola chiave USING dovrebbe sostituire il segnaposto numerato (: 1 ) all'interno di v_strSQL con il valore memorizzato in v_tab . Tuttavia, continuo a ricevere un errore di tabella non valido. Immagino sia perché EXECUTE IMMEDIATE non è in grado di sostituire il segnaposto con il valore per qualche motivo, ma non sono sicuro del perché. Qualcuno sa se sto facendo qualcosa di stupido qui?

Sto eseguendo questo su Oracle 10g database & amp; utilizzando lo sviluppatore PL / SQL.

È stato utile?

Soluzione

La clausola USING è solo per le variabili di bind (ovvero dove si useranno i nomi di colonna in un'istruzione select), non i nomi di tabella. L'utilizzo tipico sarebbe simile al seguente:

Select col1 from table1 where col2 = :a

Se vuoi usare nomi di tabelle variabili usa qualcosa del genere:

         v_tab    := 'ex.emp';
         v_strSQL := 'SELECT * FROM ' || v_tab;
         EXECUTE IMMEDIATE v_strSQL;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top