我还有另一个问题,我不知道是什么导致了这个问题。我是Oracle新手,我在连接2个字符串时翻滚。我有一个函数,它将采用DateStart,DateStop和其他变量,然后将它们转换为SQL stmt。该函数编译正常但执行时出现以下错误:
ORA-06502:PL / SQL:数字或值错误:字符串缓冲区太小ORA-06512在行...
起初我认为其中一个字符串可能缺少引号,但两个字符串都很好,因为当我打印单个字符串时函数没有生成错误。它只有在两者合并时才会出现问题! 这可能是我忽略的一些显而易见的事情,我甚至尝试过concat而不是运算符“||”,但我无法确定问题的原因。如果有人之前遇到过这个问题,如果你能给我一些不正确的做法,我将不胜感激。
这是导致我问题的功能,我已经删除了所有其他不相关的代码,以便我们可以解决问题。函数编译正确但在执行时有问题。
谢谢!
create or replace
FUNCTION ABC(
DateStart IN VARCHAR2 ,
DateStop IN VARCHAR2 ,
ZipCode IN VARCHAR2 ,
PracticeID IN VARCHAR2)
RETURN VARCHAR2
IS
v_code NUMBER;
v_errm VARCHAR2(64);
sqlstmt VARCHAR2(1000);
sqlstmt2 VARCHAR2(500);
sConditionClause VARCHAR2(500);
s_Quote VARCHAR(1) := chr(39);
BEGIN
sqlstmt2 :='SELECT TO_CHAR("Date", ''yyyy-mm-dd'') AS "Date" ,
substr(trim("Postal"),1,5) AS "ZipCode" ,
count ("Patient") AS "Total" ';
sConditionClause := ' FROM "ABC_TABLE" WHERE "Date">=To_Date('
||s_Quote || trim(DateStart) ||s_Quote
||','
||s_Quote||'mm/dd/yyyy'||s_Quote||')AND "Date"<=To_Date('
||s_Quote || trim(DateStop) ||s_Quote
||','||s_Quote||'mm/dd/yyyy'||s_Quote||') ';
sqlstmt := trim(sqlstmt2)||trim(sConditionClause);
RETURN sqlstmt;
END;
答案 0 :(得分:0)
您的某个变量(sqlstmt2
,sConditionClause
或sqlstmt
)对于您尝试分配给它的字符串来说太小了。如果您已包含发生错误的行号,我们就知道哪一行。
顺便提一下,您可以一起使用两个单引号将单个引号添加到字符串中,而不必像现在这样使用s_Quote
。
您可以通过跳过局部变量来完全避免此问题:
create or replace
FUNCTION ABC(
DateStart IN VARCHAR2,
DateStop IN VARCHAR2)
RETURN VARCHAR2
IS
BEGIN
RETURN 'SELECT TO_CHAR("Date", ''yyyy-mm-dd'') AS "Date" ,
substr(trim("Postal"),1,5) AS "ZipCode" ,
count ("Patient") AS "Total"
FROM "ABC_TABLE" WHERE "Date">=To_Date('''
|| trim(DateStart)
||''',''mm/dd/yyyy'') AND "Date"<=To_Date('''
|| trim(DateStop)
||''',''mm/dd/yyyy'')';
END ABC;
答案 1 :(得分:0)
这是我发现的:上面的函数可能没有问题,并且串联很好。问题来自SQL Developer提供的单元测试Run PL / SQL。它默认返回值字符串,长度为200个字符?!我不熟悉SQL Developer来发现它并归咎于我自己的功能。一旦我将返回字符串的长度更改为varchar2(5000),所有内容都会像魅力一样运行