连接Oracle中的2个字符串问题

连接Oracle中的2个字符串问题,oracle,plsql,Oracle,Plsql,我还有一个问题,我不知道是什么引起的。我是Oracle的新手,我对连接两个字符串很感兴趣。我有一个函数,它将获取DateStart、DateStop和其他变量,然后将它们转换为SQLSTMT。该函数编译正常,但执行时出现以下错误: ORA-06502:PL/SQL:数字或值错误:第行的字符串缓冲区太小ORA-06512 起初我认为其中一个字符串可能缺少引号,但这两个字符串都很好,因为当我打印出单个字符串时,函数没有生成错误。只有当两者结合时才有问题! 很明显,我忽略了一些事情,我甚至尝试了con

我还有一个问题,我不知道是什么引起的。我是Oracle的新手,我对连接两个字符串很感兴趣。我有一个函数,它将获取DateStart、DateStop和其他变量,然后将它们转换为SQLSTMT。该函数编译正常,但执行时出现以下错误:

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;
创建或替换
功能ABC(
VARCHAR2中的DateStart,
DateStop位于瓦查尔2号,
VARCHAR2中的ZipCode,
Varchar实习(2)
返回VARCHAR2
是
v_代码;
v_errm VARCHAR2(64);
sqlstmt-VARCHAR2(1000);
sqlstmt2-VARCHAR2(500);
条款2(500);
s_Quote VARCHAR(1):=chr(39);
开始
sqlstmt2:=“选择将字符(“日期”,“yyyy-mm-dd”)作为“日期”,
substr(修剪(“邮政”),1,5)为“ZipCode”,
将(“患者”)计算为“总数”;
sConditionClause:='来自“ABC\U表”,其中“日期”>=截止日期('
||s| | |修剪(日期开始)| | s|报价
||','
||其中一个变量(
sqlstmt2
sConditionClause
,或
sqlstmt
)对于试图分配给它的字符串来说太小。如果您包含了发生错误的行号,我们就知道是哪个行号了

顺便说一句,您可以同时使用两个单引号将一个quite添加到字符串中,而不必像现在这样使用
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;
创建或替换
功能ABC(
VARCHAR2中的DateStart,
VARCHAR2中的DateStop)
返回VARCHAR2
是
开始
返回“选择到字符(“日期”,“yyyy-mm-dd”)作为“日期”,
substr(修剪(“邮政”),1,5)为“ZipCode”,
将(“患者”)计入“总数”
从“ABC表”,其中“日期”>=到日期(“”)
||修剪(日期开始)

||''、''mm/dd/yyyy''和“Date”这是我发现的:上面的函数可能没有问题,连接也很好。问题来自SQL开发人员提供的单元测试运行PL/SQL。它默认返回值字符串的长度为200个字符?!。我对SQLDeveloper不够熟悉,所以没有发现它,并将其归咎于我自己的函数。一旦我将返回字符串的长度更改为varchar2(5000),所有内容都会像符咒一样运行

感谢您的及时响应。如果我不连接这两个字符串,我没有问题。如前所述,如果单独打印,两个字符串的打印效果都很好。因此,我怀疑变量没有足够的空间。您的响应是我的原始代码,但我还需要其他变量,因为输出依赖于其他变量。整个函数中有很多东西,但我已经将问题追溯到上面的代码。换句话说,我需要连接。我只是不确定连接的问题是什么。谢谢Stevo和Jeffrey的调查。这就是我发现的:上面的函数可能没有问题,连接也很好。问题来自SQL开发人员提供的单元测试运行PL/SQL。它默认返回值字符串的长度为200个字符?!。我对SQLDeveloper不够熟悉,所以没有发现它,并将其归咎于我自己的函数。当我将返回字符串的长度更改为varchar2(5000)时,一切都像一个符咒一样运行。。。谢谢大家的关注。我知道这是我的疏忽,但我不知道该往哪里看……我只是尝试用一些合理的参数值创建和运行这个函数,它工作得很好。您能告诉我们您使用的是什么参数吗?(1)告诉我们错误报告在哪一行;(2) 告诉我们参数
DateStart
DateStop
的长度;(3) 检查正在向
sqlstmt2
添加多少空格。