2 questions séparées.
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?
É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:
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
-- Première table temporaire Truncate SQL> TRUNCATE TABLE test_temp1; -- Puis déposer la table temporaire SQL> DROP TABLE test_temp1;
PuTTY
cd $ADMIN_SCRIPTS_HOME
./adstpall.sh
drop table t;
Cela fonctionnera ..