【问题标题】:Can I use Varchar2(32767) or Varchar2 Table in IN of sql statement我可以在 sql 语句的 IN 中使用 Varchar2(32767) 或 Varchar2 表吗
【发布时间】:2019-09-13 17:48:08
【问题描述】:

我已经存储了返回 Varchar2 (32767) 的函数,我想在 IN 下的 select 语句中使用它但是当我在 IN 子句下的 Select 中使用它时出现错误。

SELECT * FROM testcustomers1 where no_of_bu1 in(select myMaxLenFunc('test') from dual);

它给了我错误

错误:- ORA-06502: PL/SQL: 数字或值错误: 字符串缓冲区太小

如果返回值小于 4k 则可以正常工作,但如果大于 4k 则会引发上述错误。

如果我使用 varchar2 表或 Varchar2 在存储函数中返回,请建议我如何在 select 中使用它的 IN 子句。

【问题讨论】:

  • no_of_bu1 的数据类型是什么??为什么不能直接使用:no_of_bu1=myMaxLenFunc('test')...?
  • no_of_bu1 的数据类型是 varchar2(16) 并且在存储的函数中打算根据我的要求返回 no_of_bu1 的逗号分隔值。
  • 要么只取前 4000 个字符,要么使用 clob
  • 您使用的是哪个 Oracle 版本?如果您想处理高达 32k 的 varchar 值,您可以启用 extended strings
  • 我可以使用 12g 和扩展数据类型但仍然 IN 不接受超过 4k

标签: sql oracle plsql


【解决方案1】:

您的函数是 PL/SQL,可以返回超过 4000 的 varchar2 字符串。这对于 SQL 来说是非法的(如果 MAX_STRING_SIZE 参数的值为 STANDARD)

http://docs.oracle.com/cd/E11882_01/appdev.112/e17126/datatypes.htm

PL/SQL 中的 VARCHAR2 最大大小:32,767 字节 SQL 中的最大大小 4,000 字节

所以你需要想办法解决。由于 no_of_bu1 是一个 SQL 列,并且内容长度不能超过 4000 字节,因此您可以使用以下内容保存:

SELECT * FROM testcustomers1 
 where no_of_bu1 in(select substr(myMaxLenFunc('test'),1,4000) from dual);

虽然我会截断函数中的字符串。

如果您的数据库是 Oracle 12.1,您可以确定您的 SQL 字符串大小是否为标准(即 4000)

SELECT name, value
  FROM v$parameter
 WHERE name = 'max_string_size'

【讨论】:

【解决方案2】:

您有正确的想法,在 IN 子句中使用集合而不是字符串。那么你就不会遇到这个问题了。试试这样的:

CREATE OR REPLACE TYPE strings_t IS TABLE OF VARCHAR2 (4000)
/

CREATE OR REPLACE FUNCTION strings
   RETURN strings_t
   AUTHID DEFINER
IS
BEGIN
   RETURN strings_t ('abc', 'def', '123');
END;
/

CREATE TABLE t (s VARCHAR2 (100))
/

BEGIN
   INSERT INTO t
        VALUES ('abd');

   INSERT INTO t
        VALUES ('def');

   INSERT INTO t
        VALUES ('456');

   COMMIT;
END;
/

SELECT *
  FROM t
 WHERE t.s IN (SELECT COLUMN_VALUE FROM TABLE (strings ()))
/

【讨论】:

  • 试过了,但是 SELECT COLUMN_VALUE FROM TABLE (strings ()) 给了我错误 ORA-00902: invalid datatype
  • 这很奇怪。我刚刚在 LiveSQL 上运行了这个脚本,它运行良好。请尝试:livesql.oracle.com/apex/livesql/s/iatqj7i9lgwo0z33jmoni8w3t 然后在那里加载您的代码,将其保存为未列出的脚本并在此处提供链接,以便我们查看可能出现的问题。
  • 我使用了一个集合 TABLE OF VARCHAR2 并且它有效,感谢您的解决方案帮助了我
猜你喜欢
  • 2011-05-28
  • 2019-12-02
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 2012-05-12
  • 1970-01-01
相关资源
最近更新 更多