Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Select - Динамичное переоброзование даты  [new]
flashmaster2008
Member

Откуда:
Сообщений: 14
Здраствуйте Ребята !
Я работаю на PL\SQL, У меня такаая проблема есть такой запросик легкий

select to_char(sysdate,'MMYYYY') from dual


select * from (select 'calls_00_'||to_char(sysdate,'MMYYYY') as calls from dual)


select * from calls_00_032008

проблема в чем при каждой открытие файла (запроса) должно меняться данная строка select * from calls_00_032008 чтобы переоброзовался динамично в текущий месяц. Например select * from calls_00_032008 на select * from calls_00_042008

Сама таблица каждый месяц сформируется на текущий месяц
18 мар 08, 08:04    [5421890]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
==Tims==
Member [заблокирован]

Откуда: Гена Евтушенко
Сообщений: 343
select * from table(fn('calls_00_'||to_char(sysdate,'MMYYYY')));
где fn-табличная функция, в которой есть d-sql
18 мар 08, 08:17    [5421911]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
flashmaster2008
Member

Откуда:
Сообщений: 14
Без понятия, Я сам новичок
18 мар 08, 08:21    [5421918]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
не понял
Member

Откуда:
Сообщений: 5
Наветное это был не вопрос, а ответ.
18 мар 08, 09:06    [5422011]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
flashmaster2008
Member

Откуда:
Сообщений: 14
Нет вы меня не поняли, хочу что бы на PL\SQL при открытие запроса сама динамично изменяла текушего дату. и потом при нажатие кнопу Run она выполнялось. Суть этого вопроса в чем что бы не меняли дату ручном образе
18 мар 08, 09:14    [5422024]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
Alex Shibaev
Member

Откуда:
Сообщений: 1
А взять SYSDATE например?
18 мар 08, 09:26    [5422045]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
flashmaster2008
хочу что бы на PL\SQL <skipped> и потом при нажатие кнопу Run
У PLSQL нет кнопки Run :)
Также как этого:
flashmaster2008
каждой открытие файла
:)

Как Вырезать из sysdate Вам показали, а все остальное зависит от того, где Вы все пытаетесь выполнять.
18 мар 08, 10:00    [5422169]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
Наивый людь
Guest
Рефкурсор для работы, селект формировать динамически,
типа
str:='select * from calls_00_'||to_char(sysdate,'MMYYYY');
Насколько я помню, там засада будет только с разбором строки по столбцам, надо чтобы структура таблички была фиксирована по типам.
18 мар 08, 10:03    [5422186]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
flashmaster2008
Member

Откуда:
Сообщений: 14
Jannny
flashmaster2008
хочу что бы на PL\SQL <skipped> и потом при нажатие кнопу Run
У PLSQL нет кнопки Run :)
Также как этого:
flashmaster2008
каждой открытие файла
:)

Как Вырезать из sysdate Вам показали, а все остальное зависит от того, где Вы все пытаетесь выполнять.


Нет Вы не поняли при открытие запроса в строке кода select * from calls_00_032008 должно изменится строка calls_00_032008 для примера calls_00_042008 по очередно, по месяцам, сылаяась на функцию select to_char(sysdate,'MMYYYY') from dual
18 мар 08, 11:44    [5422847]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
flashmaster2008
Нет Вы не поняли при открытие запроса в строке кода select * from calls_00_032008 должно изменится строка calls_00_032008 для примера calls_00_042008 по очередно, по месяцам, сылаяась на функцию select to_char(sysdate,'MMYYYY') from dual
"Да как же тебя понять, если ты ничего не говоришь?"(с)

:) Вы хотите писать Ораклу - открой таблицу 1 и хотите, чтобы открылась таблица 2? Да запросто, пересоздавайте каждый месяц вьюху с указанием на конкретную таблицу. Вот только сомневаюсь, что Вы хотите именно этого :)
18 мар 08, 11:56    [5422924]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
flashmaster2008
Member

Откуда:
Сообщений: 14
Jannny
flashmaster2008
Нет Вы не поняли при открытие запроса в строке кода select * from calls_00_032008 должно изменится строка calls_00_032008 для примера calls_00_042008 по очередно, по месяцам, сылаяась на функцию select to_char(sysdate,'MMYYYY') from dual
"Да как же тебя понять, если ты ничего не говоришь?"(с)

