在用户手册对objByName有如下说明:
DolphinDB在执行脚本之前先解析脚本。解析脚本的过程是检查变量是否在本地定义。如果没有在本地定义,则抛出异常。 假设我们在本地定义一个函数,然后在远程节点上执行。这个函数会查询共享表。但是,共享表在远程节点上而不在本地节点上。如果我们在函数的SQL语句中直接调用表名,系统将不能解析脚本。 为了解决这个问题,系统函数objByName在执行时会根据名称返回对象。如果没有指定sharedVar,系统首先搜索会话中的局部变量,再搜索共享变量。如果sharedVar为true,表示只搜索共享变量。如果sharedVar为false,表示只搜索局部变量。
简单的说,objByName优先搜索节点中定义的共享变量,然后再去搜索当前会话中定义的变量,不会去搜索函数内部定义的的局部变量。parseExpr中的变量搜索同objByName。
要解决上面的代码的问题,可以使用sql函数动态生成:
def myfunc(){ t1 = table(1..100 as id) return sql(sqlCol("*"), t1, <id in 1..10>).eval() } myfunc()