DBMS_SQL.EXECUTE не выдает выходные данные, когда SQL имеет DBMS_XMLGEN.GETXML - PullRequest
0 голосов
/ 18 апреля 2019

Я генерирую динамический SQL, который генерирует данные XML, используя SELECT DBMS_XMLGEN.GETXML, поскольку выходные данные содержат специальные символы, которые не поддерживаются в XML.Я попробовал и проверил SQL отдельно, он работает, как ожидалось.Я не могу получить данные, когда я вызываю их с помощью динамического SQL.

Я использовал DBMS_SQL.DESC_TAB2, поскольку он обрабатывает весь SQL, начиная с DBMS_XMLGEN.GETXML, как один столбец.

--Snippet

Декларация

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 голосов
/ 18 апреля 2019

Из документации на dbms_sql.execute:

Возвращаемое значение действительно только для операторов INSERT, UPDATE и DELETE; для других типов операторов, включая DDL, возвращаемое значение не определено и должно игнорироваться.

Поскольку ваше утверждение является select, возвращаемое значение RowProcessed не имеет смысла; неважно, что вы видите там ноль.

После этого вам нужно сделать шаг fetch_rows или изменить его на execute_and_fetch. В любом случае, вам, конечно, нужно обработать извлеченные данные.

(col_name выглядит как не проблема, это просто автоматически генерируемое имя / псевдоним. Если вы измените свой динамический оператор на ...) AS my_col_alias FROM DUAL, тогда col_name будет отображаться как MY_COL_ALIAS.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...