web-dev-qa-db-fra.com

déposer une table temporaire globale

2 questions séparées.

  1. J'utilise ce script pour supprimer une table [RESOLU]

    BEGIN
        EXECUTE IMMEDIATE 'DROP TABLE_NAME';
        DBMS_OUTPUT.PUT_LINE ('Global table TABLE_NAME Dropped');
        EXCEPTION
            WHEN OTHERS THEN
                DBMS_OUTPUT.PUT_LINE ('Global table TABLE_NAME Doesn''t exist.');
    END;
    /
    

Est-il possible de distinguer si la table "n'existe pas" ou si elle est utilisée dans d'autres sessions (dans ce cas, elle serait verrouillée et ne pourrait pas être supprimée) Je ne suis pas sûr si je peux voir que la table existe dans user_tables. Je ne suis pas complètement au courant des autorisations.

J'ai ajouté ce code maintenant

WHEN OTHERS THEN
        i_code  :=  SQLCODE;
        v_errm  :=  SUBSTR(SQLERRM, 1, 64);
  if i_code = -942 THEN
    DBMS_OUTPUT.PUT_LINE ('TABLE_NAME doesn''t exist. Script will continue to create it');
  ELSE
    DBMS_OUTPUT.PUT_LINE ('Error dropping temporary table. The error code is ' || i_code || '- ' || v_errm);
  END IF ;

2. Je vois. à la fin de chaque procédure comme celle-ci

END PROCEDURE_NAME;
.
/
sho err;

Je ne comprends tout simplement pas pourquoi. est là. Est-ce la syntaxe ou quoi?

10
x.509

Étape 1. Déterminez les erreurs que vous voulez intercepter:

Si la table n'existe pas:

SQL> drop table x;
drop table x
           *
ERROR at line 1:
ORA-00942: table or view does not exist

Si la table est en cours d'utilisation:

SQL> create global temporary table t (data varchar2(4000));

Table created.

Utilisez la table dans une autre session. (Remarquez qu'aucun commit ou quoi que ce soit après l'insertion.)

SQL> insert into t values ('whatever');

1 row created.

De retour dans la première session, essayez de déposer:

SQL> drop table t;
drop table t
           *
ERROR at line 1:
ORA-14452: attempt to create, alter or drop an index on temporary table already in use

Donc, les deux erreurs à piéger:

  1. ORA-00942: la table ou la vue n'existe pas 
  2. ORA-14452: tentative de création, modification ou suppression d'un index sur une table temporaire déjà utilisée

Voir si les erreurs sont prédéfini . Ils ne sont pas. Ils doivent donc être définis comme suit:

create or replace procedure p as
    table_or_view_not_exist exception;
    pragma exception_init(table_or_view_not_exist, -942);
    attempted_ddl_on_in_use_GTT exception;
    pragma exception_init(attempted_ddl_on_in_use_GTT, -14452);
begin
    execute immediate 'drop table t';

    exception 
        when table_or_view_not_exist then
            dbms_output.put_line('Table t did not exist at time of drop. Continuing....');

        when attempted_ddl_on_in_use_GTT then
            dbms_output.put_line('Help!!!! Someone is keeping from doing my job!');
            dbms_output.put_line('Please rescue me');
            raise;
end p;

Et les résultats, d'abord sans t:

SQL> drop table t;

Table dropped.

SQL> exec p;
Table t did not exist at time of drop. Continuing....

PL/SQL procedure successfully completed.

Et maintenant, avec t en cours d’utilisation:

SQL> create global temporary table t (data varchar2(4000));

Table created.

Dans une autre session:

SQL> insert into t values (null);

1 row created.

Et puis dans la première session:

SQL> exec p;
Help!!!! Someone is keeping from doing my job!
Please rescue me
BEGIN p; END;

*
ERROR at line 1:
ORA-14452: attempt to create, alter or drop an index on temporary table already in use
ORA-06512: at "SCHEMA_NAME.P", line 16
ORA-06512: at line 1
13
Shannon Severance
-- Première table temporaire Truncate 
 SQL> TRUNCATE TABLE test_temp1; 

-- Puis déposer la table temporaire 
 SQL> DROP TABLE test_temp1; 
15
Nader
  1. Arrêtez le serveur Apache en exécutant ci-dessous PuTTYcd $ADMIN_SCRIPTS_HOME./adstpall.sh
  2. Supprimer les tables temporaires globales drop table t;

Cela fonctionnera ..

0
Suresh Kalvoj