当SQL具有DBMS_XMLGEN.GETXML时,DBMS_SQL.EXECUTE不提供输出

时间:2019-04-18 02:11:47

标签: oracle

我正在生成一个动态SQL,该SQL使用SELECT DBMS_XMLGEN.GETXML生成XML数据,因为输出具有特殊字符, XML不支持这些功能。我分别尝试了SQL,并按预期工作。 使用Dynamic SQL调用数据时,无法获取数据。

我使用了DBMS_SQL.DESC_TAB2,因为它将DBMS_XMLGEN.GETXML开头的整个SQL视为一列。

-摘要

声明

SelectCursorId          NUMBER;                 --For Dynamic SQL binding
RowProcessed                INTEGER;                --For Dynamic SQL binding
MstrSeqNbr              NUMBER  := 1;
ColumnCount             NUMBER;                 --For Dynamic SQL binding
RecordSqrNbr                NUMBER  := 0;           --For Dynamic SQL binding
ColumnDescTbl           DBMS_SQL.DESC_TAB2;     --dbms_sql.desc_tab2 
ColumnValue             VARCHAR2(4000);         --For Dynamic SQL binding
DymanicSQLCols          VARCHAR2(4000);         -- For debugging purpose, columns returned 
SelectSQL               VARCHAR2(6000);

BEGIN

--Snippet

SelectSQL :=   'SELECT DBMS_XMLGEN.GETXML('SELECT MRQ.BatchNBR AS Batch_NUMBER, 
                                                MRQ.BatchRUNSEQNBR AS Batch_RUN_INSTANCE, 
                                                        MRQ.BatchRUNDATE AS RUN_DATE, 
                                                        MRQ.SPDATE AS POST_DATE, 
                                                        MRQ.BatchNAME AS Batch_NAME, 
                                                        MRQ.RPTNAME AS DATABASE_NAME, 
                                                        MRQ.EFFDATE AS RUN_TIME, 
                                                        MRQ.BatchSTARTDATE AS ELAPSED_TIME , 
                                                        CURSOR ( SELECT MRI.MSTREPORTRECSEQNBR AS RECORD_SEQUENCE_NUMBER, 
                                                                    MRI.RTTEXT1VC100 AS COUNTRY_NAME, 
                                                                    MRI.RTTEXT2VC100 AS CURRENCY_USED, 
                                                                    MRI.RTTEXT1VC50 AS COUNTRY_SHORT_CODE, 
                                                                    MRI.RTNUM1P0 AS ISO_CURRENCY_CODE 
                                                                  FROM MasterReporting MRI 
                                                                  WHERE BatchNbr = MR.BatchNbr 
                                                                  AND BatchRUNSEQNBR = MR.BatchRUNINSTANCE 
                                                                  ORDER BY MSTREPORTRECSEQNBR )Record 
                                                  FROM BatchRUNHIST MR , MastRptSeqDtl MRQ 
                                                   WHERE MR.BatchNbr =  100 
                                                   AND MR.BatchRUNINSTANCE IN( 67) 
                                                   AND MRQ.BatchRUNSEQNBR = MR.BatchRUNINSTANCE 
                                                   AND MR.BatchRunStatCD =''COMPL'' 
                                      ')
                    FROM DUAL ';



SelectCursorId := DBMS_SQL.OPEN_CURSOR;                                 --Pass

DBMS_SQL.PARSE ( SelectCursorId, SelectSQL, DBMS_SQL.NATIVE);           --Pass

DBMS_SQL.DESCRIBE_COLUMNS2( SelectCursorId, ColumnCount, ColumnDescTbl);  --Pass

** However ColumnDescTbl(1).col_name is only giving following, not sure if this is the issue 

DBMS_XMLGEN.GETXML('SELECT MRQ.BatchNBRASBatch_NUMBER, MRQ.BatchRUNSEQNBRASBatch_RUN_INSTANCE, MRQ.BatchRUNDATEASRUN_DATE, MRQ.SPDATEASPOST_DATE, MRQ.BatchNAMEASBatch_NAME, MRQ.RPTNAMEASDATABAS

Next step also passes

For k in 1..ColumnCount LOOP   
    DBMS_SQL.DEFINE_COLUMN(SelectCursorId, k, ColumnValue, 4000);     --Pass
END LOOP;


RowProcessed := DBMS_SQL.EXECUTE(SelectCursorId);         
--Passes but gives 0 as output,
--Whereas, running the SQL separately gives you one row of XML data.    

最少应返回一行XML数据。

1 个答案:

答案 0 :(得分:0)

摘自dbms_sql.execute的文档:

  

返回值仅对INSERTUPDATEDELETE语句有效;对于其他类型的语句(包括DDL),返回值是不确定的,必须忽略。

由于您的陈述是select,因此RowProcessed返回值没有任何意义;在那里看到零并不重要。

此后,您需要执行fetch_rows步骤,或将其更改为execute_and_fetch。然后,无论哪种方式,您都需要处理获取的数据。

({col_name看起来像是一个非问题,它只是一个自动生成的名称/别名。如果将动态语句更改为...) AS my_col_alias FROM DUAL,则col_name将报告为MY_COL_ALIAS。)