процедура - что не так?

Alexus12
Дата: 23.09.2004 11:33:32
ругается 'no data found at line 2'
но на второй строке только IS!!!

PROCEDURE P_LOAD_INDATA    
IS
var_datenew date;
var_dateold date;
var_dateold_not_exist date;
var_statusid t_indata_row.FSTATUSID%type;
var_statustext t_indata_row.FSTATUSTEXT%type;
--var_except exception;
BEGIN
SELECT fdate INTO var_datenew  FROM t_indata_row;

SELECT fdateold INTO var_dateold  FROM t_indata_row;

SELECT fdate INTO var_dateold_not_exist
  FROM t_accdata
  where fdate=var_dateold  and rownum=1;

if var_datenew  = var_dateold  THEN
var_statusid := 1;
var_statustext := 'ERR: исходная и загружаемая даты совпадают - бред!';
UPDATE t_indata_row SET fstatusid = var_statusid , fstatustext = var_statustext ;

elsif var_dateold_not_exist is null THEN
var_statusid := 2;
var_statustext := 'ERR: исходная дата '|| var_dateold  || ' не существует в t_accdata!';
UPDATE t_indata_row SET fstatusid = var_statusid , fstatustext = var_statustext ;

ELSE

SAVEPOINT P_LOAD_INDATA_savebeforestart;

--1.Del new (inserting) day
/*
DELETE FROM t_accdata
WHERE fdate=var_datenew ; 
*/

--2.insert old data

var_statusid :=-1;
var_statustext := 'обработка - вставка совпадавших';
UPDATE t_indata_row SET fstatusid = var_statusid , fstatustext = var_statustext;

insert into t_accdata(fdate, facc, fsumrur)
select var_datenew,  t_accdata.facc,  t_accdata.fsumrur from  t_accdata,t_indata
where var_dateold= t_accdata.fdate and t_indata.facc(+)= t_accdata.facc
and  t_indata.facc is null;

var_statusid :=-1;
var_statustext := 'обработка - вставка различий';
UPDATE t_indata_row SET fstatusid = var_statusid , fstatustext = var_statustext;

--3.insert newaccs (not null)
insert into t_accdata (fdate,facc,fsumrur)
SELECT fdate,facc,fsumrur FROM t_indata,t_indata_row
where t_indata.fsumrur is not null;


var_statusid :=0;
var_statustext := 'ОК, P_LOAD_INDATA выполнена';
UPDATE t_indata_row SET fstatusid = var_statusid , fstatustext = var_statustext ;
commit;
END IF;

EXCEPTION
 WHEN others THEN
ROLLBACK to savepoint P_LOAD_INDATA_savebeforestart;
var_statusid :=-1;
var_statustext := 'Неизвестная ошибка при выполнении P_LOAD_INDATA, данные не изменены';
UPDATE t_indata_row SET fstatusid = var_statusid , fstatustext = var_statustext;

END P_LOAD_INDATA; 
Azef
Дата: 23.09.2004 11:37:17
Это при создании ругается или она инвалидная?
Andrew Campball
Дата: 23.09.2004 11:41:44
Сделай так

begin
  SELECT fdate INTO var_datenew  FROM t_indata_row;
exception
  when no_data_found do
    var_datenew := 0;
end;

begin
  SELECT fdateold INTO var_dateold  FROM t_indata_row;
exception
  when no_data_found do
    var_dateold  := 0;
end;

begin
  SELECT fdate INTO var_dateold_not_exist
    FROM t_accdata
    where fdate=var_dateold  and rownum=1;
exception
  when no_data_found do
    var_dateold_not_exist := 0;
end;

А отсчет строк начинается со слова BEGIN - вроде бы.
Oleg Afanasiev
Дата: 23.09.2004 11:45:37
странно вобщем -то ...
такое впечатление что она вырвана из контекста
напиши create or replace ....
попробуй поменять имя
или в конце концов закомментируй тело
и поставь
NULL
Oleg Afanasiev
Дата: 23.09.2004 11:48:23
погоди.. так у тебя похоже
таблица t_indata_row пустая

кстати если там будет больше 1 строки ты получишь
too_many_rows
Elic
Дата: 23.09.2004 11:53:55
2 Alexus12
1) 'no data found at line 2' скорее всего относится к аннонимному блоку, с помощью которого ты исполняешь процедуру. Приведи полный стек ошибок.
2) Есть потенциальная логическая ошибка:
"WHEN others THEN ROLLBACK to savepoint..." может отработать без предварительного "SAVEPOINT ...", и тогда будет
"ORA-01086: savepoint '...' never established"
Alexus12
Дата: 23.09.2004 12:05:47
процедура валидна
ругается пи execute

последовательными комментариями
вычислено место:

SELECT fdate INTO var_dateold_not_exist
FROM t_accdata
where fdate=var_dateold and rownum=1;

должно:
выбрать первую запись из accdata
которая совпадет с var_dateold

и выдать в var_dateold_not_exist
или найденную дату,
или null
вопрос: как?!!
_Nikotin_
Дата: 23.09.2004 12:13:28
Попробуй:

SELECT fdate INTO var_dateold_not_exist
FROM t_accdata
where fdate=var_dateold and rownum<2;
Elic
Дата: 23.09.2004 12:15:07
Alexus12
выбрать первую запись из accdata, которая совпадет с var_dateold
и выдать в var_dateold_not_exist или найденную дату, или null
for x in (SELECT null FROM t_accdata where fdate=var_dateold) loop
  var_dateold_not_exist := var_dateold;
end loop;
Elic
Дата: 23.09.2004 12:16:28
for x in (SELECT null FROM t_accdata where fdate=var_dateold) loop
  var_dateold_not_exist := var_dateold;
  exit;
end loop;