在 IBM Power Systems / AS400 上,使用动态 SQL 时在库列表中找不到文件

问题描述 投票:0回答:1

场景:
表1在图书馆

lib1

表2在图书馆
lib2

库列表设置为lib1、lib2

当我使用动态 SQL 时,例如:

sqlcmd =  'select ''1'' from table1 a join table2 b on a.id = b.id';
    exec sql PREPARE S1 FROM :sqlCMD;
    exec sql DECLARE C1 scroll CURSOR FOR S1;
    exec sql OPEN C1;
    exec sql fetch C1 into :CharField;

我收到错误 table2 找不到。

如果我像这样使用静态 SQL:

select '1' into :CharField from table1 a join table2 b on a.id = b.id

它确实有效。为什么? 是否有 SQL 选项可以更改此行为?

如果我使用:

from lib1.table1 a join lib2.table2 b on a.id = b.id

在动态 SQL 中,它也可以工作。

sql ibm-midrange
1个回答
0
投票

看看不合格的别名、约束、外部程序、索引、掩码、节点组、包、权限、序列、表、触发器、视图和 XSR 对象名称

不合格的别名、约束、外部程序、索引、掩码、 节点组、包、权限、序列、表、触发器、视图和 XSR 对象名称由默认架构隐式限定。

默认架构指定如下:

对于静态 SQL 语句:

  • 如果在 CRTSQLxxx 命令(或使用 SET OPTION 语句)上指定了 DFTRDBCOL 参数,则默认架构为 为该参数指定的架构名称。
  • 在所有其他情况下,默认架构基于命名约定。对于 SQL 命名,默认 schema 是授权 语句的标识符。

对于系统命名,默认模式是作业库列表(*LIBL)。

  • 对于动态 SQL 语句,默认模式取决于是否已显式指定默认模式。其机制为 明确指定这取决于所使用的接口 动态准备和执行 SQL 语句。
  • 如果未显式指定默认架构:对于 SQL 命名,默认架构是运行时授权标识符。为了 系统命名,默认模式是作业库列表(*LIBL)。

您可能想要添加

exec sql
  set option
   NAMING = *SYS,
   DFTRDBCOL = *NONE;
© www.soinside.com 2019 - 2024. All rights reserved.