错误"单行查询返回多个行"

2020-08-14 20:21发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我需要一个具有表功能/UDF和三个公司代码IP参数的计算视图:

IP_BUKR_FROM和IP_BUKR_TO作为阵列和

IP_BUKRS_MUL作为可供选择的参数。

查询

选择*
 来自" MYSCHEMA。" MYFUNCTION"('201811','0','9999','363; 364')
 

工作正常,

选择*
 FROM" _SYS_BIC"。" REWE.ZFI.BIBER.MABU-BIBER :: ZFIMB_UDFENRICH_ABTBUMO18B"('201811','100','200','')
 

给我这个错误信息

在24.169秒内无法执行" SELECT * FROM ..."。
 SAP DBTech JDBC:[305]:单行查询返回多行:搜索表错误:" MYSCHEMA"。" MYFUNCTION":第25行第1行(在pos 732):[305](范围3)单行 查询返回多行异常:单行查询返回多行:ptime :: PtimeException(请检查行:25)
 

如果我跳过选择选项的两个参数(从到),而只在代码中保留参数IP_BUKRS_MUL,则可以使用相同的UDF。

这是我的UDF:

功能" MYSCHEMA"。" MYFUNCTION"
  (IP_BUCHUNGSPERIODE VARCHAR(6),
    IP_BUKR_FROM VARCHAR(4),
    IP_BUKR_TO VARCHAR(4),
   IP_BUKRS_MUL VARCHAR(5000))
  退货表(
      R_BUCHUNGSPERIODE VARCHAR(6),
      R_FISCVARNT VARCHAR(2),
      R_SAP_KOSTENSTELLE NVARCHAR(10),
      R_CO_AREA NVARCHAR(4),
      R_BUKR VARCHAR(4),
      RK_AMOUNT DECIMAL(15,5))
      语言SQLSCRIPT
      SQL安全调用程序
      默认模式
 如
 开始
  DECLARE BUKRS_FIL VARCHAR(5000):='BUKR in('||:IP_BUKRS_MUL ||')';
 如果(IP_BUKR_FROM为NULL并且
    IP_BUKR_TO为NULL)
 然后
    IP_BUKR_FROM ='0';
    IP_BUKR_TO ='9999';
 万一;
 var_sel =
 选择
   紫uch
        作为BUCHUNGSPERIODE
 ," K4"为FISCVARNT
 ,SAP_KOSTENSTELLE_
 如SAP_KOSTENSTELLE
 ,CO_AREA
 ,BUKR
 ,金额
       金额
 来自" OTHERSCHEMA"。" MYTABLE"
 哪里
     Buchungsperiode =:IP_BUCHUNGSPERIODE
 AND BUKR> =:IP_BUKR_FROM
 AND BUKR <=:IP_BUKR_TO
 ;
 IF(IP_BUKR_FROM ='0'或
    IP_BUKR_TO ='9999')
 然后
   var_in = APPLY_FILTER(:var_sel,:BUKRS_FIL);
 其他
   var_in = SELECT * FROM:var_sel;
 万一;
 返回选择
      BUCHUNGSPERIODE AS R_BUCHUNGSPERIODE,
      FISCPER AS R_FISCPER,
      FISCVARNT AS R_FISCVARNT,
      SAP_KOSTENSTELLE AS R_SAP_KOSTENSTELLE,
      CO_AREA AS R_CO_AREA,
      LPAD(BUKR,4,'000')AS R_BUKR,
      AMOUNT AS RK_AMOUNT
 来自:var_in;
 结束;
 

有没有所有三个参数都能正常工作的解决方案?

最诚挚的问候,马丁

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好,

我需要一个具有表功能/UDF和三个公司代码IP参数的计算视图:

IP_BUKR_FROM和IP_BUKR_TO作为阵列和

IP_BUKRS_MUL作为可供选择的参数。

查询

选择*
 来自" MYSCHEMA。" MYFUNCTION"('201811','0','9999','363; 364')
 

