Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.20;
Скачать: CL | DM;

Вниз

Как сделать TRIGGER в Oracle из Delphi?   Найти похожие ветки 

 
DBUser   (2007-12-21 21:45) [0]

Дано: 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 это вроде бы ни к чему? Впрочем, с слэшем тоже не идет).
В общем, абзац...


 
Правильный_Вася   (2007-12-21 22:28) [1]

а права имеешь?
а точку с запятой в конце кто ставить будет?


 
Petr V. Abramov ©   (2007-12-22 00:54) [2]

а команда create trigger всегда выполняется успешно, по крайней мере, SQLCODE будет ora-00000. Если первые слова - create trigger :)
ошибки компиляции - в user_errors


 
Petr V. Abramov ©   (2007-12-22 01:04) [3]

P.S.
если триггер только из-за того, что в нем написано :)
можно вообще с ним не париться

insert into TAB values (my_sequence.nextval , /*остальные поля через запятую */)
returning ID into :id -- если значение ID где-то надо сразу после вставления


 
DBUser   (2007-12-23 22:56) [4]

Права есть (с теми же учетными данными из SQL*Plus все создается).
Точка с запятой в конце ничего не меняет.
Вариант с вставкой ключевого поля как sequence в команде insert использовать не хочется в силу ряда причин. Воспользуюсь  лишь в крайнем случае. Кстати, как там извлечь результат RETURNING - вызывать SQL-оператор из TADOQuery?

И пожалуйста поясните - что такое user_errors ?


 
Sergey13 ©   (2007-12-24 09:04) [5]

> [0] DBUser   (21.12.07 21:45)

Зачем тебе лишняя переменная в этом тригере?

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


 
Petr V. Abramov ©   (2007-12-24 09:26) [6]

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

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


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

Полный тупик - 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-27 01:10) [8]

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

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


 
Petr V. Abramov ©   (2007-12-27 01:16) [9]

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


 
ЮЮ ©   (2007-12-27 04:07) [10]

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


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

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


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

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


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


> ANB   (06.02.08 17:55) [12]


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

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


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


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

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


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

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


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


> ANB   (07.02.08 09:58) [14]

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


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


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

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


 
Petr V. Abramov ©   (2008-02-07 12:32) [18]


> ANB   (07.02.08 12:11) [17]

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


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


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

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


 
Petr V. Abramov ©   (2008-02-07 13:27) [20]


> ANB   (07.02.08 12:44) [19]

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


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

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


 
Petr V. Abramov ©   (2008-02-07 13:57) [22]


> ANB   (07.02.08 13:36) [21]

у меня 10.2 32-бит


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

например:
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б - ограничение на длину литерала


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

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


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


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 успешно завершена.



Страницы: 1 вся ветка

Текущий архив: 2008.07.20;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.016 c
6-1189537494
Sharp
2007-09-11 23:04
2008.07.20
помогите с куками


1-1195565883
Максим
2007-11-20 16:38
2008.07.20
как накладывать фильтр на строки Combobox`а нестандартн. маской?


2-1213858466
uno-84
2008-06-19 10:54
2008.07.20
Шрифт текста в строке StringGrid


2-1213818446
JustI
2008-06-18 23:47
2008.07.20
Initialization


8-1181942056
GoRdon_2007
2007-06-16 01:14
2008.07.20
Продолжительность видео/аудио