描述在IBM DB2中不起作用
我正在IBM DB2中运行查询;描述在IBM DB2中不起作用
DESCRIBE TABLE Schema.Table
但我得到一个错误
describe表Schema.Table错误42601:令牌表无效。有效令牌::。 SQLCODE = -104
我搜索了很多,但找不到原因,因为我在IBM DB2中很新,所以无法弄清楚这件事。这是一个权限相关的问题?
我没有命令提示符访问权限。
您似乎在IBM i(以前称为AS/400)上使用DB2,其中catalog views are in the QSYS2 schema。
在最近的版本中也有它们的等价物:SYSIBM.SQLCOLUMNS和INFORMATION_SCHEMA.COLUMNS。
@jmarkmurphy你是对的,我删除了该评论。 DESCRIBE在各种DB2平台上表现不同。 – mustaccio
如果您只是试图获取表或视图的目录信息,系统目录就可以正常工作,正如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';
你可以找到关于DESCRIBE TABLE
这里https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/db2/rbafzdescrtb.htm更多信息。知识中心还有关于ALLOCATE DESCRIPTOR
,DEALLOCATE DESCRIPTOR
和GET DESCRIPTOR
的信息。
这是一个大型机DB2(AS400?)吗? Afaik DESCRIBE只适用于UDB ... – dnoeth
我不确定。如果它不是大型机DB2,那么如何获取表的元数据?以及如何知道它是否是大型机DB2? –
使用'SYSIBM.SYSCOLUMNS'? – dnoeth