Truncate table dentro de un Procedure
Tengo un procedimiento en el cual se tiene que borrar una tabla por completo para luego almacenarle datos, antes este proc hacÃa un delete pero ahora como la tabla es muy grande el procedimiento me truena ya que el segmento de rollback es muy grande, estoy tratando de utilizar el truncate table en lugar del delete pero al compilar el proc me sale el siguiente error :
PLS-00103: Encountered the symbol "TABLE" when expecting one of the following:
:= . ( @ % ;
Alguien de ustedes podrÃa ayudarme.
Saludos y gracias de antemano.
PLS-00103: Encountered the symbol "TABLE" when expecting one of the following:
:= . ( @ % ;
Alguien de ustedes podrÃa ayudarme.
Saludos y gracias de antemano.
Estimado Javier, buenos dias.
Supongo que pones algo parecido a esto : TRUNCATE TABLE TU_TABLA;
Esto en pl-sql no es correcto, si lo quieres meter en pl-sql tienes que hacerlo asà :
EXECUTE IMMEDIATE \'TRUNCATE TABLE TU_TABLA\'
Ponlo asà y ya veras como te funciona.
Un saludo
Supongo que pones algo parecido a esto : TRUNCATE TABLE TU_TABLA;
Esto en pl-sql no es correcto, si lo quieres meter en pl-sql tienes que hacerlo asà :
EXECUTE IMMEDIATE \'TRUNCATE TABLE TU_TABLA\'
Ponlo asà y ya veras como te funciona.
Un saludo
Aquà está una versión que funciona también con Oracle 7:
SQL> @temp
SQL> SET ECHO ON
SQL> CREATE TABLE ANDREWS_TABLE
2 AS SELECT SYSDATE TODAYS_DATE
3 FROM DUAL
4 /
Table created.
SQL> SELECT TODAYS_DATE BEFORE_TRUNCATE
2 FROM ANDREWS_TABLE
3 /
BEFORE_TR
---------
07-DEC-05
SQL> DECLARE
2 CID INTEGER;
3 EXECUTED INTEGER;
4 DYNAMIC_SQL_STATEMENT VARCHAR2(200);
5 BEGIN
6 CID:= DBMS_SQL.OPEN_CURSOR;
7 DYNAMIC_SQL_STATEMENT := \'TRUNCATE TABLE ANDREWS_TABLE\';
8 DBMS_SQL.PARSE(CID, DYNAMIC_SQL_STATEMENT, DBMS_SQL.V7);
9 EXECUTED := DBMS_SQL.EXECUTE(CID);
10 DBMS_SQL.CLOSE_CURSOR(CID);
11 END;
12 /
PL/SQL procedure successfully completed.
SQL> SELECT TODAYS_DATE AFTER_TRUNCATE
2 FROM ANDREWS_TABLE
3 /
no rows selected
SQL> DROP TABLE ANDREWS_TABLE
2 /
Table dropped.
SQL>
SQL> @temp
SQL> SET ECHO ON
SQL> CREATE TABLE ANDREWS_TABLE
2 AS SELECT SYSDATE TODAYS_DATE
3 FROM DUAL
4 /
Table created.
SQL> SELECT TODAYS_DATE BEFORE_TRUNCATE
2 FROM ANDREWS_TABLE
3 /
BEFORE_TR
---------
07-DEC-05
SQL> DECLARE
2 CID INTEGER;
3 EXECUTED INTEGER;
4 DYNAMIC_SQL_STATEMENT VARCHAR2(200);
5 BEGIN
6 CID:= DBMS_SQL.OPEN_CURSOR;
7 DYNAMIC_SQL_STATEMENT := \'TRUNCATE TABLE ANDREWS_TABLE\';
8 DBMS_SQL.PARSE(CID, DYNAMIC_SQL_STATEMENT, DBMS_SQL.V7);
9 EXECUTED := DBMS_SQL.EXECUTE(CID);
10 DBMS_SQL.CLOSE_CURSOR(CID);
11 END;
12 /
PL/SQL procedure successfully completed.
SQL> SELECT TODAYS_DATE AFTER_TRUNCATE
2 FROM ANDREWS_TABLE
3 /
no rows selected
SQL> DROP TABLE ANDREWS_TABLE
2 /
Table dropped.
SQL>
Esta versión es más sencilla.
No funciona con Oracle 7 pero funciona con Oracle 8 y 9:
SQL> @temp
SQL> SET ECHO ON
SQL> CREATE TABLE ANDREWS_TABLE
2 AS SELECT SYSDATE TODAYS_DATE
3 FROM DUAL
4 /
Table created.
SQL> SELECT TODAYS_DATE BEFORE_TRUNCATE
2 FROM ANDREWS_TABLE
3 /
BEFORE_TR
---------
07-DEC-05
SQL> DECLARE
2 DYNAMIC_SQL_STATEMENT VARCHAR2(200);
3 BEGIN
4 DYNAMIC_SQL_STATEMENT := 'TRUNCATE TABLE ANDREWS_TABLE';
5 EXECUTE IMMEDIATE DYNAMIC_SQL_STATEMENT;
6 END;
7 /
PL/SQL procedure successfully completed.
SQL> SELECT TODAYS_DATE AFTER_TRUNCATE
2 FROM ANDREWS_TABLE
3 /
no rows selected
SQL> DROP TABLE ANDREWS_TABLE
2 /
Table dropped.
SQL>
No funciona con Oracle 7 pero funciona con Oracle 8 y 9:
SQL> @temp
SQL> SET ECHO ON
SQL> CREATE TABLE ANDREWS_TABLE
2 AS SELECT SYSDATE TODAYS_DATE
3 FROM DUAL
4 /
Table created.
SQL> SELECT TODAYS_DATE BEFORE_TRUNCATE
2 FROM ANDREWS_TABLE
3 /
BEFORE_TR
---------
07-DEC-05
SQL> DECLARE
2 DYNAMIC_SQL_STATEMENT VARCHAR2(200);
3 BEGIN
4 DYNAMIC_SQL_STATEMENT := 'TRUNCATE TABLE ANDREWS_TABLE';
5 EXECUTE IMMEDIATE DYNAMIC_SQL_STATEMENT;
6 END;
7 /
PL/SQL procedure successfully completed.
SQL> SELECT TODAYS_DATE AFTER_TRUNCATE
2 FROM ANDREWS_TABLE
3 /
no rows selected
SQL> DROP TABLE ANDREWS_TABLE
2 /
Table dropped.
SQL>