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

Вниз

Ошибка insert select   Найти похожие ветки 

 
ShuraGrp ©   (2002-07-25 12:56) [0]

Уважаемые Мастера! Помогите разобрать. Есть ХР, в которой собственно и есть insert select. Почему ошибка не пойму.
Как видно из текстов ошибок ругается на дату.
Ошибки получены в дебагере EMS QuickDesk. Сама процедура из D6 не ругается, но возвращает Null.
Если убрать из select условие по дата, то все работает.
Может кто подскажет. Буду очень признателен.

CREATE PROCEDURE MAKEDEBET (
DOC_DATE DATE,
SCL INTEGER,
PROD INTEGER)
RETURNS (
SUMDEBET NUMERIC (15, 2))
AS
declare variable u integer;
declare variable us varchar(30);
declare variable d varchar(30);

begin
u = gen_id(GEN_ENTTMP, 1);

insert into EntTemp (User_id, prod_id, ent_id, prod_cena, ent_col)
select :u, e.prod_id, e.ent_id, e.prod_cena, e.ent_col
from entries e
where e.ent1_id = 0
and e.scl_id = :Scl
and e.prod_id = :Prod
and e.doc_date <= :DOC_DATE;

incompatible column/host variable data type.
Dynamic SQL error.
SQL error code = -303.
Conversion error from string ""2002-07-22"".

Пробовал так:
begin
d = :DOC_DATE;
us = gen_id(GEN_ENTTMP, 1);

insert into EntTemp (User_id, prod_id, ent_id, prod_cena, ent_col)
select cast(:us as integer), e.prod_id, e.ent_id, e.prod_cena, e.ent_col
from entries e
where e.ent1_id = 0
and e.scl_id = :Scl
and e.prod_id = :Prod
and e.doc_date <= cast(:d as date);

An error was found in application program input parameters for the sql statment.
Dynamic SQL error.
SQL error code = -804.
Data type unknown.


 
Alexandr ©   (2002-07-25 13:07) [1]

это глюк дебаггера.

Ведь дебаггера нету.
А то, что есть это эмуляция со своими ограничениями и ошибками.


 
ShuraGrp ©   (2002-07-25 13:56) [2]

Ну допустим глюк. Но Null то почему, данные то есть в таблице.


 
Alexandr ©   (2002-07-25 14:06) [3]

ты бы хоть текст процедуры полностью привел...
а то ведь даже не видно чего там в SUMDEBET попасть должно...


 
ShuraGrp ©   (2002-07-25 14:33) [4]

CREATE PROCEDURE MAKEDEBET (
DOC_DATE DATE,
SCL INTEGER,
PROD INTEGER,
COL NUMERIC (15, 5),
NL_ID INTEGER,
DL_ID INTEGER,
DOC_ID INTEGER,
R INTEGER)
RETURNS (
SUMDEBET NUMERIC (15, 2))
AS
declare variable i integer;
declare variable u integer;
declare variable us varchar(30);
declare variable d varchar(30);
declare variable Prod_id integer;
declare variable Ent_id integer;
declare variable Prod_Cena NUMERIC(15, 2);
declare variable b CHAR(1);
declare variable Ent_Col NUMERIC(15, 5);
declare variable Ent_Col_Sum NUMERIC(15, 5);
declare variable Curr_Col NUMERIC(15, 5);

begin
/*Dat = cast(Dat as Date);*/

/*


 
ShuraGrp ©   (2002-07-25 14:34) [5]

Извиняюсь кодировка подвела, но помоему текст прозрачен


 
Desdechado ©   (2002-07-25 18:22) [6]

1. ругается не на дату, а на несовместимость типов данных.
2. я бы сделал так
for select prod_id, ent_id, prod_cena, ent_col
from entries
where ent1_id = 0 and scl_id = :Scl and prod_id = :Prod and doc_date <= :DOC_DATE
into :prd, :ent, :cena, :col
do
insert into EntTemp (User_id, prod_id, ent_id, prod_cena, ent_col) values (:u, :prd, :ent, :cena, :col );


 
ShuraGrp ©   (2002-07-26 10:08) [7]

2Desdechado © (25.07.02 18:22)
А на сколько эта конструкция будет работать медленнее на больших объемах


 
Desdechado ©   (2002-07-26 10:26) [8]

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

при желании всегда можно проверить :)


 
ShuraGrp ©   (2002-07-26 10:41) [9]

Кажется я нашел косяк, но все равно не пойму почему:
Такая конструкция возвращает нормальные значения
select e.prod_id, e.ent_id, e.prod_cena, e.ent_col
from entries e
where e.ent1_id = 0
and e.scl_id = :Scl
and e.prod_id = :Prod
and e.doc_date <= :DOC_DATE
into :prod_id, :ent_id, :prod_cena, :ent_col

а такая все Null
for select e.prod_id, e.ent_id, e.prod_cena, e.ent_col
from entries e
where e.ent1_id = 0
and e.scl_id = :Scl
and e.prod_id = :Prod
and e.doc_date <= :DOC_DATE
into :prod_id, :ent_id, :prod_cena, :ent_col
do insert into EntTemp (User_id, prod_id, ent_id, prod_cena, ent_col)
values (:u, :prod_id, :ent_id, :prod_cena, :ent_col);
И вполне естественно ругань на Null, тк поля not Null


 
Desdechado ©   (2002-07-26 11:13) [10]

гы! так ты хочешь все-в-одном :)
ты либо делай выборку с возвращением данных (1), либо заполнение таблицы из другой выборки, которая не возвращается (2). это ж совершенно разные вещи!


 
ShuraGrp ©   (2002-07-26 12:59) [11]

Я сделал как посоветовали Desdechado © (25.07.02 18:22)
А в чем разные? И все-таки хотелось бы понять с конструкцией insert select?



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

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

Наверх




Память: 0.49 MB
Время: 0.017 c
1-48091
EternalWonderer
2002-08-05 11:25
2002.08.15
Как


3-47929
satin
2002-07-25 12:32
2002.08.15
ADO. Некритичная но непонятная ошибка.


3-47937
Gamar
2002-07-25 12:44
2002.08.15
Как в Дельфи перекопировать все поля одной записи в другую?


1-48103
Link
2002-08-05 13:20
2002.08.15
Указатель в виде песочных часов


1-48207
Vovaka
2002-08-02 09:02
2002.08.15
Помогите. Нужен Delphi 6 Enterprise Update Pack 2 +