首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tdbc::标记文档和使用

tdbc::标记文档和使用
EN

Stack Overflow用户
提问于 2021-08-04 17:13:47
回答 2查看 64关注 0票数 2

我使用tdbc::odbc连接到一个普遍(btrieve类型)数据库,并且无法将变量传递给驱动程序。一个简短的测试片段:

代码语言:javascript
复制
set customer "100000"
set st [pvdb prepare {
    INSERT INTO CUSTOMER_TEMP_EMPTY
    SELECT * FROM CUSTOMER_MASTER
    WHERE CUSTOMER = :customer
}]
$st execute

这将返回:

PervasiveParameter号超出范围。(绑定“customer”参数)

如果我用"100000“替换”customer“,那么效果很好,我已经尝试用$使用一个变量,@,用撇号、引号、大括号来包装。我相信tdbc::tokenize是我正在寻找的答案,但是手册页没有给出关于它的使用的有用信息。我尝试过令牌化,但没有任何进展。有人能对此发表评论吗?

EN

回答 2

Stack Overflow用户

发布于 2021-08-05 07:18:15

tdbc::tokenize命令是编写TDBC驱动程序的助手。它用于计算SQL字符串中的绑定变量,这样绑定映射就可以提供给低级驱动程序,或者,对于特别愚蠢的驱动程序,可以执行字符串替换(我希望没有驱动程序需要这样做;很难正确处理)。解析器知道的足够多,可以处理一些奇怪的情况,比如字符串和注释中的绑定变量(这些不是绑定变量)。

如果我们向它提供示例SQL (它的调用语法非常简单),我们将得到以下结果:

代码语言:javascript
复制
{
    INSERT INTO CUSTOMER_TEMP_EMPTY
    SELECT * FROM CUSTOMER_MASTER
    WHERE CUSTOMER = } :customer {
}

这是一个由三个项组成的列表(最后一个元素中只有一个换行符),这大大简化了处理过程;每个项目要么是一个绑定变量,要么就不是一个绑定变量。

其他示例(请记住,在第二种情况下,绑定变量也可以以$@开头):

代码语言:javascript
复制
% tdbc::tokenize {':abc' = :abc = ":abc" -- :abc}
{':abc' = } :abc { = ":abc" -- :abc}
代码语言:javascript
复制
% tdbc::tokenize {foo + $bar - @grill}
{foo + } {$bar} { - } @grill
代码语言:javascript
复制
% tdbc::tokenize {foo + :bar + [:grill]}
{foo + } :bar { + [:grill]}

注意,令牌程序不完全理解SQL!它不试图解析其他位元;它只是在寻找绑定变量。

如果您不编写DB驱动程序,我不知道令牌程序对您有什么用处。

票数 0
EN

Stack Overflow用户

发布于 2021-08-05 15:15:26

仍然无法让驱动程序接受变量,但看看您的第一个令牌化返回示例,我得到了以下结果:

代码语言:javascript
复制
set customer "100000"
set v [tdbc::tokenize "$customer"]
set query "INSERT INTO CUSTOMER_TEMP_EMPTY SELECT * FROM CUSTOMER_MASTER WHERE CUSTOMER = $v"
set st [pvdb prepare $query]
$st execute

作为测试命令,它确实成功地通过驱动程序传递了该命令。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68655468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档