ORACLE - устанавливает длину для varchar2 длины на основе запроса

Я пытаюсь использовать CAST функция для преобразования вывода столбца в запросе, из VARCHAR2(255 CHAR) до VARCHAR2 переменной длины, последнее число возвращается подзапросом, например так:

SELECT CAST(Title as VARCHAR2(SELECT MAX(LENGTH(Title)) FROM Books)) 
FROM Books;

Кто-нибудь знает, можно ли мне отформатировать вывод как VARCHAR2 с длиной, возвращенной подзапросом? В приведенном выше примере я получаю ошибки, но могут быть и другие способы.

2 ответа

Решение

То, что вы пытаетесь сделать, невозможно.

SQL по определению имеет статическую систему типов, т. Е. Число столбцов результата, их имена и типы определяются до выполнения оператора (и после анализа оператора).

Вы можете сделать это с динамическим SQL. Решение, которое работает в SQL Developer:

VARIABLE cur REFCURSOR;

DECLARE
  p_max_length INT;
BEGIN
  SELECT MAX( LENGTH( title ) )
  INTO   p_max_length
  FROM   Books;

  OPEN :cur FOR
  'SELECT CAST( Title AS VARCHAR2(' || p_max_length || ')) FROM Books';
END;
/

PRINT cur;

Однако у меня возникли проблемы с пониманием того, почему вы хотели бы сделать это, поскольку название уже VARCHAR2(255) (поэтому уже имеет переменную длину) и уменьшение максимальной емкости не собирается уменьшать размер данных.

Вы можете увидеть, что они одинаковы, выполнив:

SELECT DUMP(Title) FROM Books;

и сравнивая его с запросом выше, используя вместо этого:

OPEN :cur FOR
'SELECT DUMP(CAST( Title AS VARCHAR2(' || p_max_length || '))) FROM Books';

и вы увидите, что возвращенные данные идентичны в обоих случаях.

Другие вопросы по тегам