描述在 IBM DB2 中不起作用

Describe is not working in IBM DB2

我是 运行 IBM DB2 中的一个查询;

DESCRIBE TABLE Schema.Table

但是我收到一个错误

DESCRIBE TABLE Schema.Table 错误 42601:Token Table 无效。有效标记::. SQLCODE=-104

我搜索了很多,但找不到原因,因为我是 IBM DB2 的新手,所以无法弄清楚问题所在。它是与权限相关的问题吗?

我没有命令提示符访问权限。

您似乎在 IBM i(以前称为 AS/400)上使用 DB2,其中 catalog views are in the QSYS2 schema

在最近的版本中还有它们的等价物:SYSIBM.SQLCOLUMNS and INFORMATION_SCHEMA.COLUMNS

如果您只是想获取 table 或视图的目录信息,系统目录将正常工作,正如 mustaccio 在另一个答案中指出的那样。但是如果你想在你的 RPG 或 COBOL 程序中嵌入一个 DESCRIBE TABLE,那也可以。您可能想要这样做的一个原因是,如果您有动态数量的列,或者您在编译时不知道 table 名称。您可以使用通过描述 table 或游标构建的 sql 描述符来接收程序中 FETCH 语句的输出。您将需要 SQL DescriptorSQLDA 来接收 table 的描述。它看起来像这样:

dcl-s tableName     Varchar(128);

exec sql allocate sql descriptor 'D1' with max 20;

tableName = 'MYTABLE';
exec sql
  describe table :tableName
    using sql descriptor 'D1';

这会将有关 table 的信息检索到指定的描述符中。在这种情况下 D1。描述符名称可以是主变量。此示例为 20 个项目分配 local 描述符。如果您的 table 超过 20 列,您可以在 ALLOCATE DESCRIPTOR 语句中请求更大的描述符。如果您要在多个模块中传播使用给定描述符的 sql,则需要通过将 'D1' 替换为 global 'D1' 来使用全局描述符。您也可以使用 SQLDA,但我发现这些可能更难处理。

要从描述符中获取信息,您可以使用 GET DESCRIPTOR。详细介绍您可以从描述符中获取的内容超出了本网站的范围,但作为示例,您可以像这样获取 MYTABLE 第一列的列名:

dcl-s columnName     Varchar(128) Inz('');

exec sql
  get sql descriptor 'D1'
    value 1 :columnName = name;

不要忘记在使用完描述符后释放它。

exec sql deallocate sql descriptor 'D1';

您可以在此处 https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/db2/rbafzdescrtb.htm 找到有关 DESCRIBE TABLE 的更多信息。知识中心还有关于ALLOCATE DESCRIPTORDEALLOCATE DESCRIPTORGET DESCRIPTOR的信息。