2 Separate Fragen.
Ich verwende dieses Skript, um eine Tabelle zu löschen [Gelöst]
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;
/
Gibt es trotzdem einen Unterschied, ob die Tabelle "nicht existiert" oder in anderen Sitzungen verwendet wird (in diesem Fall würde sie gesperrt und konnte nicht gelöscht werden) Ich bin nicht sicher, ob ich sehen kann, dass die Tabelle in user_tables vorhanden ist. Ich bin mir der Berechtigungen nicht vollständig bewusst.
Ich habe diesen Code jetzt hinzugefügt
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. Ich sehe. am Ende jeder Prozedur wie folgt
END PROCEDURE_NAME;
.
/
sho err;
Ich verstehe einfach nicht warum. ist hier. Ist es die Syntax oder was?
Schritt 1. Finden Sie heraus, welche Fehler Sie abfangen möchten:
Wenn die Tabelle nicht existiert:
SQL> drop table x;
drop table x
*
ERROR at line 1:
ORA-00942: table or view does not exist
Wenn die Tabelle verwendet wird:
SQL> create global temporary table t (data varchar2(4000));
Table created.
Verwenden Sie die Tabelle in einer anderen Sitzung. (Beachten Sie kein Commit oder irgendetwas nach dem Insert.)
SQL> insert into t values ('whatever');
1 row created.
Versuchen Sie, in der ersten Sitzung zu löschen:
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
Also die zwei Fehler zu fangen:
Prüfen Sie, ob die Fehler vordefiniert sind . Sie sind nicht Sie müssen also wie folgt definiert werden:
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;
Und Ergebnisse zuerst ohne 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.
Und jetzt mit t
im Einsatz:
SQL> create global temporary table t (data varchar2(4000));
Table created.
In einer anderen Sitzung:
SQL> insert into t values (null);
1 row created.
Und dann in der ersten Sitzung:
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
-- Zuerst temporäre Tabelle abschneiden SQL> TRUNCATE TABLE test_temp1; -- Dann temporäre Tabelle löschen SQL> DROP TABLE test_temp1;
PuTTY
cd $ADMIN_SCRIPTS_HOME
./adstpall.sh
laufen.drop table t;
Das wird trainieren ..