Oracle函数编译错误 - 找不到PLS-00103的原因

时间:2017-10-26 12:05:24

标签: sql xml oracle plsql

我得到了错误:

Line/Col: 24/13
PLS-00103: Encountered the symbol ";" when expecting one of the following: (

尝试编译函数时:

create or replace function  xml_sum (innXML XMLType, outXML XMLType) RETURN number
  IS
 sum NUMBER := 0;
  BEGIN
        FOR j IN    
            (SELECT y.feature, rownum
                FROM    XMLTABLE
                    ('//FeatureVector/feature'
                      PASSING outXML
                      COLUMNS
                       feature  NUMBER  PATH '.') y)
                LOOP                    
                           FOR i IN
                      (SELECT x.feature, rownum rn
                        FROM    XMLTABLE
                            ('//FeatureVector/feature'
                              PASSING innXML
                              COLUMNS
                               feature  NUMBER  PATH '.') x WHERE rn = j.rownum) 
                    LOOP
                            sum := i.feature + j.feature;                    
                END LOOP;
        END LOOP;
  RETURN sum;
  END;
 /

错误似乎我错过了一个“;”但我无法找到错过的地方。

有人能说出来吗?这肯定会有所帮助!

提前致谢!!

2 个答案:

答案 0 :(得分:2)

您正在使用Oracle保留的关键字SUM。更改别的内容,您的问题就解决了。

也在这个地方:

WHERE rn = j.ROWNUM

你直接在where子句中引用了一个列别名,这是不允许的。要么您需要外部查询,要么可以直接使用它。您可以在下面看到我如何使用它:

所以你的代码变成了:

CREATE OR REPLACE FUNCTION xml_sum (innXML XMLTYPE, outXML XMLTYPE)
   RETURN NUMBER
IS
   ToT_SUM   NUMBER := 0;
BEGIN
   FOR j
      IN ( SELECT y.feature, ROWNUM
             FROM XMLTABLE ('//FeatureVector/feature'
                            PASSING outXML
                            COLUMNS feature NUMBER PATH '.') y)
   LOOP
      FOR i
         IN ( SELECT x.feature, ROWNUM rn
                FROM XMLTABLE ('//FeatureVector/feature'
                               PASSING innXML
                               COLUMNS feature NUMBER PATH '.') x
               WHERE ROWNUM= j.ROWNUM)
      LOOP
         ToT_SUM := i.feature + j.feature;
      END LOOP;
   END LOOP;

   RETURN ToT_SUM;
END;
/

答案 1 :(得分:1)

您的解决方案无效:

SELECT *
FROM   any_table
WHERE  ROWNUM = 2

will never return any rows

除此之外,@ XING还注意到其他一些问题,并且您在每次迭代中覆盖sum变量中的值,因此您只获得最后一个值。

您应该能够重写该过程以消除对游标循环的需求:

SQL Fiddle

Oracle 11g R2架构设置

CREATE FUNCTION xml_sum(
  innXML XMLType,
  outXML XMLType
) RETURN number
IS
  total NUMBER := 0;
BEGIN
  SELECT SUM( y.feature + x.feature )
  INTO   total
  FROM   XMLTABLE(
           '//FeatureVector/feature'
           PASSING outXML
           COLUMNS rn       FOR ORDINALITY,
                   feature  NUMBER  PATH '.'
         ) y
         INNER JOIN
         XMLTABLE(
           '//FeatureVector/feature'
           PASSING innXML
           COLUMNS rn       FOR ORDINALITY,
                   feature  NUMBER  PATH '.'
         ) x
         ON ( x.rn = y.rn );

  RETURN total;
END;
/

查询1

SELECT xml_sum(
         XMLTYPE( '<FeatureVector><feature>1</feature><feature>2</feature></FeatureVector>' ),
         XMLTYPE( '<FeatureVector><feature>1</feature><feature>2</feature></FeatureVector>' )
       ) AS total
FROM   DUAL

<强> Results

| TOTAL |
|-------|
|     6 |