:) Вы хотите писать Ораклу - открой таблицу 1 и хотите, чтобы открылась таблица 2? Да запросто, пересоздавайте каждый месяц вьюху с указанием на конкретную таблицу. Вот только сомневаюсь, что Вы хотите именно этого :)


Да это не так, у нас структура база инная, каждый месяц создаеться таблица calls_00_ например на следующий месяц calls_00_042008, и я хочу при открытие запроса менялся строка calls_00_ - на текущий месяц
18 мар 08, 12:03    [5422982]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Ну и меняйте. Трабл-то Ваш в чем?
18 мар 08, 12:08    [5423032]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
Дизайн данных дурацкий, но если ничего нельзя сделать, используй Dynamic SQL
18 мар 08, 12:10    [5423049]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
flashmaster2008
Member

Откуда:
Сообщений: 14
tru55
Дизайн данных дурацкий, но если ничего нельзя сделать, используй Dynamic SQL


А вы новичку не покажите скрипт на Dynamic SQL как это будет выглядит
18 мар 08, 12:23    [5423145]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
шуршунчик
Guest
Маленький примерчик динамического sql.
Вот так можно сделать для получения одного значения:

declare
  v_date date;
  v_table_name varchar(100);
  v_query varchar(100);
begin
  select 'calls_00_'||to_char(sysdate,'MMYYYY') into v_table_name from dual;
  --dbms_output.PUT_LINE(v_table_name);
  v_query := 'begin select sysdate into :variable from ' || v_table_name || 'where rownum = 1; end;';
  execute immediate v_query using out v_date;
  dbms_output.PUT_LINE(v_date);
end;

для получения всех данных, как говорил Наивый людь, нужно использовать курсор.
18 мар 08, 13:59    [5423949]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
Kromka
Member

Откуда:
Сообщений: 67
Автор желает, чтобы в приложении типа PL/SQL Developer, при открытии файла с текстом запроса, автоматически менялась строка calls_00_042008 на calls_00_052008 ???
18 мар 08, 14:02    [5423973]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
flashmaster2008
Member

Откуда:
Сообщений: 14
Kromka
Автор желает, чтобы в приложении типа PL/SQL Developer, при открытии файла с текстом запроса, автоматически менялась строка calls_00_042008 на calls_00_052008 ???


Угадали !
18 мар 08, 14:43    [5424302]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
flashmaster2008
Угадали !
Понадобилось всего шесть часов, чтобы форумчане смогли угадать суть вопроса. А ведь можно было задать вопрос еще мудренее, чтобы неделю думали.
18 мар 08, 15:27    [5424680]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
==Tims==
Member [заблокирован]

Откуда: Гена Евтушенко
Сообщений: 343
я бы на вашем месте написал небольшую программку на turbo pascal'e чтобы она в нужных файлах меняла названия таблиц. и засунул бы эту программу в autoexec.bat
18 мар 08, 15:32    [5424713]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
Kromka
Member

Откуда:
Сообщений: 67
==Tims== - правильно глаголешь!
автору надо просто получать каждый день новую переменную, дажі подставлять её в запрос - налицо правка файлов
или сгенерить такую тучу файлов за раз?
18 мар 08, 16:23    [5425192]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
flashmaster2008
Member

Откуда:
Сообщений: 14
шуршунчик
Маленький примерчик динамического sql.
Вот так можно сделать для получения одного значения:

declare
  v_date date;
  v_table_name varchar(100);
  v_query varchar(100);
begin
  select 'calls_00_'||to_char(sysdate,'MMYYYY') into v_table_name from dual;
  --dbms_output.PUT_LINE(v_table_name);
  v_query := 'begin select sysdate into :variable from ' || v_table_name || 'where rownum = 1; end;';
  execute immediate v_query using out v_date;
  dbms_output.PUT_LINE(v_date);
end;

для получения всех данных, как говорил Наивый людь, нужно использовать курсор.


Написали скрипт как использовать его:

Как этот скрипт использовать, поставил, запустил без ошибок, и открываю свой запрос, все равно та страка не изменился calls_00_032008

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

CREATE OR REPLACE PROCEDURE copy (
source IN VARCHAR2,
destination IN VARCHAR2) IS
id_var NUMBER;
name_var VARCHAR2(30);
birthdate_var DATE;
source_cursor INTEGER;
destination_cursor INTEGER;
ignore INTEGER;
BEGIN

