2016-04-25 86 views
0

我需要从Teradata中提取一些数据以便在R中进行处理。我有大约84 Dep/sec的键,其中大多数键的时间跨度不同,所以我的想法是创建一个Teradata中的存储过程将接受Dep,Sec和Dates作为参数。然后,我可以遍历R中每次调用SP的列表来创建我的数据集。从R脚本调用动态参数的Teradata存储过程

我为了测试这个想法而创建的SP是一个非常简单的SP,但是我无法让它工作。

CREATE PROCEDURE procTest4 (IntN integer) 
BEGIN 
CALL DBC.SysExecSQL('SELECT top' || IntN || '* 
from TableName'); 
END; 

Teradata确实创建了SP,但我不知道如何执行它并将参数传递给它。当我尝试: 呼叫procText4(10) 我得到以下错误:

5568:SQL语句是不是一个存储过程中的支持。

对我来说,唯一的其他选择是在R中创建SQL字符串,然后从那里运行它,但是有多次SQL创建易变表并且RODBC包似乎不喜欢它们,而且它是一个非常混乱的做法。

任何帮助,非常感谢。

+0

你可以用”用sysexecsql做一个SELECT。你需要打开/取出它。无论如何,你为什么还需要SP? –

+0

我想不出任何其他方式顶部传递我的参数?我需要查询是动态的。如果您有任何建议,我会很乐意尝试。干杯 – MidnightDataGeek

+0

除了'Select'你可以使用'Insert',首先你插入你的数据到一个临时表并查询它,然后我不明白你到底想要做什么,所以我只是猜测。 –

回答

3

返回使用动态SQL从存储过程的结果集的语法是有点复杂:

CREATE PROCEDURE procTest4 (IntN INTEGER) 
DYNAMIC RESULT SETS 1 
BEGIN 
    DECLARE SqlStr VARCHAR(1000); 
    DECLARE rslt CURSOR WITH RETURN ONLY FOR stmt; 
    SET SQLStr = 'SELECT top ' || IntN || ' * from TableName'; 
    PREPARE stmt FROM SqlStr; 
    OPEN rslt; 
END; 

但是,你应该仔细检查,如果你可以重写这些循环...

+0

真棒谢谢!我花了整整一天的时间在网上寻找解决方案并询问办公室周围,但似乎没有人使用SP的? 我的实际SQL查询大约200行,并且做了4次SQL传递,我是否天真地认为我可以简单地用真实查询替换上面的那个? 这也是在任何地方记录?我想更好地理解这一点,因为我花了很多时间提取数据用于R,我认为这会消除很多痛苦。 – MidnightDataGeek

+0

@MidnightDataGeek:看看* SQL存储过程和嵌入式SQL *,有例子:http://www.info.teradata.com/HTMLPubs/DB_TTU_14_00/SQL_Reference/B035_1148_111A/ch03.138.086.html但总是双倍检查sysntax是否不是嵌入式SQL – dnoeth