描述在 IBM DB2 中不起作用
Describe is not working in IBM DB2
我是 运行 IBM DB2 中的一个查询;
DESCRIBE TABLE Schema.Table
但是我收到一个错误
DESCRIBE TABLE Schema.Table 错误 42601:Token Table 无效。有效标记::. SQLCODE=-104
我搜索了很多,但找不到原因,因为我是 IBM DB2 的新手,所以无法弄清楚问题所在。它是与权限相关的问题吗?
我没有命令提示符访问权限。
您似乎在 IBM i(以前称为 AS/400)上使用 DB2,其中 catalog views are in the QSYS2 schema。
在最近的版本中还有它们的等价物:SYSIBM.SQLCOLUMNS and INFORMATION_SCHEMA.COLUMNS。
如果您只是想获取 table 或视图的目录信息,系统目录将正常工作,正如 mustaccio 在另一个答案中指出的那样。但是如果你想在你的 RPG 或 COBOL 程序中嵌入一个 DESCRIBE TABLE
,那也可以。您可能想要这样做的一个原因是,如果您有动态数量的列,或者您在编译时不知道 table 名称。您可以使用通过描述 table 或游标构建的 sql 描述符来接收程序中 FETCH
语句的输出。您将需要 SQL Descriptor
或 SQLDA
来接收 table 的描述。它看起来像这样:
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';
这会将有关 table 的信息检索到指定的描述符中。在这种情况下 D1
。描述符名称可以是主变量。此示例为 20 个项目分配 local
描述符。如果您的 table 超过 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
的信息。
我是 运行 IBM DB2 中的一个查询;
DESCRIBE TABLE Schema.Table
但是我收到一个错误
DESCRIBE TABLE Schema.Table 错误 42601:Token Table 无效。有效标记::. SQLCODE=-104
我搜索了很多,但找不到原因,因为我是 IBM DB2 的新手,所以无法弄清楚问题所在。它是与权限相关的问题吗?
我没有命令提示符访问权限。
您似乎在 IBM i(以前称为 AS/400)上使用 DB2,其中 catalog views are in the QSYS2 schema。
在最近的版本中还有它们的等价物:SYSIBM.SQLCOLUMNS and INFORMATION_SCHEMA.COLUMNS。
如果您只是想获取 table 或视图的目录信息,系统目录将正常工作,正如 mustaccio 在另一个答案中指出的那样。但是如果你想在你的 RPG 或 COBOL 程序中嵌入一个 DESCRIBE TABLE
,那也可以。您可能想要这样做的一个原因是,如果您有动态数量的列,或者您在编译时不知道 table 名称。您可以使用通过描述 table 或游标构建的 sql 描述符来接收程序中 FETCH
语句的输出。您将需要 SQL Descriptor
或 SQLDA
来接收 table 的描述。它看起来像这样:
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';
这会将有关 table 的信息检索到指定的描述符中。在这种情况下 D1
。描述符名称可以是主变量。此示例为 20 个项目分配 local
描述符。如果您的 table 超过 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
的信息。