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';

您会发现两种情况下返回的数据是相同的。