工作正常,

选择*
 FROM" _SYS_BIC"。" REWE.ZFI.BIBER.MABU-BIBER :: ZFIMB_UDFENRICH_ABTBUMO18B"('201811','100','200','')
 

给我这个错误信息

在24.169秒内无法执行" SELECT * FROM ..."。
 SAP DBTech JDBC:[305]:单行查询返回多行:搜索表错误:" MYSCHEMA"。" MYFUNCTION":第25行第1行(在pos 732):[305](范围3)单行 查询返回多行异常:单行查询返回多行:ptime :: PtimeException(请检查行:25)
 

如果我跳过选择选项的两个参数(从到),而只在代码中保留参数IP_BUKRS_MUL,则可以使用相同的UDF。

这是我的UDF:

功能" MYSCHEMA"。" MYFUNCTION"
  (IP_BUCHUNGSPERIODE VARCHAR(6),
    IP_BUKR_FROM VARCHAR(4),
    IP_BUKR_TO VARCHAR(4),
   IP_BUKRS_MUL VARCHAR(5000))
  退货表(
      R_BUCHUNGSPERIODE VARCHAR(6),
      R_FISCVARNT VARCHAR(2),
      R_SAP_KOSTENSTELLE NVARCHAR(10),
      R_CO_AREA NVARCHAR(4),
      R_BUKR VARCHAR(4),
      RK_AMOUNT DECIMAL(15,5))
      语言SQLSCRIPT
      SQL安全调用程序
      默认模式
 如
 开始
  DECLARE BUKRS_FIL VARCHAR(5000):='BUKR in('||:IP_BUKRS_MUL ||')';
 如果(IP_BUKR_FROM为NULL并且
    IP_BUKR_TO为NULL)
 然后
    IP_BUKR_FROM ='0';
    IP_BUKR_TO ='9999';
 万一;
 var_sel =
 选择
   紫uch
        作为BUCHUNGSPERIODE
 ," K4"为FISCVARNT
 ,SAP_KOSTENSTELLE_
 如SAP_KOSTENSTELLE
 ,CO_AREA
 ,BUKR
 ,金额
       金额
 来自" OTHERSCHEMA"。" MYTABLE"
 哪里
     Buchungsperiode =:IP_BUCHUNGSPERIODE
 AND BUKR> =:IP_BUKR_FROM
 AND BUKR <=:IP_BUKR_TO
 ;
 IF(IP_BUKR_FROM ='0'或
    IP_BUKR_TO ='9999')
 然后
   var_in = APPLY_FILTER(:var_sel,:BUKRS_FIL);
 其他
   var_in = SELECT * FROM:var_sel;
 万一;
 返回选择
      BUCHUNGSPERIODE AS R_BUCHUNGSPERIODE,
      FISCPER AS R_FISCPER,
      FISCVARNT AS R_FISCVARNT,
      SAP_KOSTENSTELLE AS R_SAP_KOSTENSTELLE,
      CO_AREA AS R_CO_AREA,
      LPAD(BUKR,4,'000')AS R_BUKR,
      AMOUNT AS RK_AMOUNT
 来自:var_in;
 结束;
 

有没有所有三个参数都能正常工作的解决方案?

最诚挚的问候,马丁

付费偷看设置
发送
6条回答
灬番茄
1楼 · 2020-08-14 20:54.采纳回答
在这种情况下,

嗨马丁

,该问题很可能是由您在该计算视图中所做的事情和要获取的数据共同引起的。

对于错误 发生这种情况时,视图的某些部分期望最多只能返回1条记录。

类似

 SELECT a.ID的东西
       , 一个名字
       ,(从价位b WHERE b.thing_name = a.name中选择b.RATE)为THING_RATE
 从
    只要每个THING.NAME都只有一个RATE条目,THINGS a 

就可以正常工作。

只要您的过滤器允许输入的条目可以返回多个 条目,您将看到现在遇到的错误。

