Форум: "Базы";
Текущий архив: 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