ESEGUIRE IMMEDIATO con la clausola USING che fornisce errori
-
06-07-2019 - |
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:
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.
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;