我可以在SQL语句的IN中使用Varchar2(32767)或Varchar2表吗

时间:2019-04-24 12:19:23

标签: sql oracle plsql

我存储了返回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子句。

2 个答案:

答案 0 :(得分:0)

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

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

  

VARCHAR2在PL / SQL中的最大大小: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'

答案 1 :(得分:0)

在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 ()))
/