Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 как избежать PLW-07204?  [new]
dkflbvbh
Member

Откуда:
Сообщений: 146
Добрый день.
Для отсечения времени использую функцию TRUNC, но при компиляции пакета вываливаются сообщения
Warning(11,11): PLW-07204: результатом преобразования к типу, отличному от типа столбца, может стать субоптимальный план очереди

Какое то время их просто игнорировал, пока покам совсем не заел длинный список. Подскажите как избавиться?



CREATE TABLE "TEST"
( "COLUMN1" DATE
)
/
create or replace
PACKAGE "TST_PKG" AS
PROCEDURE Test1;
END TST_PKG;
/

create or replace PACKAGE BODY "TST_PKG" AS
procedure Test1 As
v_result test.column1%TYPE;
BEGIN
select column1
into v_result
from test
where trunc(column1) = trunc(current_date)
and rownum = 1;
END;
END TST_PKG;
/
1 окт 07, 13:50    [4738258]     Ответить | Цитировать Сообщить модератору
 Re: как избежать PLW-07204?  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
dkflbvbh
Добрый день.
Для отсечения времени использую функцию TRUNC, но при компиляции пакета вываливаются сообщения
Warning(11,11):
PLW-07204: результатом преобразования к типу, отличному от типа столбца, может стать субоптимальный план очереди

Какое то время их просто игнорировал, пока покам совсем не заел длинный список. Подскажите как избавиться?
CREATE TABLE "TEST" 
   (	"COLUMN1" DATE
   )
/
create or replace
PACKAGE      "TST_PKG" AS
  PROCEDURE Test1;
END TST_PKG;
/
 
create or replace PACKAGE BODY      "TST_PKG" AS
   procedure Test1 As
   v_result test.column1%TYPE;
  BEGIN
    select column1
    into v_result
    from test
    where trunc(column1) = trunc(current_date)
      and rownum = 1;
  END;
END TST_PKG;
/

PLW-07204: conversion away from column type may result in sub-optimal query plan
Cause: The column type and the bind type do not exactly match. This may result
in the column being converted to the type of the bind variable. This type
conversion may prevent the SQL optimizer from using any index the column
participates in. This may adversely affect the execution performance of this
statement.
Action: To make use of any index for this column, make sure the bind type is the
same type as the column type.

Oracle
CURRENT_DATE

Purpose
CURRENT_DATE returns the current date in the session time zone, in a value in the
Gregorian calendar of datatype DATE.

Examples
The following example illustrates that CURRENT_DATE is sensitive to the session time
zone:
ALTER SESSION SET TIME_ZONE = '-5:0';
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';
SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;

SESSIONTIMEZONE CURRENT_DATE
--------------- --------------------
-05:00 29-MAY-2000 13:14:03
ALTER SESSION SET TIME_ZONE = '-8:0';

SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;

SESSIONTIMEZONE CURRENT_DATE
--------------- --------------------
-08:00 29-MAY-2000 10:14:33

Вы уверены, что вам нужна именно CURRENT_DATE и накак не годится SYSDATE?

P.S. При оформлении кода используйте, пожалуйста, тег SRC данного форума.
Этим вы повысите свои шансы на получение ответа.
1 окт 07, 14:44    [4738799]     Ответить | Цитировать Сообщить модератору
 Re: как избежать PLW-07204?  [new]
dkflbvbh
Member

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

procedure Test1 As
v_result test.column1%TYPE;
BEGIN
select column1
into v_result
from test
where trunc(column1) = to_date('01.01.2007','DD.MM.YYYY')
and rownum = 1;
END;


Все равно пишет варнинги.
2 окт 07, 11:10    [4742238]     Ответить | Цитировать Сообщить модератору
 Re: как избежать PLW-07204?  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
dkflbvbh
Все таки не понял причем здесь региональные настройки.
Вот если например напишу так

  procedure Test1 As
   v_result test.column1%TYPE;
  BEGIN
    select column1
    into v_result
    from test
    where trunc(column1) = to_date('01.01.2007','DD.MM.YYYY')
      and rownum = 1;
  END;

Все равно пишет варнинги.


При оформлении кода используйте, пожалуйста, тег SRC данного форума.
Этим вы повысите свои шансы на получение ответа.
2 окт 07, 11:12    [4742245]     Ответить | Цитировать Сообщить модератору
 Re: как избежать PLW-07204?  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Приведите листинг SQL*Plus c "варнингами".
