我存储了返回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子句。
答案 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 ()))
/