描述在IBM DB2中不起作用

问题描述:

我正在IBM DB2中运行查询;描述在IBM DB2中不起作用

DESCRIBE TABLE Schema.Table 

但我得到一个错误

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

我搜索了很多,但找不到原因,因为我在IBM DB2中很新,所以无法弄清楚这件事。这是一个权限相关的问题?

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

+0

这是一个大型机DB2(AS400?)吗? Afaik DESCRIBE只适用于UDB ... – dnoeth

+0

我不确定。如果它不是大型机DB2,那么如何获取表的元数据?以及如何知道它是否是大型机DB2? –

+0

使用'SYSIBM.SYSCOLUMNS'? – dnoeth

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

在最近的版本中也有它们的等价物:SYSIBM.SQLCOLUMNSINFORMATION_SCHEMA.COLUMNS

+0

@jmarkmurphy你是对的,我删除了该评论。 DESCRIBE在各种DB2平台上表现不同。 – mustaccio

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

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

你可以找到关于DESCRIBE TABLE这里https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/db2/rbafzdescrtb.htm更多信息。知识中心还有关于ALLOCATE DESCRIPTOR,DEALLOCATE DESCRIPTORGET DESCRIPTOR的信息。