场景:
表1在图书馆
lib1
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 中,它也可以工作。
看看不合格的别名、约束、外部程序、索引、掩码、节点组、包、权限、序列、表、触发器、视图和 XSR 对象名称
不合格的别名、约束、外部程序、索引、掩码、 节点组、包、权限、序列、表、触发器、视图和 XSR 对象名称由默认架构隐式限定。
默认架构指定如下:
对于静态 SQL 语句:
- 如果在 CRTSQLxxx 命令(或使用 SET OPTION 语句)上指定了 DFTRDBCOL 参数,则默认架构为 为该参数指定的架构名称。
- 在所有其他情况下,默认架构基于命名约定。对于 SQL 命名,默认 schema 是授权 语句的标识符。
对于系统命名,默认模式是作业库列表(*LIBL)。
- 对于动态 SQL 语句,默认模式取决于是否已显式指定默认模式。其机制为 明确指定这取决于所使用的接口 动态准备和执行 SQL 语句。
- 如果未显式指定默认架构:对于 SQL 命名,默认架构是运行时授权标识符。为了 系统命名,默认模式是作业库列表(*LIBL)。
您可能想要添加
exec sql
set option
NAMING = *SYS,
DFTRDBCOL = *NONE;