oracle select语句中的值太多

时间:2019-02-23 13:54:24

标签: xml oracle plsql

执行以下查询时,我得到oracle ORA-00913:值太多错误。

SELECT qst.QUE_NAME,
  (SELECT sec2.SECTION_NAME AS "sectionName",
    sec2.SECTION_ID_PK      AS "sectionId",
    sec2.SECTION_SEQUENCE   AS "sequence",
    CASE(sec2.ENABLE_SCORING)
      WHEN '1'
      THEN 'true'
      ELSE 'false'
    END AS "hasScore",
    sec2.SECTION_WEIGHTAGE,
    sec2.SEC_TOTAL_SCR_WEIGHTAGE,
    sec2.SECTION_TYPE
  FROM MS_XRQ_SECTION sec2
  WHERE sec2.section_category=2
  AND sec2.SECTION_QUESTNR_FK=qst.INTERNAL_QUESTNR_ID
  )
FROM MS_XRQ_QUESTIONNAIRE qst
WHERE qst.INTERNAL_QUESTNR_ID= 'Questionnaire-3032';

当我使用硬编码值'Questionnaire-3032'运行第二个select语句(位于方括号内)时,它将返回正确的结果。

当我运行以下查询时,它也会返回1条记录。

SELECT qst.QUE_NAME FROM MS_XRQ_QUESTIONNAIRE qst WHERE qst.INTERNAL_QUESTNR_ID= 'Questionnaire-3032';

因此,这两个独立查询运行良好。但是,当我要将其结果合并为一个时,会出现此错误。我无法理解我在这里做错了!谁能告诉我为什么会这样?

我还要将此查询传递给dbms_xmlgen.getxmltype()函数,以获取类似于以下内容的输出。

<question> 
<name> Q1</name>
<sections>
<section> s1</section>
<section> s2</section>
</sections>
<questions>

2 个答案:

答案 0 :(得分:2)

  

当我运行带有硬编码值“ Questionnaire-3032”的第二个select语句(位于方括号内)时,它将返回正确的结果。

那是因为它作为独立过程是完全有效的。它在原始查询中失败的原因是您将其嵌入到查询投影中。这是受支持的构造,但只能用作标量游标:子查询的投影中有多个列。

您尚未发布任何示例数据,因此我对您想要的内容做了一些猜测。但是,此SQL XML解决方案会生成一个有效的XML文档,并且看上去与问题中的框架相匹配。

SELECT XMLELEMENT("Questionnaire",
         XMLAGG (
           XMLELEMENT("Question",
             XMLFOREST(
               qst.QUE_NAME AS "Name",
                  (SELECT XMLAGG(
                         XMLELEMENT("Section",
                           XMLFOREST(
                              sec2.SECTION_NAME AS "sectionName",
                              sec2.SECTION_ID_PK      AS "sectionId",
                              sec2.SECTION_SEQUENCE   AS "sequence",
                              CASE(sec2.ENABLE_SCORING)
                                  WHEN '1'
                                  THEN 'true'
                                  ELSE 'false'
                              END AS "hasScore",
                              sec2.SECTION_WEIGHTAGE,
                              sec2.SEC_TOTAL_SCR_WEIGHTAGE,
                              sec2.SECTION_TYPE
                          )
                       )
                    )   
                   FROM MS_XRQ_SECTION sec2
                   WHERE sec2.section_category = 2
                   AND sec2.SECTION_QUESTNR_FK = qst.INTERNAL_QUESTNR_ID
               ) "sections"
           )
        )
      ) 
    )    
FROM MS_XRQ_QUESTIONNAIRE qst
WHERE qst.INTERNAL_QUESTNR_ID= 'Questionnaire-3032';

我已经在SQL Fiddle here上发布了一个演示,但不幸的是,GUI在oracle.xdb.XMLTypeFactory上的表现不佳:(

答案 1 :(得分:1)

标量子查询只能返回一列和一行。

例如,您可以执行以下操作:

select (select 1 from dual) as c1
from   dual;

但是您不能这样做:

select (select 1, 2 from dual) as thiswontwork
from   dual;