Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2008.07.20;
Скачать: [xml.tar.bz2];

Вниз

Как сделать 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.061 c
15-1212557889
андр.
2008-06-04 09:38
2008.07.20
Float=Real


2-1213966689
mefodiy
2008-06-20 16:58
2008.07.20
Удаленное подключение к серверу MySQL


15-1212254418
wl
2008-05-31 21:20
2008.07.20
Валерий Фаронов. Delphi 2005. Руководство по переходу с...


15-1212736550
Ega23
2008-06-06 11:15
2008.07.20
Есть ли такая приблуда?


6-1190627383
BOBik
2007-09-24 13:49
2008.07.20
WinSock и Disconnect





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский