关于BD2 SQLCODE -206的问题

showdance 2011-12-14 11:08:00
开始学习使用DB2,发现个很怪异的问题。
比如我有一个表 存在 ID 和 V_name字段。当我用 select ID from 表 时就能查出数据。 用 select V_name from 表时 就提示-206错误,该列不在上下文里。很奇怪,当我用 select 'v_name' as v_name from 表时 又能得到该列记录。
现在 我想更新 update 表 set v_name='11' 又提示我同样的错误。这个以前在别的数据库里没有遇到过。不知道如何是好。希望达人帮忙解惑。
...全文
1880 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuyunhai 2011-12-15
  • 打赏
  • 举报
回复
我也不清楚为什么db2这么设计

实际应用主要是多想些例子测试一下就明白了

[Quote=引用 13 楼 showdance 的回复:]
原来是这个原理,明白了,看来是建表的时候某些地方我可能需要再看看。非常感谢您。给分。

引用 12 楼 shuyunhai 的回复:


引用 11 楼 showdance 的回复:
CREATE TABLE "ZHAOYU "."CTABLE" (
"ID" BIGINT NOT NULL ,
"personName" VARCHAR(30) NOT NULL )
IN "US……
[/Quote]
showdance 2011-12-15
  • 打赏
  • 举报
回复
原来是这个原理,明白了,看来是建表的时候某些地方我可能需要再看看。非常感谢您。给分。
[Quote=引用 12 楼 shuyunhai 的回复:]


引用 11 楼 showdance 的回复:
CREATE TABLE "ZHAOYU "."CTABLE" (
"ID" BIGINT NOT NULL ,
"personName" VARCHAR(30) NOT NULL )
IN "USERSPACE1" ;


看了你的脚本 就是我在8楼说的 :

你建表时加了双引号,这样是区分大小写的。执行 SELECT COLNA……
[/Quote]
showdance 2011-12-14
  • 打赏
  • 举报
回复
这个是我笔误 ,我 select c.v_name from 表 c 也不可以。为什么呢。[Quote=引用 2 楼 mr_bean 的回复:]

那你这列肯定就叫 'v_name'
[/Quote]
showdance 2011-12-14
  • 打赏
  • 举报
回复
确实有字段,我就俩字段测试用的。[Quote=引用 1 楼 zhaojianmi1 的回复:]

select * from 表
看看有没有v_name这一列
[/Quote]
showdance 2011-12-14
  • 打赏
  • 举报
回复
我这样 select c.v_name from ctable c 也是提示这样的问题。很不清楚了。
Mr_Bean 2011-12-14
  • 打赏
  • 举报
回复
那你这列肯定就叫 'v_name'
zhaojianmi1 2011-12-14
  • 打赏
  • 举报
回复
select * from 表
看看有没有v_name这一列
shuyunhai 2011-12-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 showdance 的回复:]
CREATE TABLE "ZHAOYU "."CTABLE" (
"ID" BIGINT NOT NULL ,
"personName" VARCHAR(30) NOT NULL )
IN "USERSPACE1" ;
[/Quote]

看了你的脚本 就是我在8楼说的 :

你建表时加了双引号,这样是区分大小写的。执行 SELECT COLNAME FROM SYSCAT.COLUMNS WHERE TABNAME LIKE '%CTABLE%
结果是:
ID
personName

而你在查询的时候执行select ID,personName from ZHAOYU.CTABLE,
db2会自动把引用的列转成大写,实际你执行的是select ID,PERSONNAME from ZHAOYU.CTABLE
显然是PERSONNAME这列是不存在的所以会报错,如果执行select id from ZHAOYU.CTABLE不会报错是因为ID这列存在。

在当前的表结构下你需要把引用的列加双引号才能访问。
select ID,"personName" from ZHAOYU.CTABLE

另外一种方法把建表脚本改成
CREATE TABLE ZHAOYU.CTABLE (
ID BIGINT NOT NULL ,
personName VARCHAR(30) NOT NULL )
IN USERSPACE1;
db2建表会将相关信息自动转成大写,这样和查询时的机制一样,
相当于对表名和列名的大小写不敏感了,就不会报错了





showdance 2011-12-14
  • 打赏
  • 举报
回复
如上,帮忙分析下谢谢
-- 此 CLP 文件是使用 DB2LOOK 版本 "9.7" 创建的

-- 时间戳记: 2011-12-14 17:57:09

-- 数据库名称: ZWDB

-- 数据库管理器版本: DB2/NT Version 9.7.2

-- 数据库代码页: 1208

-- 数据库整理顺序为: SYSTEM_1386





CONNECT TO ZWDB;







-- 模拟表空间



ALTER TABLESPACE SYSCATSPACE

PREFETCHSIZE AUTOMATIC

OVERHEAD 7.500000

NO FILE SYSTEM CACHING

AUTORESIZE YES

TRANSFERRATE 0.060000;





ALTER TABLESPACE TEMPSPACE1

PREFETCHSIZE AUTOMATIC

OVERHEAD 7.500000

FILE SYSTEM CACHING