2 окт 07, 11:13    [4742262]     Ответить | Цитировать Сообщить модератору
 Re: как избежать PLW-07204?  [new]
dkflbvbh
Member

Откуда:
Сообщений: 146
Для SQLPlus

CREATE TABLE "TEST"
( "COLUMN1" DATE
)
/
create or replace PACKAGE "TST_PKG" AS
  PROCEDURE Test1;
END TST_PKG;
/

create or replace PACKAGE BODY "TST_PKG" AS
  procedure Test1 As
    v_result test.column1%TYPE;
  BEGIN
    select column1
    into v_result
    from test
    where trunc(column1) = to_date('01.01.2007','DD.MM.YYYY')
    and rownum = 1;
  END;
END TST_PKG;
/


show errors package body tst_pkg;
2 окт 07, 11:38    [4742481]     Ответить | Цитировать Сообщить модератору
 Re: как избежать PLW-07204?  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
И че?
2 окт 07, 11:39    [4742499]     Ответить | Цитировать Сообщить модератору
 Re: как избежать PLW-07204?  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Вы привели скрипт для SQL*Plus, а я вас просил привести его листинг!

листинг - это протокол выполнения
листинг SQL*Plus - это протокол выполнения SQL*Plus
листинг SQL*Plus c "варнингами" - это протокол выполнения SQL*Plus с warnings

Где протокол SQL*Plus c "варнингами"?
2 окт 07, 11:43    [4742524]     Ответить | Цитировать Сообщить модератору
 Re: как избежать PLW-07204?  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production

SQL> CREATE TABLE "TEST"
  2  ( "COLUMN1" DATE
  3  )
  4  /
Table created.

SQL> create or replace PACKAGE "TST_PKG" AS
  2    PROCEDURE Test1;
  3  END TST_PKG;
  4  /
Package created.

SQL> create or replace PACKAGE BODY "TST_PKG" AS
  2    procedure Test1 As
  3      v_result test.column1%TYPE;
  4    BEGIN
  5      select column1
  6      into v_result
  7      from test
  8      where trunc(column1) = to_date('01.01.2007','DD.MM.YYYY')
  9      and rownum = 1;
 10    END;
 11  END TST_PKG;
 12  /
Package body created.

SQL> show errors package body tst_pkg;
No errors.
Никаких "варнингов" не обнаружено.
2 окт 07, 11:46    [4742545]     Ответить | Цитировать Сообщить модератору
 Re: как избежать PLW-07204?  [new]
dkflbvbh
Member

Откуда:
Сообщений: 146
SQL> show errors package body tst_pkg;
Errors for PACKAGE BODY TST_PKG:

LINE/COL ERROR
-------- -----------------------------------------------------------------
8/11     PLW-07204: conversion away from column type may result in
         sub-optimal query plan

8/17     PLW-07204: conversion away from column type may result in
         sub-optimal query plan

8/28     PLW-07204: conversion away from column type may result in
         sub-optimal query plan

8/49     PLW-07204: conversion away from column type may result in
         sub-optimal query plan

LINE/COL ERROR
-------- -----------------------------------------------------------------

SQL>
2 окт 07, 11:46    [4742551]     Ответить | Цитировать Сообщить модератору
 Re: как избежать PLW-07204?  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116275
SQL*Plus

Никаких "варнингов" не обнаружено.


А с директивой

 ALTER SESSION SET PLSQL_WARNINGS = 'ENABLE:ALL'
?
2 окт 07, 11:49    [4742571]     Ответить | Цитировать Сообщить модератору
 Re: как избежать PLW-07204?  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
dmidek
SQL*Plus
Никаких "варнингов" не обнаружено.
А с директивой
 ALTER SESSION SET PLSQL_WARNINGS = 'ENABLE:ALL'
?
С такой директивой "варнинги" имеются.
2 окт 07, 11:55    [4742620]     Ответить | Цитировать Сообщить модератору
 Re: как избежать PLW-07204?  [new]
dkflbvbh
Member

Откуда:
Сообщений: 146
Эта штука проявляется на
Oracle Database 10g Express Edition Release 10.2.0.1.0
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0
2 окт 07, 12:10    [4742795]     Ответить | Цитировать Сообщить модератору
 Re: как избежать PLW-07204?  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116275
Да уж, не знаю , справедлив ли Oracle, но то , что строг - это точно

Вот какой вариант не выдал предупреждений.

Даже прибавить к дате единицу "спокойно" не вышло :-)