一种常见的处理方法是确保返回的记录不超过一个。 此处可以使用聚合函数(例如MAX/MIN)。

产生这种错误的另一种方法是在SQLScript中进行如下操作:

 SELECT b.RATE
        INTO _thing_rate 
从价率b 其中b.thing_name = a.name;

在这里,适用与以前相同的解释。

简而言之:此错误不是由于使用UDF或计算视图(或任何其他视图) 开发工件类型),但由于您对数据(-模型)有误解。

干杯,

Lars

追夢秋陽
2楼-- · 2020-08-14 21:17

" OTHERSCHEMA"。" MYTABLE"确实是普通表,或者可能是具有自己的过滤器/选择条件的视图?

路亽曱_Ryan
3楼-- · 2020-08-14 21:02

关于此问题,我想补充一点:非常令人困惑的错误 当结果集很大时,还会出现消息"单行查询返回多个行"-在上述给定的解决方案中,例如 当我选择许多公司代码时 经过大量的反思和尝试,直到我意识到我的代码现在是正确的,我只需要选择较小范围的公司代码...

歪着头看世界
4楼-- · 2020-08-14 20:55

Lars,您是对的 -标识符MYTABLE是一个令人误解的标识符:它是另一个具有更复杂的转换和选择的计算视图...真正令人困惑的事实是,该表函数可以作为例程正常工作(没有返回表)-也在调试器中。

我应该尝试在该UDF中执行所有选择吗?

超级大咸鱼
5楼-- · 2020-08-14 20:55

这是解决方案,再次感谢! 我刚刚添加了一个INNER JOIN,整个脚本现在看起来像这样:

 DECLARE lv_flag INT DEFAULT 0;
  DECLARE BUKRS_FIL VARCHAR(5000):='BUKR in('||:IP_BUKRS_MUL ||')';

 IF(长度(IP_BUKRS_MUL)> 0)
   然后
     lv_flag = 1;
     var_in = APPLY_FILTER(" MYSCHEMA"。" MYCV2",:BUKRS_FIL);  -带过滤器的变量var_in
     var_sel1 =-使用var_in上的SELECT变量var_sel1
     选择
       布琼斯时期
       布克尔
     来自:var_in
       其中Buchungsperiode =:IP_BUCHUNGSPERIODE
     通过...分组
       布琼斯时期
       BUKR;
 ELSEIF(IP_BUKR_FROM>'0'并且IP_BUKR_TO <'9999')
   然后
     lv_flag = 1;
     var_sel1 =
     选择
       布琼斯时期
       布克尔
     来自" MYSCHEMA"。" MYCV2"
       哪里
           Buchungsperiode =:IP_BUCHUNGSPERIODE
       AND BUKR之间:IP_BUKR_FROM
                    与:IP_BUKR_TO
     通过...分组
       布琼斯时期
       BUKR;
 万一;

 如果lv_flag = 1然后
 var_sel2 =-在var_sel1上具有SELECT的变量var_sel2
   选择a.Buchungsperiode作为BUCHUNGSPERIODE
     ," K4"为FISCVARNT
     ,a.SAP_KOSTENSTELLE作为SAP_KOSTENSTELLE
     ,a.CO_AREA AS CO_AREA
     ,a.KONTO AS KONTO
     ,a.BUKR AS BUKR
     ,a.AMOUNT AS AMOUNT
 来自" MYSCHEMA"。" MYCV2" a
 内连接:var_sel1 b
   开a.BUKR = b.BUKR
   AND a.Buchungsperiode = b.Buchungsperiode;
 万一;  -lv_flag = 1; 
shere_lin
6楼-- · 2020-08-14 21:07

那将是一个错误。
该错误消息是关于定性错误(多个结果记录而不是唯一的记录),而不是定量一个(一些,更多,很多或太多)记录

如果错误出现在选择范围较广而不是选择范围较窄的位置,则该选择范围内遗漏的记录必须包含导致问题的数据。

一周热门 更多>