TRANSFERRATE 0.060000;





ALTER TABLESPACE USERSPACE1

PREFETCHSIZE AUTOMATIC

OVERHEAD 7.500000

NO FILE SYSTEM CACHING

AUTORESIZE YES

TRANSFERRATE 0.060000;





------------------------------------------------

-- 表的 DDL 语句 "ZHAOYU "."CTABLE"

------------------------------------------------





CREATE TABLE "ZHAOYU "."CTABLE" (

"ID" BIGINT NOT NULL ,

"personName" VARCHAR(30) NOT NULL )

IN "USERSPACE1" ;

























--------------------------------------------

-- 表/视图上的权限语句

--------------------------------------------





GRANT CONTROL ON TABLE "ZHAOYU "."CTABLE" TO PUBLIC ;



GRANT CONTROL ON TABLE "ZHAOYU "."CTABLE" TO USER "DB2ADMIN" ;



COMMIT WORK;



CONNECT RESET;



TERMINATE;



-- 为所有创建程序生成统计信息

-- db2look 实用程序将只考虑指定的表

-- 正在创建表的 DDL

;

[Quote=引用 10 楼 shuyunhai 的回复:]

贴一下你建表脚本的列定义部分
引用 9 楼 showdance 的回复:
我看了我的表 是两个字段 id 和V_name .这个可能我描述的问题,我现在 直接用 select v_name from 表 w就提示我-206 也就是 上下文无效的错误信息。但是我查ID就能查出来。我刚又建立了个表 可能是我哪里做了一些调整,现在新建立的表可以 查询 V_name 但是无法进行如下的插入。
in……
[/Quote]
shuyunhai 2011-12-14
  • 打赏
  • 举报
回复
贴一下你建表脚本的列定义部分
[Quote=引用 9 楼 showdance 的回复:]
我看了我的表 是两个字段 id 和V_name .这个可能我描述的问题,我现在 直接用 select v_name from 表 w就提示我-206 也就是 上下文无效的错误信息。但是我查ID就能查出来。我刚又建立了个表 可能是我哪里做了一些调整,现在新建立的表可以 查询 V_name 但是无法进行如下的插入。
insert into db2admin."BTABLE"(db2admin."BT……
[/Quote]
showdance 2011-12-14
  • 打赏
  • 举报
回复
我看了我的表 是两个字段 id 和V_name .这个可能我描述的问题,我现在 直接用 select v_name from 表 w就提示我-206 也就是 上下文无效的错误信息。但是我查ID就能查出来。我刚又建立了个表 可能是我哪里做了一些调整,现在新建立的表可以 查询 V_name 但是无法进行如下的插入。
insert into db2admin."BTABLE"(db2admin."BTABLE"."id",db2admin."BTABLE"."name") values (2,'333');
但是 insert into db2admin."BTABLE" values (2,'333'); 就好使。很纳闷啊。
[Quote=引用 8 楼 shuyunhai 的回复:]

引用 7 楼 showdance 的回复:
试了,是空内容,这个是为什么。我用的是连接数据库的工具做的查询,不知道是不是建立表的时候有疏漏。谢谢。

引用 6 楼 shuyunhai 的回复:

查查 SELECT COLNAME FROM SYSCAT.COLUMNS WHERE TABNAME LIKE '%表名%'


这个语句需要把表名换成你用的那个表,查一下表在数据库里……
[/Quote]
shuyunhai 2011-12-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 showdance 的回复:]
试了,是空内容,这个是为什么。我用的是连接数据库的工具做的查询,不知道是不是建立表的时候有疏漏。谢谢。

引用 6 楼 shuyunhai 的回复:

查查 SELECT COLNAME FROM SYSCAT.COLUMNS WHERE TABNAME LIKE '%表名%'
[/Quote]

这个语句需要把表名换成你用的那个表,查一下表在数据库里的列名

应该是你在建表的时候列名加了双引号,而db2查询的时候会按大写的列名称去查SYSCAT.COLUMNS

按照你说的问题办法有两个:
1.列名加双引号 select "V_name" from 表

2.重建表 把双引号去掉

应该可以解决
showdance 2011-12-14
  • 打赏
  • 举报
回复
试了,是空内容,这个是为什么。我用的是连接数据库的工具做的查询,不知道是不是建立表的时候有疏漏。谢谢。[Quote=引用 6 楼 shuyunhai 的回复:]

查查 SELECT COLNAME FROM SYSCAT.COLUMNS WHERE TABNAME LIKE '%表名%'
[/Quote]
shuyunhai 2011-12-14
  • 打赏
  • 举报
回复
查查 SELECT COLNAME FROM SYSCAT.COLUMNS WHERE TABNAME LIKE '%表名%'

5,889

社区成员

发帖
与我相关
我的任务
社区描述
IBM DB2 是美国IBM公司开发的一套关系型数据库管理系统,它主要的运行环境为UNIX(包括IBM自家的AIX)、Linux、IBM i(旧称OS/400)、z/OS,以及Windows服务器版本
社区管理员
  • DB2
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