Oracle Cast и MULTISET доступны в POSTGRES

Я работаю над запросом для создания xml из базы данных оракула.

где "столбец" - это тип

CREATE OR REPLACE TYPE "column" AS OBJECT
                  ("coulmnname" VARCHAR2 (30), "datatype" VARCHAR2 (30))

и col_list_t имеет тип

CREATE OR REPLACE TYPE col_list_t AS TABLE OF "column"

и

  SELECT CAST (
                      MULTISET (
                           SELECT "column" (B.COLUMN_NAME, B.DATA_TYPE)
                             FROM all_tab_columns b, all_tables c ,all_tables a
                            WHERE     b.TABLE_NAME = a.TABLE_NAME
                                  AND b.table_name = c.TABLE_NAME
                                  AND B.OWNER = C.OWNER
                                  AND c.OWNER = USER)AS col_list_t)  from dual 

и проблема в том, что это должно быть преобразовано в postgres, поскольку CAST и MULTISET недоступны в postgres, поэтому есть ли способ сделать это в синтаксисе postgres


person SarthAk    schedule 20.11.2014    source источник
comment
cast(...) есть в Postgres, а multiset — нет. Если вы генерируете XML, смотрели ли вы на различные XML-функции в Postgres?   -  person a_horse_with_no_name    schedule 02.12.2014


Ответы (1)


К сожалению, PostgreSQL на самом деле не поддерживает стандартный SQL-оператор MULTISET и вообще вложенные наборы. Вы можете создать ARRAY из ROW типов следующим образом:

select array[row(1, 2), row(3, 4)]

И вы могли бы даже удалить вышеуказанный массив

select * from unnest(array[row(1, 2), row(3, 4)]) t(a int, b int)

Итак, если ARRAY из ROW для вас приемлемо, вы можете написать что-то вроде этого:

select array_agg(row(a, b))
from (
  select ...
) t(a, b)

Если у вас есть собственный тип OBJECT в PostgreSQL, вы можете привести анонимный ROW к своему типу:

select array_agg(row(a, b)::your_type)
from (
  select ...
) t(a, b)
person Lukas Eder    schedule 02.12.2014
comment
Я всегда немного шокирован, когда есть полезный стандартный SQL способ сделать что-то, что поддерживает Oracle, а PostgreSQL нет. Oracle не известна своей любовью к стандартным способам. На первый взгляд мультимножества выглядят чрезвычайно полезными. - person Craig Ringer; 02.12.2014
comment
@CraigRinger: я сам очень удивлен. Конечно, большая часть стандарта SQL в прошлом была разработана Oracle и IBM, поэтому часто неудивительно найти там функции Oracle - например. также заказал агрегатные функции через WITHIN GROUP (ORDER BY ...). В этом случае Oracle не полностью реализует стандарт, но требует, чтобы OP CAST соответствовал именованному типу коллекции. В стандарте коллекции и массивы также могут быть анонимными, как это реализовано, например, в Informix. - person Lukas Eder; 02.12.2014
comment
@CraigRinger: еще один момент для Oracle и PostgreSQL: MERGE - person Lukas Eder; 02.12.2014
comment
Да, MERGE — это… ну, смешанная сумка. Это отличный инструмент для слияния данных OLAP, но его часто неправильно используют для использования в стиле OLTP UPSERT, где он просто не работает. Это не заменяет надлежащие upserts. - person Craig Ringer; 02.12.2014
comment
@CraigRinger: это зависит от базы данных. Теоретически, нет такой вещи, как злоупотребление :-) - person Lukas Eder; 02.12.2014
comment
Что насчет сегодняшних дней? Что-нибудь изменилось? К сожалению, я не смог найти каких-либо существенных изменений в Интернете. - person Tobias Marschall; 24.08.2018
comment
@TobiasMarschall: Нет - person Lukas Eder; 24.08.2018