Вызов макроса teradata с несколькими запросами на выборку из PL/SQL

Я пытаюсь вызвать макросы, определенные в teradata, из процедуры plsql, просматривая различные блоги в Интернете, я смог разработать ниже процесс для вызова и получения значений из всех макросов, которые содержат только один запрос выбора, но если я использую тот же метод для получения значений из макроса, который может содержать более 1 запроса, тогда он извлекает результаты только первого запроса.

Макрос (один запрос) -

replace macro a_macro1 (arg1 (char(9)), arg2 (char(8)), arg3 (char(8))) as 
(select ret1 (char(5)), ret2 (char(3)) 
 from table1 where arg1 = :arg1 and arg2 = :arg2 and arg3 = :arg3;);

Макрос (множественный запрос) -

replace macro a_macro2 (arg1 (char(9)), arg2 (char(5)), arg3 (char(8)), arg4 
 (char(8))) as (
 select ret1, ret2, ret3, ret4, ret5, ret6, ret7  
 from table1 where table1.arg1 = :arg1 and table1.arg2 = :arg2 
 and table1.arg3 = :arg3 and table1.arg4 = :arg4;

 select ret1, ret2 from table2 where ret2 = 'm' and 
   table2.arg1 = :arg1 
 and table2.arg3 = :arg3 and table2.arg4 = :arg4;

  select ret1, ret2 from table3 where ret2 in ('a','z') 
   and table3.arg1 = :arg1 
  and table3.arg2 = :arg2 and table3.arg3 = :arg3 and table3.arg4 = 
   :arg4;

  select ret1, ret2, ret3, ret4, ret5, ret6, ret7, ret8
   from table4 where arg1 = :arg1 and arg2 = :arg2 and arg3 = :arg3 
   and arg4 = :arg4;);

Используемый метод PLSQL -

c := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@TERA_DBLINK;
DBMS_HS_PASSTHROUGH.PARSE@TERA_DBLINK(c, 'EXEC a_macro1(?,?,?)');
DBMS_HS_PASSTHROUGH.BIND_VARIABLE@TERA_DBLINK(c,1,'val1');
DBMS_HS_PASSTHROUGH.BIND_VARIABLE@TERA_DBLINK(c,2,'val2');
DBMS_HS_PASSTHROUGH.BIND_VARIABLE@TERA_DBLINK(c,3,'val3');
num_rows := DBMS_HS_PASSTHROUGH.EXECUTE_NON_QUERY@TERA_DBLINK(c);

DBMS_OUTPUT.PUT_LINE(num_rows || ' Rows fetched');


LOOP
    num_rows := DBMS_HS_PASSTHROUGH.FETCH_ROW@TERA_DBLINK(c);
    EXIT WHEN num_rows = 0;
    i := 1;
    loop 
        BEGIN
        exit when i = 99;
        DBMS_HS_PASSTHROUGH.GET_VALUE@TERA_DBLINK(c, i, val1);
        DBMS_OUTPUT.PUT_LINE(val1);
        i := i+1;
        EXCEPTION 
        WHEN OTHERS THEN
        BEGIN
            i:=99;
            END;
        END;
    end loop;
END LOOP;  

DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@TERA_DBLINK(c);

Этот метод отлично работает для получения значений из первого макроса. Как мне изменить его, чтобы он работал и для второго макроса?

Кроме того, есть ли способ получить имена столбцов?

GET_VALUE

извлекает только значения, а не имена столбцов.

Редактировать 1. Вот мой код для вызова второго макроса.

set serveroutput on;
DECLARE
num_rows INTEGER;
c INTEGER;
i INTEGER;
val1  VARCHAR2(100);
BEGIN
c := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@TERA_DBLINK;
DBMS_OUTPUT.PUT_LINE('Cursor opened');
DBMS_HS_PASSTHROUGH.PARSE@TERA_DBLINK(c, 'EXEC a_macro2 (?,?,?,?)');
DBMS_OUTPUT.PUT_LINE('command set for parse');
DBMS_HS_PASSTHROUGH.BIND_VARIABLE@TERA_DBLINK(c,1,'123456789');
DBMS_OUTPUT.PUT_LINE('first variable bound');
DBMS_HS_PASSTHROUGH.BIND_VARIABLE@TERA_DBLINK(c,2,'00001');
DBMS_OUTPUT.PUT_LINE('second variable bound');
DBMS_HS_PASSTHROUGH.BIND_VARIABLE@TERA_DBLINK(c,3,'20161215');
DBMS_OUTPUT.PUT_LINE('third variable bound');
DBMS_HS_PASSTHROUGH.BIND_VARIABLE@TERA_DBLINK(c,4,'15462250');
DBMS_OUTPUT.PUT_LINE('fourth variable bound');
num_rows := DBMS_HS_PASSTHROUGH.EXECUTE_NON_QUERY@TERA_DBLINK(c);
DBMS_OUTPUT.PUT_LINE(num_rows || ' Rows fetched');

LOOP
    num_rows := DBMS_HS_PASSTHROUGH.FETCH_ROW@TERA_DBLINK(c);
    EXIT WHEN num_rows = 0;
    i := 1;
    loop 
        BEGIN
        exit when i = 99;
        DBMS_HS_PASSTHROUGH.GET_VALUE@TERA_DBLINK(c, i, val1);
        DBMS_OUTPUT.PUT_LINE(val1);
        i := i+1;
        EXCEPTION 
        WHEN OTHERS THEN
        BEGIN
            i:=99;
            END;
        END;
    end loop;
END LOOP;  

DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@TERA_DBLINK(c);
END;
/

Выход -

 Cursor opened
 command set for parse
 first variable bound
 second variable bound
 third variable bound
 fourth variable bound
 1 Rows fetched
 ABCDEF02AB8
 ABCDEF02ABC
 1234
 T1F
 1F
 A
 Y

Возвращаются только 7 значений из первого запроса второго макроса.


person Karanjeet Singh    schedule 15.12.2016    source источник


Ответы (1)


Чтобы ваш код работал для следующих макросов, просто внесите изменения на этом шаге:

DBMS_HS_PASSTHROUGH.PARSE@TERA_DBLINK(c, 'EXEC a_macro2(?,?,?,?,?)');

Не забудьте добавить переменные привязки по количеству переданных аргументов.

person XING    schedule 15.12.2016
comment
Я пытался это сделать, и это возвращает результат только первого запроса выбора, а не последующих. - person Karanjeet Singh; 15.12.2016
comment
Я не уверен, как работает макрос teradata, но вы можете увидеть мой ответ, где я передаю 5 раз ? макросу. Я видел, что когда ваш макрос1 имеет 3 аргумента, вы передали 4 раза ?. Теперь, поскольку ваш макрос2 имеет 4 аргумента, вы должны передать 5 раз ? . - person XING; 16.12.2016
comment
нет, извините, это была опечатка. я прохожу? 3 раза в макросе 1 и 4 раза в макросе 2 - person Karanjeet Singh; 16.12.2016