ORA-01722: invalid number и динамический СКУЛЬ

ditbunau
Дата: 08.08.2005 15:49:29
Оракл 8.1.7, Win 2000

Есть табличка, которая формируется каждый день и имя у неё TDDMMYYYY,
соответственно, чтобы из неё что-то выбрать, нужен динамический SQL.

-- Create table
create table T13072005
(
  EVENT   VARCHAR2(3),
  Z_TIME  DATE,
  TUR     NUMBER,
  PR_CODE VARCHAR2(100),
  ID_P    NUMBER
)


Мне нужно выбрать данные, где z_time больше 2х часов ночи. Пишу в процедуре:

create or replace procedure FILL_EVENTS_BUFFER( DATE_TO_LOAD in VARCHAR2 DEFAULT TO_CHAR(SYSDATE,'DDMMYYYY')) is

select_cursor          INTEGER := DBMS_SQL.OPEN_CURSOR; 
exec_select1          INTEGER;  

load_date               DATE;
table1                    VARCHAR2(10);       
id                          NUMBER;

event_code             VARCHAR2(3);
PASS_CODE             VARCHAR2(20);
ID_TURN                 NUMBER;
TIME_OF_EVENT       DATE;

begin

    load_date:=TO_DATE(date_to_load||' '||'02:00','ddmmyyyy hh24:mi');

-- Название таблицы
   
       table1:='T'||DATE_TO_LOAD;

-- Выбираем данные поле двух часов ночи
 
      DBMS_SQL.PARSE(select_cursor,
      'select event,z_time,tur,pr_code,id_p from ADMIN.'||table1||' 
       where TO_CHAR(z_time,''hh24:mi'')>''02:00''',DBMS_SQL.NATIVE);
      
       DBMS_SQL.DEFINE_COLUMN (select_cursor, 1, event_code,1);
       DBMS_SQL.DEFINE_COLUMN (select_cursor, 2, time_of_event);
       DBMS_SQL.DEFINE_COLUMN (select_cursor, 3, pass_code,16);    
       DBMS_SQL.DEFINE_COLUMN (select_cursor,4,id);


        exec_select1 := DBMS_SQL.EXECUTE (select_cursor);  
        
        LOOP
            EXIT WHEN DBMS_SQL.FETCH_ROWS (select_cursor) = 0;                
        

            DBMS_SQL.COLUMN_VALUE (select_cursor, 1, event_code);
            DBMS_SQL.COLUMN_VALUE (select_cursor, 2, time_of_event);
            DBMS_SQL.COLUMN_VALUE (select_cursor, 3, pass_code);
            DBMS_SQL.COLUMN_VALUE (select_cursor,4,id);
            
        dbms_output.put_line(id||' '||event_code||' '||time_of_event||' '||pass_code);
        
        
        END LOOP;        
   
    DBMS_SQL.CLOSE_CURSOR (select_cursor);
    
end FILL_EVENTS_BUFFER;


Ругается при выполнении
ORA-01722: invalid number, хотя в SQL*PLUS запрос без проблем работает.
Что-же не так?
SY
Дата: 08.08.2005 17:12:30
Your statement has 5 items in select list while you are using 4 DBMS_SQL.DEFINE_COLUMN. And

DBMS_SQL.DEFINE_COLUMN (select_cursor,4,id);

creates association between PR_CODE, which is VARCHAR2 and ID which is NUMBER. When PR_CODE can not be converted to number, you will get ORA-01722.

SY.
ditbunau
Дата: 08.08.2005 17:22:23
SY
Your statement has 5 items in select list while you are using 4 DBMS_SQL.DEFINE_COLUMN. And

DBMS_SQL.DEFINE_COLUMN (select_cursor,4,id);

creates association between PR_CODE, which is VARCHAR2 and ID which is NUMBER. When PR_CODE can not be converted to number, you will get ORA-01722.

SY.

Спасибо большое!
Проглядел!
softwarer
Дата: 08.08.2005 17:26:02
ditbunau
Есть табличка, которая формируется каждый день и имя у неё TDDMMYYYY,

Хм. А не пробовали вправить мозги автору такой таблички? Или у Вас SE?

ditbunau
соответственно, чтобы из неё что-то выбрать, нужен динамический SQL.

Это одно из следствий такого решения.

ditbunau
create or replace procedure FILL_EVENTS_BUFFER( DATE_TO_LOAD in VARCHAR2 DEFAULT TO_CHAR(SYSDATE,'DDMMYYYY')) is

Хм. А передавать параметр как дату противоречит..... ?

ditbunau

load_date:=TO_DATE(date_to_load||' '||'02:00','ddmmyyyy hh24:mi');

Хм. Вот и думаем, нахрена передавать дату как VARCHAR. Заодно отмечаем, что это значение дальше не используется.

ditbunau

where TO_CHAR(z_time,''hh24:mi'')>''02:00''',DBMS_SQL.NATIVE);

Хм. Мсье знает толк в извращениях. А не проще ли сравнивать даты как даты?

ditbunau
Ругается при выполнении
ORA-01722: invalid number, хотя в SQL*PLUS запрос без проблем работает.
Что-же не так?

Для начала - на какой именно строке процедуры ругается? На каком значении?

Ставьте отладочную печать и смотрите. Хотя в любом случае этому коду не помешает коренная переделка.