SQL> create or replace PACKAGE BODY "TST_PKG" AS
  2    procedure Test1 As
  3      v_result test.column1%TYPE;
  4      v_const DATE := to_date('31.12.2006','DD.MM.YYYY');
  5      v_const_2 DATE := to_date('02.01.2007','DD.MM.YYYY');
  6    BEGIN
  7      select column1
  8      into v_result
  9      from test
 10      where column1 between v_const and v_const_2
 11      and rownum = 1;
 12    END;
 13  END TST_PKG;
 14  /

Package body created.

SQL>

P.S. Вариант не рекомендуется к замене :-)
2 окт 07, 12:11    [4742807]     Ответить | Цитировать Сообщить модератору
 Re: как избежать PLW-07204?  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116275
dmidek
Да уж, не знаю , справедлив ли Oracle, но то , что строг - это точно

Вот какой вариант не выдал предупреждений.

Даже прибавить к дате единицу "спокойно" не вышло :-)

SQL> create or replace PACKAGE BODY "TST_PKG" AS
  2    procedure Test1 As
  3      v_result test.column1%TYPE;
  4      v_const DATE := to_date('31.12.2006','DD.MM.YYYY');
  5      v_const_2 DATE := to_date('02.01.2007','DD.MM.YYYY');
  6    BEGIN
  7      select column1
  8      into v_result
  9      from test
 10      where column1 between v_const and v_const_2
 11      and rownum = 1;
 12    END;
 13  END TST_PKG;
 14  /

Package body created.

SQL>

P.S. Вариант не рекомендуется к замене :-)


Тьфу ты ! Какой BETWEEN ? :-) Сорри

SQL> create or replace PACKAGE BODY "TST_PKG" AS
  2    procedure Test1 As
  3      v_result test.column1%TYPE;
  4      v_const DATE := to_date('31.12.2006','DD.MM.YYYY');
  5      v_const_2 DATE := to_date('02.01.2007','DD.MM.YYYY');
  6    BEGIN
  7      select column1
  8      into v_result
  9      from test
 10      where column1 > v_const and column1 < v_const_2
 11      and rownum = 1;
 12    END;
 13  END TST_PKG;
 14  /

Package body created.

SQL>
2 окт 07, 12:14    [4742831]     Ответить | Цитировать Сообщить модератору
 Re: как избежать PLW-07204?  [new]
dkflbvbh
Member

Откуда:
Сообщений: 146
В случае
4 v_const DATE := to_date('31.12.2006','DD.MM.YYYY');
5 v_const_2 DATE := to_date('02.01.2007','DD.MM.YYYY');

Компилятор знает что за переменные и какое значение. А в моем примере он почему то не знает что и как потому и ругается.
2 окт 07, 12:47    [4743057]     Ответить | Цитировать Сообщить модератору
 Re: как избежать PLW-07204?  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116275
Ну так у Вас по тем же лекалам ...

SQL> create or replace PACKAGE BODY "TST_PKG" AS
  2  procedure Test1 As
  3  v_result test.column1%TYPE;
  4  v_const DATE := trunc(current_date) - 1;
  5  v_const_2 DATE := trunc(current_date) + 1;
  6  BEGIN
  7  select column1
into v_result
  8    9  from test
 10  where column1 > v_const and column1 < v_const_2
 11  and rownum = 1;
 12  END;
 13  END TST_PKG;
 14  /

Package body created.

SQL>

Но честно говоря, все эти телодвижения были больше из спортивного интереса.

ИМХО игнорируйте эти предупреждения ...
2 окт 07, 12:55    [4743108]     Ответить | Цитировать Сообщить модератору
 Re: как избежать PLW-07204?  [new]
dkflbvbh
Member

Откуда:
Сообщений: 146
А если так?
create or replace
PACKAGE BODY "TST_PKG" AS
  procedure Test1 (p_date date) As
    v_result test.column1%TYPE;
  BEGIN
    select column1
    into v_result
    from test
    where trunc(column1) = p_date
    and rownum = 1;
  END;
END TST_PKG;

В самом начале писал что долгое время их игнорировал, пока список не перевалил за n+1 и перестално видно других подсказок.
2 окт 07, 13:05    [4743183]     Ответить | Цитировать Сообщить модератору
 Re: как избежать PLW-07204?  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116275
dmidek
Ну так у Вас по тем же лекалам ...

