Потеря десятичных знаков при использовании Oracle SDO_POINT в представлении

У нас есть таблица, содержащая, среди прочего, координаты. Раньше мы хранили их в двух числовых полях (x и y), но теперь заменили их полем SDO_GEOMETRY. Для обратной совместимости мы создали представление (с тем же именем, что и у таблицы), где мы делаем:

создать или заменить представление meas_pnt как select ..., m.position.SDO_POINT.X x_coordinate, m.position.SDO_POINT.Y y_coordinate из meas_pnt_tab m;

Это работает как для чтения, так и для записи, но при записи десятичных чисел в представление десятичные числа теряются. Я не могу понять, почему. Кто-нибудь может помочь? Следующее иллюстрирует проблему:

обновить meas_pnt_tab m установить m.position.SDO_POINT.x = 2.3, где meas_key=1; выберите m.position.SDO_POINT.X из meas_pnt_tab m, где meas_key=1; -> х равно 2,3. Хороший!

обновить meas_pnt, установить x_coordinate = 2,3, где meas_key=1; выберите m.position.SDO_POINT.X из meas_pnt_tab m, где meas_key=1; -> х равно 2.


person Tor Hovland    schedule 05.08.2009    source источник


Ответы (1)


Я не могу воспроизвести вашу ошибку. Вот что я получаю:

SQL> CREATE TABLE meas_pnt_tab (position sdo_point_type, meas_key NUMBER);

Table created
SQL> INSERT INTO meas_pnt_tab (position, meas_key) 
  2  VALUES (sdo_point_type(2.3,0,0), 1);

1 row inserted
SQL> SELECT m.position.X FROM meas_pnt_tab m WHERE meas_key=1;

POSITION.X
----------
       2,3
SQL> CREATE OR REPLACE VIEW meas_pnt AS
  2  SELECT m.position.X x_coordinate,
  3         m.position.Y y_coordinate,
  4         m.meas_key
  5    FROM meas_pnt_tab m;

View created
SQL> UPDATE meas_pnt SET x_coordinate = 2.4 WHERE meas_key=1;

1 row updated
SQL> SELECT m.position.X FROM meas_pnt_tab m WHERE meas_key=1;

POSITION.X
----------
       2,4

Можете ли вы опубликовать свои операторы CREATE?

person Vincent Malgrat    schedule 05.08.2009
comment
Спасибо, Винсент. Я попробовал ваши утверждения, и они действительно работают и для меня. Мне придется исследовать, что мы делаем по-другому. - person Tor Hovland; 06.08.2009
comment
Я думал, что трансформация полностью выполняется самим представлением, но у нас был триггер вместо обновления для представления, который делал некоторые вещи. И он использовал целые переменные внутри. Вот почему десятичные дроби были усечены. Но спасибо, пока вы не ответили, я думал, что с типом данных SDO_POINT происходит что-то странное. - person Tor Hovland; 06.08.2009