我在 IBM DB2 中运行查询作为;
DESCRIBE TABLE Schema.Table
但是我收到一个错误,因为
描述表 架构。表错误 42601:令牌表无效。有效令牌::。SQLCODE=-104
我搜索了很多,但找不到原因,因为我是IBM DB2的新手,所以无法弄清楚这个问题。是与权限相关的问题吗?
我没有命令提示符访问权限。
您似乎正在使用 IBM i 上的 DB2(以前称为 AS/400),其中目录视图位于 QSYS2 模式中。
在最近的版本中,也有它们的等效版本:SYSIBM。SQLCOLUMNS 和 INFORMATION_SCHEMA。列。
如果您只是尝试获取表或视图的目录信息,则系统目录将正常工作,如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
的信息。