Condividi tramite


classe di errore TABLE_OR_VIEW_NOT_FOUND

SQLSTATE: 42P01

Impossibile trovare la tabella o la vista <relationName> . Verificare l'ortografia e la correttezza dello schema e del catalogo.

Se il nome non è stato qualificato con uno schema, verificare l'output current_schema() o qualificare il nome con lo schema e il catalogo corretti.

Per tollerare l'errore in caso di rilascio, usare DROP VIEW IF EXISTS o DROP TABLE IF EXISTS.

Parametri

  • relationName: nome della relazione specificata (tabella o vista) che non è possibile trovare.

Spiegazione

Le tabelle e le viste persistenti sono costituite da tre parti del nome: <catalog>.<schema>.<relation>. Se non si specificano tutte e tre le parti del nome, viene completata in modo implicito usando il catalogo corrente o lo schema corrente. Questo comportamento è simile al modo in cui la directory di lavoro del file system influisce sui file che è possibile visualizzare, a meno che non si specifichi completamente il percorso.

Le viste temporanee o le espressioni di tabella comuni (CTE) esistono solo all'interno della sessione o della query e non devono mai essere qualificate.

Il motivo più comune per cui non è possibile trovare una tabella o una vista è:

  • L'oggetto non esiste semplicemente.
  • Il nome dell'oggetto, lo schema o il catalogo è stato digitato in modo errato.
  • L'oggetto non si trova nello schema corrente.
  • L'utente non ha accesso all'oggetto e pertanto non può vederlo.

Mitigazione

La mitigazione dell'errore dipende dalla causa:

  • La tabella o la vista, lo schema o il nome del catalogo non sono stati digitati correttamente?

    Correggere l'ortografia.

  • Il nome non è stato completo e il risultato di VALUES current_schema() non corrisponde al nome completo della tabella o della vista?

    Qualificare in modo esplicito con lo relationName schema e il catalogo oppure eseguire un USE SCHEMA comando per impostare lo schema implicito desiderato.

  • Si è fatto riferimento a una visualizzazione temporanea, ma si trovava in una sessione precedente, scaduta o diversa?

    Ricreare la visualizzazione temporanea usando CREATE TEMPORARY VIEW <relationName> …o passare all'uso di una visualizzazione permanente.

  • Si è fatto riferimento a un'espressione di tabella comune (CTE), ma non rientra nell'ambito?

    Spostare la definizione del CTE nella query più esterna. Si tratta dell'inizio dell'istruzione, pertanto è visibile ovunque all'interno dell'istruzione .

  • Si vuole eseguire un'istruzione DDL, ad esempio 'DROP TABLE' solo nel caso in cui l'oggetto esista?

    Eseguire l'istruzione usando la IF EXISTS clausola , ad esempio : DROP TABLE <relationName> IF EXISTS.

  • Si sa che l'oggetto esiste, ma non è possibile vederlo in SHOW TABLE?

    Contattare l'amministratore per ottenere l'accesso alla tabella concessa. Potrebbe essere necessario includere anche l'accesso allo schema e al catalogo.

  • Non è chiaro perché non è possibile risolvere la tabella o la vista?

    Per una descrizione dettagliata della risoluzione dei nomi, vedere Tabella e risoluzione della vista .

Esempi

-- The table is located in othercat.someschema
> SELECT count(*) FROM t;
 [TABLE_OR_VIEW_NOT_FOUND] The table or view `t` cannot be found.

> VALUES current_schema();
 default

-- Change the current schema
> USE SCHEMA othercat.someschema;
> SELECT count(*) FROM T;
 1

-- Alternatively qualify the table
> SELECT count(*) FROM othercat.someschema.t;
 1

-- A reference to a CTE in the wrong scope:
> SELECT count(1) FROM (WITH v(c1) AS (VALUES (1)) VALUES(2)) AS t(c1), v;
 [TABLE_OR_VIEW_NOT_FOUND] The table or view `v` cannot be found.

-- Move the CTE to top level
> WITH v(c1) AS (VALUES (1))
  SELECT count(1) FROM VALUES(2) AS t(c1), v;
 1

-- Dropping a non existing view
> DROP VIEW v;
 [TABLE_OR_VIEW_NOT_FOUND] The table or view `v` cannot be found.

> DROP VIEW IF EXISTS v;