Describe 在 IBM DB2 中不起作用

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

我正在 IBM DB2 中运行查询:

DESCRIBE TABLE Schema.Table

但是我收到一个错误

描述表 Schema.Table 错误 42601:令牌表无效。有效令牌::. SQLCODE=-104

我搜索了很多,但找不到原因,而且由于我是 IBM DB2 的新手,所以无法弄清楚问题。这是一个与权限相关的问题吗?

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

sql db2 ibm-midrange db2-400
3个回答
4
投票

您似乎正在 IBM i(以前称为 AS/400)上使用 DB2,其中 目录视图位于 QSYS2 模式中

在最近的版本中还有它们的等效项:SYSIBM.SQLCOLUMNSINFORMATION_SCHEMA.COLUMNS


3
投票

如果您只是尝试获取表或视图的目录信息,系统目录将工作得很好,如 Mustaccio 的另一个答案中所述。但如果您想在 RPG 或 COBOL 程序中嵌入

DESCRIBE TABLE
,那也可以。您可能想要这样做的原因之一是,如果您有动态数量的列,或者您在编译时不知道表名称。您可以使用通过描述表或游标构建的 sql 描述符来接收程序中
FETCH
语句的输出。您将需要
SQL Descriptor
SQLDA
来接收表格的说明。它看起来像这样:

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';

这会将有关表的信息检索到指定的描述符中。在这种情况下

D1
。描述符名称可以是主机变量。此示例为 20 个项目分配一个
local
描述符。如果您的表超过 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 DESCRIPTOR
DEALLOCATE DESCRIPTOR
GET DESCRIPTOR
的信息。


0
投票

这对我有用

从 SYSIBM.SQLCOLUMNS 选择 *,其中 table_schem = 'SCHEMA' 且 table_name = 'TABLE';

© www.soinside.com 2019 - 2024. All rights reserved.