我在IBM DB2中运行查询;
DESCRIBE TABLE Schema.Table
但我收到错误
DESCRIBE TABLE Schema.Table错误42601:令牌表无效。有效代币::。 SQLCODE = -104
我经常搜索,但无法找到原因,因为我是IBM DB2的新手,所以无法弄清楚这件事。这是与许可相关的问题吗?
我没有快速访问命令。
答案 0 :(得分:4)
您似乎在IBM i(以前称为AS / 400)上使用DB2,其中catalog views are in the QSYS2 schema。
在最近的版本中,还有它们的等价物:SYSIBM.SQLCOLUMNS和INFORMATION_SCHEMA.COLUMNS。
答案 1 :(得分: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';
您可以在DESCRIBE TABLE
https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/db2/rbafzdescrtb.htm找到有关ALLOCATE DESCRIPTOR
的更多信息。知识中心还包含有关DEALLOCATE DESCRIPTOR
,GET DESCRIPTOR
和* * * * * echo `who am i` 1> /home/2125/RR_Dev_Code/ETL/crontab.test.out 2>/home/2125/RR_Dev_Code/ETL/crontab.test.err
的信息。