SQL> create or replace PACKAGE BODY "TST_PKG" AS
  2  procedure Test1 As
  3  v_result test.column1%TYPE;
  4  v_const DATE := trunc(current_date) - 1;
  5  v_const_2 DATE := trunc(current_date) + 1;
  6  BEGIN
  7  select column1
into v_result
  8    9  from test
 10  where column1 > v_const and column1 < v_const_2
 11  and rownum = 1;
 12  END;
 13  END TST_PKG;
 14  /

Package body created.

SQL>

Но честно говоря, все эти телодвижения были больше из спортивного интереса.

ИМХО игнорируйте эти предупреждения ...


Сорри, опять с логикой начудил :-)

SQL> create or replace PACKAGE BODY "TST_PKG" AS
  2  procedure Test1 As
  3  v_result test.column1%TYPE;
  4  v_const DATE := trunc(current_date);
  5  v_const_2 DATE := trunc(current_date) + 1 - 1/(24*60*60);
  6  BEGIN
  7  select column1
  8  into v_result
  9  from test
where column1 BETWEEN v_const and v_const_2
 10   11  and rownum = 1;
 12  END;
 13  END TST_PKG;
 14  /

Package body created.

SQL>
2 окт 07, 13:08    [4743206]     Ответить | Цитировать Сообщить модератору
 Re: как избежать PLW-07204?  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116275
dkflbvbh
А если так?
create or replace
PACKAGE BODY "TST_PKG" AS
  procedure Test1 (p_date date) As
    v_result test.column1%TYPE;
  BEGIN
    select column1
    into v_result
    from test
    where trunc(column1) = p_date
    and rownum = 1;
  END;
END TST_PKG;

В самом начале писал что долгое время их игнорировал, пока список не перевалил за n+1 и перестално видно других подсказок.


Похоже, у Вас p_date не содержит временнОй компоненты ?

SQL> create or replace
  2  PACKAGE BODY "TST_PKG" AS
  3    procedure Test1 (p_date date) As
  4      v_result test.column1%TYPE;
  5      v_date_to DATE := p_date + 1 - 1/(24*60*60);
  6    BEGIN
  7      select column1
  8      into v_result
  9      from test
 10      where column1 between p_date and v_date_to
 11      and rownum = 1;
 12    END;
 13  END TST_PKG;
 14  /

Package body created.

SQL>

Но мой совет все же в силе :-)
2 окт 07, 13:12    [4743248]     Ответить | Цитировать Сообщить модератору
 Re: как избежать PLW-07204?  [new]
dkflbvbh
Member

Откуда:
Сообщений: 146
Может еще чего не допонял но вот пример показывает что время получается в диапазоне
с 02.10.2007 14:09 по 03.10.2007 14:09
а мне нужна проверка на равесво 02.10.2007 00:00
SQL> edit
Wrote file afiedt.buf

  1  select to_char(sysdate,'DD.MM.YYYY HH24:MI') f1,
  2     to_char(sysdate+ 1 - 1/(24*60*60),'DD.MM.YYYY HH24:MI') f2
  3*  from dual
SQL> /

F1               F2
---------------- ----------------
02.10.2007 14:09 03.10.2007 14:09

SQL>
2 окт 07, 13:57    [4743704]     Ответить | Цитировать Сообщить модератору
 Re: как избежать PLW-07204?  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116275
dkflbvbh
Может еще чего не допонял но вот пример показывает что время получается в диапазоне
с 02.10.2007 14:09 по 03.10.2007 14:09
а мне нужна проверка на равесво 02.10.2007 00:00
SQL> edit
Wrote file afiedt.buf

  1  select to_char(sysdate,'DD.MM.YYYY HH24:MI') f1,
  2     to_char(sysdate+ 1 - 1/(24*60*60),'DD.MM.YYYY HH24:MI') f2
  3*  from dual
SQL> /

F1               F2
---------------- ----------------
02.10.2007 14:09 03.10.2007 14:09

SQL>


А у Вас p_date в каком виде поступает в процедуру ?
Исходя из этого

where trunc(column1) = p_date

я думал, что там дата + время 00:00:00.

Но если у Вас все же поступает дата со временем , то явно задавайте
обе границы в секции DECLARE

DECLARE
      v_date_from DATE := trunc(p_date); 
      v_date_to DATE := trunc(p_date) + 1 - 1/(24*60*60);
      ....


и дальше проверяйте их по BETWEEN
2 окт 07, 14:04    [4743774]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить