![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать TRIGGER в Oracle из Delphi? [D6]
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 ?
системеная таблица