【问题标题】:Is it possible to use a DB2 variable without specifying its schema?是否可以在不指定模式的情况下使用 DB2 变量?
【发布时间】:2018-10-29 15:42:52
【问题描述】:

通过使用与 DB2 的 JDBC 连接,我使用 URL jdbc:db2://192.168.56.208:50000/db001:currentSchema=TZTC; 指定了默认模式。然后,我在默认模式中创建了一个 DB2 变量:

create variable my_var1 smallint default 1;

但是,当我尝试设置或显示它时,我不得不指定它的架构名称。当我尝试时它失败了:

set my_var1 = 123;
Error: DB2 SQL Error: SQLCODE=-206, SQLSTATE=42703, SQLERRMC=MY_VAR1, DRIVER=3.53.95

select my_var1 from sysibm.sysdummy1;
Error: DB2 SQL Error: SQLCODE=-206, SQLSTATE=42703, SQLERRMC=MY_VAR1, DRIVER=3.53.95

但是,如果我指定架构名称,一切正常:

set tztc.my_var1 = 123; -- works
select tztc.my_var1 from sysibm.sysdummy1; -- returns 123

是否可以在不指定模式的情况下使用 DB2 变量?我宁愿让它像项目中的所有其他 SQL 代码一样保持无模式。

【问题讨论】:

    标签: sql db2


    【解决方案1】:

    Variables always are created in a schema,或者explicitly or implicitly。如果您在同一个模式中,您应该能够在没有模式名称的情况下引用变量。因此,应该可以按照您的要求以无模式的方式实现它。

    docs have the rules 关于如何解析变量名。

    请注意,模块中定义的变量和常规 SQL(语句)上下文中定义的变量之间存在差异。

    【讨论】:

    • 看了你说的规则,我觉得可能是JDBC驱动有bug。该 URL 包括 :currentSchema=TZTC;,适用于表和视图,但在查询变量时,它似乎默认为另一个架构:USER1(这是我创建的第一个架构)。
    • 根据上面提供的链接,在sql路径中搜索的非限定全局变量的架构名称,当前架构不用于此类解析。您的架构名称必须列在“currentFunctionPath”属性中。
    【解决方案2】:

    限定变量适用于 iseries db2。

    create variable mylib.my_var1 smallint default 1;
    set mylib.my_var1 = 12;
    

    这也适用于 iseries db2。

    create variable danny117 smallint default 1;
    set danny117 = 12;
    drop variable danny117;
    

    【讨论】:

    • 在尝试了几个选项之后,问题似乎是当您在非默认模式中创建/使用非限定变量(您的第二种情况)时,当使用“SET当前架构 = 架构 2"。
    • 是的,这可能会发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多