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