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';
и вы увидите, что возвращенные данные идентичны в обоих случаях.