-- Prepare a cursor to select from the source table:
source_cursor := dbms_sql.open_cursor;
DBMS_SQL.PARSE(source_cursor,
'SELECT id, name, birthdate FROM ' || source,
DBMS_SQL.NATIVE);
DBMS_SQL.DEFINE_COLUMN(source_cursor, 1, id_var);
DBMS_SQL.DEFINE_COLUMN(source_cursor, 2, name_var, 30);
DBMS_SQL.DEFINE_COLUMN(source_cursor, 3, birthdate_var);
ignore := DBMS_SQL.EXECUTE(source_cursor);

-- Prepare a cursor to insert into the destination table:
destination_cursor := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(destination_cursor,
'INSERT INTO ' || destination ||
' VALUES (:id_bind, :name_bind, :birthdate_bind)',
DBMS_SQL.NATIVE);

-- Fetch a row from the source table and insert it into the destination table:
LOOP
IF DBMS_SQL.FETCH_ROWS(source_cursor)>0 THEN
-- get column values of the row
DBMS_SQL.COLUMN_VALUE(source_cursor, 1, id_var);
DBMS_SQL.COLUMN_VALUE(source_cursor, 2, name_var);
DBMS_SQL.COLUMN_VALUE(source_cursor, 3, birthdate_var);

-- Bind the row into the cursor that inserts into the destination table. You
-- could alter this example to require the use of dynamic SQL by inserting an
-- if condition before the bind.
DBMS_SQL.BIND_VARIABLE(destination_cursor, ':id_bind', id_var);
DBMS_SQL.BIND_VARIABLE(destination_cursor, ':name_bind', name_var);
DBMS_SQL.BIND_VARIABLE(destination_cursor, ':birthdate_bind',
birthdate_var);
ignore := DBMS_SQL.EXECUTE(destination_cursor);
ELSE

-- No more rows to copy:
EXIT;
END IF;
END LOOP;

-- Commit and close all cursors:
COMMIT;
DBMS_SQL.CLOSE_CURSOR(source_cursor);
DBMS_SQL.CLOSE_CURSOR(destination_cursor);
EXCEPTION
WHEN OTHERS THEN
IF DBMS_SQL.IS_OPEN(source_cursor) THEN
DBMS_SQL.CLOSE_CURSOR(source_cursor);
END IF;
IF DBMS_SQL.IS_OPEN(destination_cursor) THEN
DBMS_SQL.CLOSE_CURSOR(destination_cursor);
END IF;
RAISE;
END;
19 мар 08, 07:49    [5427653]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
==Tims==
Member [заблокирован]

Откуда: Гена Евтушенко
Сообщений: 343
Ох...е....
19 мар 08, 08:36    [5427720]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
gergo
Member

Откуда:
Сообщений: 224
Ну если свести все таблицы в одну нельзя то может хотябы сделать view вида

create view calls_00 (...) as (
select to_date('032008','mmyyyy') dt, bla-blabla from calls_00_032008
union all
select to_date('042008','mmyyyy') dt, bla-blabla from calls_00_042008
union all
select to_date('052008','mmyyyy') dt, bla-blabla from calls_00_052008

....
)
А затем
select * from calls_00 where dt = нужный месяц?

PS:Ногами не бейте :)
19 мар 08, 08:54    [5427759]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
flashmaster2008
Member

Откуда:
Сообщений: 14
gergo
Ну если свести все таблицы в одну нельзя то может хотябы сделать view вида

create view calls_00 (...) as (
select to_date('032008','mmyyyy') dt, bla-blabla from calls_00_032008
union all
select to_date('042008','mmyyyy') dt, bla-blabla from calls_00_042008
union all
select to_date('052008','mmyyyy') dt, bla-blabla from calls_00_052008

....
)
А затем
select * from calls_00 where dt = нужный месяц?

PS:Ногами не бейте :)


У меня ошибка вышла ОRA 00904 (...) ошибка вот в этом, а то указать в место (...)
19 мар 08, 09:43    [5427936]     Ответить | Цитировать Сообщить модератору
 Re: Select - Динамичное переоброзование даты  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
flashmaster2008
gergo
select to_date('032008','mmyyyy') dt, bla-blabla from
У меня ошибка вышла ОRA 00904 (...) ошибка вот в этом, а то указать в место (...)
Вероятно столбца bla-blabla в Вашей таблице все-таки нет
19 мар 08, 09:55    [5427994]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить