Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Oracle 10g. TRUNCATE TABLE. Ошибка при компиляции процедуры.  (Прочитано 18105 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« : 10-02-2009 08:59 » 

Код: (Text)
CREATE OR REPLACE PROCEDURE KLADR.IMPORT_FROM_EXTERNAL IS
BEGIN
 TRUNCATE TABLE KLADR.ADDR_OBJ_1234 DROP STORAGE;
 TRUNCATE TABLE KLADR.ADDR_OBJ_5 DROP STORAGE;
 TRUNCATE TABLE KLADR.ADDR_OBJ_6 DROP STORAGE;
 TRUNCATE TABLE KLADR.ADDR_OBJ_ALT DROP STORAGE;
 TRUNCATE TABLE KLADR.ADDR_OBJ_TYPE DROP STORAGE;
 KLADR.IMPORT_SOCRBASE();
 KLADR.IMPORT_ALTNAMES();
 KLADR.IMPORT_KLADR();
 KLADR.IMPORT_STREET();
 KLADR.IMPORT_DOMA();
END;
/

TOAD говорит:
Код:
PROCEDURE KLADR.IMPORT_FROM_EXTERNAL
On line:  3
PLS-00103: Encountered the symbol "TABLE" when expecting one of the following:

   := . ( @ % ;

В sqlplus - просто "ошибка во время компиляции".

Не понимаю. Указывает на первый TRUNCATE TABLE. Отдельно этот оператор проблем не вызывает, а тут что-то не то. Неужели нельзя использовать TRUNCATE в процедурах?  Быть такого не может
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #1 : 10-02-2009 09:08 » 

В блоках PL/SQL такого делать нельзя, нужно либо через DDL, либо пользуюй DROP.

Код:
Begin
Some :=' truncate table KLADR.ADDR_OBJ_6;'
Execute immediate Some;
End;
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #2 : 10-02-2009 09:31 » 

Наш ораклист еще сказал, что можно просто перед truncate, вставить Execute immediate.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #3 : 10-02-2009 09:48 » 

Create table тож нельзя =)

EXECUTE IMMEDIATE ':v_sql';
Код:
CREATE OR REPLACE PROCEDURE kladr.import_from_external IS
  v_sql VARCHAR2(4000);
BEGIN
  v_sql := '
 TRUNCATE TABLE KLADR.ADDR_OBJ_1234 DROP STORAGE;
 TRUNCATE TABLE KLADR.ADDR_OBJ_5 DROP STORAGE;
 TRUNCATE TABLE KLADR.ADDR_OBJ_6 DROP STORAGE;
 TRUNCATE TABLE KLADR.ADDR_OBJ_ALT DROP STORAGE;
 TRUNCATE TABLE KLADR.ADDR_OBJ_TYPE DROP STORAGE;';
  EXECUTE IMMEDIATE v_sql;

  kladr.import_socrbase();
  kladr.import_altnames();
  kladr.import_kladr();
  kladr.import_street();
  kladr.import_doma();
END;
« Последнее редактирование: 10-02-2009 09:52 от PooH » Записан

Удачного всем кодинга! -=x[PooH]x=-
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 10-02-2009 09:59 » 

А где можно о таких ограничениях почитать? Пока проштудировал "SQL Reference" (B14200-02) - описание TRUNCATE и "Application Developer's Guide - Fundamentals" (B14251-01) - "Coding PL/SQL Procedures and Packages", но не нашел.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #5 : 10-02-2009 10:03 » 

а DDL в PL\SQL, по-поему, полностью запрещен. (могу ошибаться)

upd: вот тут тоже самое пишут

upd: тут вкратце объяснено "почему?"

upd: ну и о том же самом тут
« Последнее редактирование: 10-02-2009 10:13 от PooH » Записан

Удачного всем кодинга! -=x[PooH]x=-
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 10-02-2009 10:06 » 

PooH, такая форма не проходит.

Получилось так:
Код: (SQL)
CREATE OR REPLACE PROCEDURE KLADR.IMPORT_FROM_EXTERNAL IS
BEGIN
 EXECUTE IMMEDIATE 'TRUNCATE TABLE KLADR.ADDR_OBJ_1234 DROP STORAGE';
 EXECUTE IMMEDIATE 'TRUNCATE TABLE KLADR.ADDR_OBJ_5 DROP STORAGE';
 EXECUTE IMMEDIATE 'TRUNCATE TABLE KLADR.ADDR_OBJ_6 DROP STORAGE';
 EXECUTE IMMEDIATE 'TRUNCATE TABLE KLADR.ADDR_OBJ_ALT DROP STORAGE';
 EXECUTE IMMEDIATE 'TRUNCATE TABLE KLADR.ADDR_OBJ_TYPE DROP STORAGE';
 KLADR.IMPORT_SOCRBASE();
 KLADR.IMPORT_ALTNAMES();
 KLADR.IMPORT_KLADR();
 KLADR.IMPORT_STREET();
 KLADR.IMPORT_DOMA();
END;
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 10-02-2009 10:35 » 

Не знал, что TRUNCATE относится к DDL...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #8 : 10-02-2009 12:54 » 

Цитата
такая форма не проходит
Точно, блин, это ж "native sql" - там даже на ";" ругается. Может и можно заставить несколько операция подряд выполнить, но я с этим не сталкивался, по-этому и "попался".

Цитата
Не знал, что TRUNCATE относится к DDL...
Ну насколько я понимаю, это что вроде "быстрого форматирования", то есть с самими данными ничего не происходит, а работа идет только со свойствами объекта, а это уже DDL получается.
« Последнее редактирование: 10-02-2009 12:56 от PooH » Записан

Удачного всем кодинга! -=x[PooH]x=-
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 10-02-2009 16:39 » 

Раньше, в старых версиях MySQL оператора TRUNCATE не было, а DELETE без условий просто пересоздавал таблицу (триггеров тогда еще не было и обрабатывать удаляемое было не нужно). По этому у меня TRUNCATE ассоциировался с разновидностью DELETE.
Как я понял, DML - только SELECT, INSERT, UPDATE и DELETE (в MySQL есть еще REPLACE), а все остальное отнесено к DDL.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #10 : 11-02-2009 06:01 » 

Цитата
What are the difference between DDL, DML and DCL commands?
Submitted by admin on Wed, 2004-08-04 13:49

DDL

Data Definition Language (DDL) statements are used to define the database structure or schema. Some examples:

CREATE - to create objects in the database
ALTER - alters the structure of the database
DROP - delete objects from the database
TRUNCATE - remove all records from a table, including all spaces allocated for the records are removed
COMMENT - add comments to the data dictionary
RENAME - rename an object

DML

Data Manipulation Language (DML) statements are used for managing data within schema objects. Some examples:
SELECT - retrieve data from the a database
INSERT - insert data into a table
UPDATE - updates existing data within a table
DELETE - deletes all records from a table, the space for the records remain
MERGE - UPSERT operation (insert or update)
CALL - call a PL/SQL or Java subprogram
EXPLAIN PLAN - explain access path to data
LOCK TABLE - control concurrency

DCL

Data Control Language (DCL) statements. Some examples:

GRANT - gives user's access privileges to database
REVOKE - withdraw access privileges given with the GRANT command

TCL

Transaction Control (TCL) statements are used to manage the changes made by DML statements. It allows statements to be grouped together into logical transactions.
COMMIT - save work done
SAVEPOINT - identify a point in a transaction to which you can later roll back
ROLLBACK - restore database to original since the last COMMIT
SET TRANSACTION - Change transaction options like isolation level and what rollback segment to use
http://www.orafaq.com/faq/what_are_the_difference_between_ddl_dml_and_dcl_commands
« Последнее редактирование: 11-02-2009 06:05 от PooH » Записан

Удачного всем кодинга! -=x[PooH]x=-
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines