2016-12-15 13 views
0

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

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

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 := [email protected]_DBLINK; 
[email protected]_DBLINK(c, 'EXEC a_macro1(?,?,?)'); 
[email protected]_DBLINK(c,1,'val1'); 
[email protected]_DBLINK(c,2,'val2'); 
[email protected]_DBLINK(c,3,'val3'); 
num_rows := [email protected]_DBLINK(c); 

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


LOOP 
    num_rows := [email protected]_DBLINK(c); 
    EXIT WHEN num_rows = 0; 
    i := 1; 
    loop 
     BEGIN 
     exit when i = 99; 
     [email protected]_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; 

[email protected]_DBLINK(c); 

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

Также есть способ получения имен столбцов?

GET_VALUE 

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

Edit 1 - Вот мой код для вызова второго макроса -

set serveroutput on; 
DECLARE 
num_rows INTEGER; 
c INTEGER; 
i INTEGER; 
val1 VARCHAR2(100); 
BEGIN 
c := [email protected]_DBLINK; 
DBMS_OUTPUT.PUT_LINE('Cursor opened'); 
[email protected]_DBLINK(c, 'EXEC a_macro2 (?,?,?,?)'); 
DBMS_OUTPUT.PUT_LINE('command set for parse'); 
[email protected]_DBLINK(c,1,'123456789'); 
DBMS_OUTPUT.PUT_LINE('first variable bound'); 
[email protected]_DBLINK(c,2,'00001'); 
DBMS_OUTPUT.PUT_LINE('second variable bound'); 
[email protected]_DBLINK(c,3,'20161215'); 
DBMS_OUTPUT.PUT_LINE('third variable bound'); 
[email protected]_DBLINK(c,4,'15462250'); 
DBMS_OUTPUT.PUT_LINE('fourth variable bound'); 
num_rows := [email protected]_DBLINK(c); 
DBMS_OUTPUT.PUT_LINE(num_rows || ' Rows fetched'); 

LOOP 
    num_rows := [email protected]_DBLINK(c); 
    EXIT WHEN num_rows = 0; 
    i := 1; 
    loop 
     BEGIN 
     exit when i = 99; 
     [email protected]_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; 

[email protected]_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 возвращаются значения, которые с первым запросом второго макроса.

ответ

0

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

[email protected]_DBLINK(c, 'EXEC a_macro2(?,?,?,?,?)'); 

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

+0

Я попытался сделать это, и это возвращает результат только из первого запроса select, а не из последующих. –

+0

Можете ли вы опубликовать, как вы пробовали ... Поставьте свой код, пожалуйста, – XING

+0

Я добавил свой код к вопросу как редактирование. –