Тип данных Oracle REF - PullRequest
       17

Тип данных Oracle REF

0 голосов
/ 29 марта 2019

Я пытаюсь заставить этот запрос работать.Я хочу вставить в вложенную таблицу Oficina_bancaria Cuentas ref () строки Corriente_udt, хранящейся в таблице Cuenta:

(SELECT ref(TREAT(VALUE(c) AS Corriente_udt)) FROM Cuenta c WHERE c.IBAN = '1654ES6639071895270420369756');

Corriente_udt - это подтип Cuenta_udt, который является типом данных таблицы Cuenta.

Это ошибка, которую я получаю:

ORA-00907: missing right parenthesis

Я уже пробовал это:

(SELECT ref(c) FROM Cuenta c WHERE c.IBAN = '1654ES6639071895270420369756');

Но я также получаю ошибку:

ORA-00932: inconsistent datatypes: expected REF USER.CORRIENTE_UDT got REF USER.CUENTA_UDT

И это мой полный запрос:

INSERT INTO TABLE (SELECT o.Cuentas FROM Oficina_bancaria o WHERE o.Codigo = 1439 AND o.Direccion = 'Alameda de Esperanza Vives 978 Valencia, 32678') (SELECT ref(TREAT(VALUE(c) AS Corriente_udt)) FROM Cuenta c WHERE c.IBAN = '1654ES6639071895270420369756');

1 Ответ

2 голосов
/ 29 марта 2019

Я хочу вставить в вложенную таблицу Oficina_bancaria Cuentas ref () строки Corriente_udt, хранящейся в таблице Cuenta

Не совсем понятно, что вы хотите от своего описания, но я думаю, что вы хотите добавить ссылку на столбец Cuentas (тип данных corrientes_array) в существующей строке таблицы Oficina_bancaria.

Запрос :

UPDATE Oficina_bancaria
SET   Cuentas = COALESCE( Cuentas, Corrientes_array() )
                MULTISET UNION
                Corrientes_array(
                  ( SELECT TREAT( REF(c) AS REF Corriente_udt )
                    FROM   Cuenta c
                    WHERE  c.IBAN = '1654ES6639071895270420369756' )
                )
WHERE  Codigo    = 6356
AND    Direccion = 'Cuesta Hector Montes 15 Puerta 5  Cuenca, 02539'

или, может быть:

MERGE INTO Oficina_bancaria o
USING (
  SELECT TREAT( REF(c) AS REF Corriente_udt ) AS Corriente_ref
  FROM   Cuenta c
  WHERE  c.IBAN = '1654ES6639071895270420369756'
) c
ON (
    o.Codigo    = 6356
AND o.Direccion = 'Cuesta Hector Montes 15 Puerta 5  Cuenca, 02539'
AND c.Corriente_ref IS NOT NULL
)
WHEN MATCHED THEN
  UPDATE
  SET o.Cuentas = COALESCE( o.Cuentas, Corrientes_array() )
                  MULTISET UNION Corrientes_array( c.Corriente_ref );

(который не должен вставлять ссылку в массив, если он не найден в таблице Cuenta).

дБ <> скрипка здесь

...