【问题标题】:'ORA-00913: too many values' while reading data from xml to user-defined record (PL/SQL)'ORA-00913: too many values' 将数据从 xml 读取到用户定义的记录 (PL/SQL)
【发布时间】:2016-07-14 20:15:35
【问题描述】:

我在执行以下 PL/SQL 代码时遇到此错误,我不知道为什么。

PLS-00382:表达式类型错误 PL/SQL: ORA-00913: 值太多 PL/SQL:忽略 SQL 语句

我了解 ORA-00913 的原因是 SELECT 语句中引用的两组数据中的值不匹配。

在我在记录中添加 checkVar 变量之前,代码运行良好。只是想知道是否有任何方法可以在不从 testRec 记录中取出 checkVar 的情况下解决这个问题?

 DECLARE

  X XMLType:=XMLType( '<Testmain>
  <TeamSel>
    <code>abc123</code>
    <name>awrqer</name>
  </TeamSel>
   <TeamSel>
    <code>abc678</code>
    <name>gokhg</name>
  </TeamSel>
 </Testmain>

');


 TYPE testRec IS RECORD(
    name VARCHAR2(512),
    code  VARCHAR2(512),
    checkVar BOOLEAN:=FALSE
  );


  TYPE testRecTab IS TABLE OF testRec INDEX BY BINARY_INTEGER;

  testList             testRecTab;


BEGIN

   SELECT EXTRACTVALUE(VALUE(xml_list),'//Name') AS lname,
          EXTRACTVALUE(VALUE(xml_list),'//Code') AS lcode
   BULK COLLECT
   INTO testList
   FROM TABLE(XMLSEQUENCE(EXTRACT(X,'Testmain/TeamSel'))) xml_list; 

--rest of the code

END;

【问题讨论】:

    标签: oracle plsql xml-parsing


    【解决方案1】:

    你不能选择一个布尔变量,所以我认为有两个选择:

    a) 从记录类型中删除布尔值

    b) 像下面的示例那样循环填充您的表格

    DECLARE
      X XMLType:=XMLType( '<Testmain>
      <TeamSel>
        <code>abc123</code>
        <name>awrqer</name>
      </TeamSel>
       <TeamSel>
        <code>abc678</code>
        <name>gokhg</name>
      </TeamSel>
     </Testmain>
    
    ');
    
     TYPE testRec IS RECORD(
        name VARCHAR2(512),
        code  VARCHAR2(512),
        checkVar BOOLEAN:=FALSE
      );
    
      TYPE testRecTab IS TABLE OF testRec INDEX BY BINARY_INTEGER;
    
      lTestRec             testRec;
      testList             testRecTab;
    
    BEGIN   
       FOR cRecord IN (
         SELECT EXTRACTVALUE(VALUE(xml_list),'//name') lname,
                EXTRACTVALUE(VALUE(xml_list),'//code') lcode
         FROM TABLE(XMLSEQUENCE(EXTRACT(X,'Testmain/TeamSel'))) xml_list
       )
       LOOP
         lTestRec.name := cRecord.lname;
         lTestRec.code := cRecord.lcode;
    
         testList(testList.count + 1) := lTestRec;
       END LOOP;
    
    --rest of the code
    
    END;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 2019-02-01
      • 1970-01-01
      • 2014-03-31
      相关资源
      最近更新 更多