【问题标题】:Call teradata macro having multiple select queries from PL/SQL从 PL/SQL 调用具有多个选择查询的 teradata 宏
【发布时间】:2017-04-30 13:11:06
【问题描述】:

我正在尝试从 plsql 过程中调用在 teradata 中定义的宏,通过在线搜索各种博客,我能够设计以下过程来调用并从仅包含单个选择查询的所有宏中获取值,但是如果我使用相同的技术从可能包含多个查询的宏中获取值,然后仅获取第一个查询的结果。

宏(单个查询)-

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个值,来自第二个宏的第一个查询。

【问题讨论】:

    标签: oracle plsql macros teradata dblink


    【解决方案1】:

    要使您的代码适用于下一个宏,只需在此步骤进行更改:

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

    不要忘记添加绑定变量作为传递的参数数量。

    【讨论】:

    • 我确实尝试过这样做,但这只会返回第一个选择查询的输出,而不是后续的输出。
    • 我不确定 teradata 宏是如何工作的,但您可以看到我的答案,我将 5 次 ? 传递给宏。我看到当你的宏 1 有 3 个参数时,你传递了 4 次 ?。现在,由于你的宏 2 有 4 个参数,你必须传递 5 次 ?
    • 不,抱歉,这是一个错字。我过去了?宏 1 中 3 次,宏 2 中 4 次
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2016-01-27
    • 1970-01-01
    • 2022-12-08
    • 2013-10-04
    • 2013-05-03
    • 2017-01-23
    相关资源
    最近更新 更多