1

我还有另一个问题,我不知道是什么原因造成的。我是 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;
4

2 回答 2

0

这是我发现的:上面的函数可能没有问题,并且连接很好。问题来自 SQL Developer 提供的单元测试 Run PL/SQL。它默认返回值字符串的长度为 200 个字符?!。我对 SQL Developer 不够熟悉,无法发现它并归咎于我自己的功能。一旦我将返回字符串的长度更改为 varchar2(5000) 一切都像魅力一样运行

于 2014-06-04T19:23:56.100 回答
0

您的变量之一(sqlstmt2sConditionClausesqlstmt)对于您尝试分配给它的字符串来说太小了。如果您包含发生错误的行号,我们就会知道是哪一个。

顺便说一句,您可以同时使用两个单引号将一个相当添加到字符串中,而不必照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;
于 2012-04-13T13:56:06.030 回答