Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сделать TRIGGER в Oracle из Delphi? [D6]


Страницы:   1 2

DBUser ©   (2007-12-21 21:45:00) 

Дано: Delphi 6 -> ADO -> Oracle 8
Надо: Выполнить CREATE TRIGGER
Проблема: Триггер или не создается, или создается с ошибкой
Подробности: Из Delphi через TADOCommand запускаю такой SQL-оператор:

create or replace trigger TRG before insert on TAB
for each row
declare tmp number;
begin
 select my_sequence.nextval into tmp from dual;
 :new.id:=tmp;
end


Команда выполняется без ошибок, но триггер не создается.
Разными тыками (изменением вышеуказаного кода) добивался, что триггер создается, но видимо кривой, т.к. при попытке сделать insert в таблицу TAB говорит что мол поправьте триггер.

Может подскажете как посмотреть на то что создалось, т.к. кроме команды DROP TRIGGER не знаю, как проверить что он вообще создался, а тем более без ошибки.

Из SQL*Plus вышеуказанный код идет без проблем (там, конечно, еще добавляется строка с /, но из Delphi это вроде бы ни к чему? Впрочем, с слэшем тоже не идет).
В общем, абзац...


Кщд   (2008-02-08 08:15:00) [1]


SQL> set serveroutput on;
SQL> declare
 2    i number;
 3    v_stmt varchar2(32767);
 4    v_start varchar2(32767);
 5  begin
 6    
 7    v_start := 'select sum(t.tmp) into :v_out from (select 1 tmp from dual ';
 8    loop
 9       exit when lengthb(v_stmt || ' union all select 1 from dual ') > 32 * power(2, 10);
10       v_stmt := v_stmt || ' union all select 1 from dual ';    
11    end loop;  
12    
13    execute immediate v_start || v_stmt || v_stmt || ') t'  into i;
14    dbms_output.put_line(to_char(i));
15    
16  end;
17  /
2185

Процедура PL/SQL успешно завершена.


Кщд   (2008-02-08 08:13:00) [2]

прошу прощения за теги


Кщд   (2008-02-08 08:13:00) [3]

например:
Oracle 8.1.7
[src]
SQL> set serveroutput on;
SQL> declare
 2    i number;
 3    v_stmt varchar2(32767);
 4    v_start varchar2(32767);
 5  begin
 6    
 7    v_start := 'select sum(t.tmp) i
 8    loop
 9       exit when lengthb(v_stmt ||
10       v_stmt := v_stmt || ' union
11    end loop;  
12    
13    execute immediate v_start || v_
14    dbms_output.put_line(to_char(i)
15    
16  end;
17  /
2185

[/src]

4000б - ограничение на длину литерала


Petr V. Abramov   (2008-02-07 13:57:00) [4]


> ANB   (07.02.08 13:36) [21]

у меня 10.2 32-бит


ANB   (2008-02-07 13:36:00) [5]

Дык и у меня уже нет. Работу сменил, а здесь 9.2 64 бита и 10 немного.
Кстати, откопал странности в ту_чар из намбера. Как то не так ботает, как на обычной 9.2. И незнакомые форматы появились. fm например - ни разу до этого не видел.


Petr V. Abramov   (2008-02-07 13:27:00) [6]


> ANB   (07.02.08 12:44) [19]

да нет у меня уже восьмерки.
но новость приятная, спс


ANB   (2008-02-07 12:44:00) [7]


> Petr V. Abramov ©   (07.02.08 12:32) [18]

А попробуй. Вроде как и в 8 я для буфера динамического скл 32000 отводил и елось.


Petr V. Abramov   (2008-02-07 12:32:00) [8]


> ANB   (07.02.08 12:11) [17]

не, в 8 больше 4000 не тянуло.


ANB   (2008-02-07 12:11:00) [9]


> с каких пор varchar2 стало 32К?

Ну, с 8 как минимум. На 9 (ща у меня стоит) - точно. Не путай ограничение на размер поля с ограничением на размер переменной.


Petr V. Abramov   (2008-02-07 12:00:00) [10]


> ANB   (07.02.08 09:58) [14]

с каких пор varchar2 стало 32К?


ANB   (2008-02-07 09:59:00) [11]

Я к тому, что можеть не маятся, а взять нормальные прямые компоненты типа доа или одака ?


ANB   (2008-02-07 09:58:00) [12]


> исходник запросто больше 4000 байт может оказаться

И какие проблемы с этим ? 32К строка точно держит.


Petr V. Abramov   (2008-02-06 19:51:00) [13]


> ANB   (06.02.08 17:55) [12]


> динамическим скл все без проблем получится.

с проблемами, исходник запросто больше 4000 байт может оказаться. Скорее, в [10] проблема, а не в ADO


ANB   (2008-02-06 17:55:00) [14]

Эта. Вопрос - а зачем так извращаться ? И так лезешь в оракл через АДО, так еще и триггера с клиента создавать пытаешься.
Напиши пакетик и в нем динамическим скл все без проблем получится. Останется тока дернуть хранимку.


pisk   (2008-02-06 13:47:00) [15]

Попробуй использовать вместо Provider=OraOLEDB.Oracle.1
Provider=MSDAORA.1


ЮЮ   (2007-12-27 04:07:00) [16]

Отключи ParamCheck у ADOCommand, а то наличие  ':' интерпретирует последующее как параметр.


Petr V. Abramov   (2007-12-27 01:16:00) [17]

посмотри какие кАнктретно запросы идут в базу каким нить трассировщиком с torry.net.
может, ADO что-нить как получьше сделать хочет.


Petr V. Abramov   (2007-12-27 01:10:00) [18]

> но и триггер не появляется
не появляется, или появляется, но фиговый?

из SQL*Plus и из программы под одним  и тем же юзером? если нет, см. all_erroros.


DBUser   (2007-12-26 20:11:00) [19]

Полный тупик - SQL оператор

create or replace trigger TRG before insert on TAB
for each row
begin
 select my_sequence.nextval into :new.id from dual;
end;
/


из программы проходит без проблем, сообщений об ошибках в таблице USER_ERRORS нет, но и триггер не появляется. Привилегии CREATE TRIGGER и CREATE ANY TRIGGER имеются. Тот же код из SQL*Plus работает как надо.

Братцы, кто может, пустите у себя этот код из-под ADO. Не думаю, что проблема в типе подключения, скорее в сервере или еще в чем - подскажите, а?


Petr V. Abramov   (2007-12-24 09:26:00) [20]

> DBUser   (23.12.07 22:56) [4]
> Кстати, как там извлечь результат RETURNING
через out-параметр запроса

> что такое user_errors ?
системеная таблица


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо