ORACLE - 根据查询设置 varchar2 长度的长度
ORACLE - Set the length for a varchar2 length based on a query
我正在尝试使用 CAST
函数将查询中列的输出从 VARCHAR2
(255 CHAR) 转换为可变长度的 VARCHAR2
,子查询返回的最终数字,如下所示:
SELECT CAST(Title as VARCHAR2(SELECT MAX(LENGTH(Title)) FROM Books))
FROM Books;
有谁知道我是否可以将输出格式化为具有子查询返回长度的 VARCHAR2?对于上面的示例,我不断收到错误,但可能还有其他方法。
您尝试的操作是不可能的。
SQL 根据定义有一个静态类型系统,即结果列的数量及其名称和类型在语句 运行 之前(以及语句被解析之后)确定。
您可以使用动态 sql 来完成。适用于 SQL 开发人员的解决方案是:
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';
您会发现两种情况下返回的数据是相同的。
我正在尝试使用 CAST
函数将查询中列的输出从 VARCHAR2
(255 CHAR) 转换为可变长度的 VARCHAR2
,子查询返回的最终数字,如下所示:
SELECT CAST(Title as VARCHAR2(SELECT MAX(LENGTH(Title)) FROM Books))
FROM Books;
有谁知道我是否可以将输出格式化为具有子查询返回长度的 VARCHAR2?对于上面的示例,我不断收到错误,但可能还有其他方法。
您尝试的操作是不可能的。
SQL 根据定义有一个静态类型系统,即结果列的数量及其名称和类型在语句 运行 之前(以及语句被解析之后)确定。
您可以使用动态 sql 来完成。适用于 SQL 开发人员的解决方案是:
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';
您会发现两种情况下返回的数据是相同的。