ORA-00932: 数据类型不一致: 应为 NUMBER, 但却获得 CHAR\nORA-06512

phillip629 2019-07-10 10:58:35
strsql:='create table result as SELECT a.OrgCode,a.OrgName, a.NumberOfPeople, a.MedNum, a.CurrOccupationRatio
, CASE
WHEN a.CurrOccupationRatio - a.LastOccupationRatio < 0 THEN '||'-'||' CAST(a.LastOccupationRatio - a.CurrOccupationRatio AS varchar(100))
WHEN a.CurrOccupationRatio - a.LastOccupationRatio = 0 THEN 0.00
ELSE '||'+'||' CAST(a.CurrOccupationRatio - a.LastOccupationRatio AS varchar(100))
END AS YearIncrease
, CASE
WHEN a.CurrOccupationRatio - a.qgOccupationRatio < 0 THEN '||'-'||' CAST(a.qgOccupationRatio - a.CurrOccupationRatio AS varchar(100))
WHEN a.CurrOccupationRatio - a.qgOccupationRatio = 0 THEN 0.00
ELSE '||'+'||' CAST(a.CurrOccupationRatio - a.qgOccupationRatio AS varchar(100))
END AS QgIncrease
FROM (
SELECT a.OrgCode,a.OrgName, a.NumberOfPeople
, (
SELECT COUNT(1)
FROM temp b
WHERE a.orgName=b.orgName
) AS MedNum
, CASE
WHEN nvl(a.numberofpeople, CAST(0 AS number)) = 0 THEN CAST(0 AS decimal(18, 2))
ELSE CAST((
SELECT COUNT(1)
FROM temp b
WHERE a.orgName=b.orgName
) / (CAST(a.numberofpeople AS decimal) / 1000) * 100 AS decimal(18, 2))
END AS CurrOccupationRatio
, CASE
WHEN nvl(a.numberofpeople, CAST(0 AS number)) = 0 THEN CAST(0 AS decimal(18, 2))
ELSE CAST((
SELECT COUNT(1)
FROM temp1 b
WHERE a.orgName=b.orgName
) / (CAST(a.numberofpeople AS decimal) / 1000) * 100 AS decimal(18, 2))
END AS LastOccupationRatio, CAST((
SELECT COUNT(1)
FROM jg_info b
WHERE isfz = 1
AND to_char(b.passdate,''yyyy'')='||yearr||'
) / (CAST((
SELECT SUM(numberofpeople)
FROM KgOrgs where LV=1
) AS decimal) / 1000) * 100 AS decimal(18, 2)) AS qgOccupationRatio
FROM tempOrgs a
) a ';
execute immediate strsql;
...全文
5583 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
就等你一会儿 2019-07-12
  • 打赏
  • 举报
回复
复制加积分,不好意思(把相关的表结构贴上来,要 create table 形式的,方便大家帮你调试。)
kiss阳光 2019-07-11
  • 打赏
  • 举报
回复
case when 后的then 的类型不一致,一个是varchar2,一个是number,应该是varchar2 的'0.00'
phillip629 2019-07-11
  • 打赏
  • 举报
回复
谢谢了啊,问题已近解决了
qq274786217 2019-07-11
  • 打赏
  • 举报
回复
这么多代码你贴出来大家给你找也很难受。你可以把有问题的sql分几部分注释。然后再分下来几次。就能精准定位了,在具体分析。
phillip629 2019-07-10
  • 打赏
  • 举报
回复
CREATE TABLE jg_info ( unitguid NVARCHAR2 ( 16 ) NOT NULL, unitname NVARCHAR2 ( 100 ) NOT NULL, addr NVARCHAR2 ( 200 ) NOT NULL, postcode NVARCHAR2 ( 6 ) NULL, c_syzxs NVARCHAR2 ( 10 ) NOT NULL, c_jglb NVARCHAR2 ( 10 ) NOT NULL, c_jgjb NVARCHAR2 ( 10 ) NOT NULL, c_jgdc NVARCHAR2 ( 10 ) NOT NULL, naturebusi NVARCHAR2 ( 10 ) NOT NULL, c_fwdx NVARCHAR2 ( 10 ) NOT NULL, c_cws NVARCHAR2 ( 10 ) NOT NULL, c_yys NVARCHAR2 ( 10 ) NULL, c_zczj NVARCHAR2 ( 20 ) NOT NULL, fridname NVARCHAR2 ( 50 ) NOT NULL, fridcard NVARCHAR2 ( 20 ) NOT NULL, fzname NVARCHAR2 ( 50 ) NOT NULL, fzridcard NVARCHAR2 ( 20 ) NOT NULL, datevalidbegin DATE NOT NULL, datevaliend DATE NOT NULL, unitregcode NVARCHAR2 ( 100 ) NOT NULL, organid NVARCHAR2 ( 128 ) NULL, organnme NVARCHAR2 ( 50 ) NOT NULL, passdate DATE NULL, subject_name CLOB NOT NULL, subjectcode CLOB NULL, certificate NVARCHAR2 ( 500 ) NULL, private NVARCHAR2 ( 128 ) NULL, province NVARCHAR2 ( 50 ) NOT NULL, provincecode NVARCHAR2 ( 50 ) NULL, comm CLOB NULL, rsvd CLOB NULL, isbg NVARCHAR2 ( 2 ) NOT NULL, isqz NVARCHAR2 ( 2 ) NOT NULL, isfz NVARCHAR2 ( 2 ) NOT NULL, provinceOrgName NVARCHAR2 ( 50 ) NULL, city NVARCHAR2 ( 50 ) NULL, county NVARCHAR2 ( 50 ) NULL, CONSTRAINT jg_info_PK PRIMARY KEY ( unitguid ) ); temp:='create table temp( unitguid varchar2(16), isfz varchar2(2), passdate date, orgName varchar2(50) )'; execute immediate temp; temp1:='create table temp1 ( unitguid varchar2(100) ,isfz varchar2(2) ,passdate date ,orgName varchar2(50) )'; CREATE TABLE KgOrgs( OrgGuid CHAR(36) NOT NULL, OrgName CLOB NULL, OrgCode CLOB NULL, "Level" int NOT NULL, ParentOrgCode CLOB NULL, ParentOrgLevelCode CLOB NULL, NumberOfPeople NUMBER(19,0) NULL, CONSTRAINT KgOrgs PRIMARY KEY ( OrgGuid ) ); tempOrgs 表就是KgOrgs
phillip629 2019-07-10
  • 打赏
  • 举报
回复
case when then 后面数据记过cast后类型已经一致,由于cast数据在字符串中,不知是否已经自动转化为字符串,最终导致数据不一致
ZJHZ_叶 2019-07-10
  • 打赏
  • 举报
回复
你把语句输出出来然后执行select语句,看看问题在哪就可以了
卖水果的net 2019-07-10
  • 打赏
  • 举报
回复
把相关的表结构贴上来,要 create table 形式的,方便大家帮你调试。
ZJHZ_叶 2019-07-10
  • 打赏
  • 举报
回复
case when
then 后面的类型不一致
ZJHZ_叶 2019-07-10
  • 打赏
  • 举报
回复
执行后报错,光标会停在报错的附近位置,你就知道那里可能有错了
ZJHZ_叶 2019-07-10
  • 打赏
  • 举报
回复
strsql:='create table result as SELECT a.OrgCode,a.OrgName, a.NumberOfPeople, a.MedNum, a.CurrOccupationRatio
, CASE
WHEN (a.CurrOccupationRatio - a.LastOccupationRatio) < 0 THEN ''-''|| CAST((a.LastOccupationRatio - a.CurrOccupationRatio) AS varchar2(100))
WHEN (a.CurrOccupationRatio - a.LastOccupationRatio) = 0 THEN ''0.00''
ELSE ''+''||CAST((a.CurrOccupationRatio - a.LastOccupationRatio) AS varchar2(100))
END AS YearIncrease
, CASE
WHEN (a.CurrOccupationRatio - a.qgOccupationRatio) < 0 THEN ''-''|| CAST((a.qgOccupationRatio - a.CurrOccupationRatio) AS varchar2(100))
WHEN (a.CurrOccupationRatio - a.qgOccupationRatio) = 0 THEN ''0.00''
ELSE ''+''|| CAST((a.CurrOccupationRatio - a.qgOccupationRatio) AS varchar2(100))
END AS QgIncrease
FROM (
SELECT a.OrgCode,a.OrgName, a.NumberOfPeople
, (
SELECT COUNT(1)
FROM temp b
WHERE to_char(a.orgName)=b.orgName
) AS MedNum
, CASE
WHEN nvl(a.numberofpeople,CAST(0 AS number)) = 0 THEN CAST(0 AS number)
ELSE CAST((
SELECT COUNT(1)
FROM temp b
WHERE to_char(a.orgName)=b.orgName
) / (CAST(a.numberofpeople AS decimal) / 1000) * 100 AS decimal(18, 2))
END AS CurrOccupationRatio
, CASE
WHEN nvl(a.numberofpeople, CAST(0 AS number)) = 0 THEN CAST(0 AS number)
ELSE CAST((
SELECT COUNT(1)
FROM temp1 b
WHERE to_char(a.orgName) =b.orgName
) / (CAST(a.numberofpeople AS decimal) / 1000) * 100 AS decimal(18, 2))
END AS LastOccupationRatio, CAST((
SELECT COUNT(1)
FROM jg_info b
WHERE isfz = 1
AND to_char(b.passdate,''yyyy'')='||yearr||'
) / (CAST((
SELECT SUM(numberofpeople)
FROM KgOrgs where LV=1
) AS decimal) / 1000) * 100 AS decimal(18, 2)) AS qgOccupationRatio
FROM tempOrgs a
) a ';
phillip629 2019-07-10
  • 打赏
  • 举报
回复
不加'||to_char('-')||' 也报ORA-00905: 缺失关键字
phillip629 2019-07-10
  • 打赏
  • 举报
回复
create table resultt as SELECT a.OrgCode,a.OrgName, a.NumberOfPeople, a.MedNum, a.CurrOccupationRatio , CASE WHEN a.CurrOccupationRatio - a.LastOccupationRatio < 0 THEN '||to_char('-')||'CAST((a.LastOccupationRatio - a.CurrOccupationRatio) AS varchar2(100)) WHEN a.CurrOccupationRatio - a.LastOccupationRatio = 0 THEN 0.00 ELSE '||'+'||' CAST((a.CurrOccupationRatio - a.LastOccupationRatio) AS varchar2(100))AS varchar2(100) END AS YearIncrease , CASE WHEN a.CurrOccupationRatio - a.qgOccupationRatio < 0 THEN '||to_char('-')||'CAST(a.qgOccupationRatio - a.CurrOccupationRatio AS varchar2(100)) WHEN a.CurrOccupationRatio - a.qgOccupationRatio = 0 THEN 0.00 ELSE '||'+'||' CAST(a.CurrOccupationRatio - a.qgOccupationRatio AS varchar2(100)) AS varchar2(100) END AS QgIncrease 这部分要字符,数据类型不匹配问题已经解决了,现在报ORA-00905: 缺失关键字
ZJHZ_叶 2019-07-10
  • 打赏
  • 举报
回复
你case when 那里是想要字符(例如显示 +1 )还是 数字?
phillip629 2019-07-10
  • 打赏
  • 举报
回复
执行了,报ora00900,辛苦大家了,我先结贴了
ZJHZ_叶 2019-07-10
  • 打赏
  • 举报
回复
你把execute immediate strsql;
改成 dbms_output.put_line(strsql);
拿到sql执行下就知道问题了
phillip629 2019-07-10
  • 打赏
  • 举报
回复
谢谢大家,上个问题解决了,还是这段代码又出现了新的问题,ORA-00905: 缺失关键字\nORA-06512: 大佬们帮忙看下啊 strsql:='create table result as SELECT a.OrgCode,a.OrgName, a.NumberOfPeople, a.MedNum, a.CurrOccupationRatio , CASE WHEN (a.CurrOccupationRatio - a.LastOccupationRatio) < 0 THEN '||to_char('-')||' CAST((a.LastOccupationRatio - a.CurrOccupationRatio) AS varchar2(100)) WHEN (a.CurrOccupationRatio - a.LastOccupationRatio) = 0 THEN 0.00 ELSE '||'+'||' CAST((a.CurrOccupationRatio - a.LastOccupationRatio) AS varchar2(100))AS varchar2(100) END AS YearIncrease , CASE WHEN (a.CurrOccupationRatio - a.qgOccupationRatio) < 0 THEN '||to_char('-')||' CAST((a.qgOccupationRatio - a.CurrOccupationRatio) AS varchar2(100)) WHEN (a.CurrOccupationRatio - a.qgOccupationRatio) = 0 THEN 0.00 ELSE '||'+'||' CAST((a.CurrOccupationRatio - a.qgOccupationRatio) AS varchar2(100)) AS varchar2(100) END AS QgIncrease FROM ( SELECT a.OrgCode,a.OrgName, a.NumberOfPeople , ( SELECT COUNT(1) FROM temp b WHERE to_char(a.orgName)=b.orgName ) AS MedNum , CASE WHEN nvl(a.numberofpeople,CAST(0 AS number)) = 0 THEN CAST(0 AS number) ELSE CAST(( SELECT COUNT(1) FROM temp b WHERE to_char(a.orgName)=b.orgName ) / (CAST(a.numberofpeople AS decimal) / 1000) * 100 AS decimal(18, 2)) END AS CurrOccupationRatio , CASE WHEN nvl(a.numberofpeople, CAST(0 AS number)) = 0 THEN CAST(0 AS number) ELSE CAST(( SELECT COUNT(1) FROM temp1 b WHERE to_char(a.orgName) =b.orgName ) / (CAST(a.numberofpeople AS decimal) / 1000) * 100 AS decimal(18, 2)) END AS LastOccupationRatio, CAST(( SELECT COUNT(1) FROM jg_info b WHERE isfz = 1 AND to_char(b.passdate,''yyyy'')='||yearr||' ) / (CAST(( SELECT SUM(numberofpeople) FROM KgOrgs where LV=1 ) AS decimal) / 1000) * 100 AS decimal(18, 2)) AS qgOccupationRatio FROM tempOrgs a ) a '; execute immediate strsql;
ZJHZ_叶 2019-07-10
  • 打赏
  • 举报
回复
试了一下
- CAST(a.CurrOccupationRatio - a.qgOccupationRatio AS varchar(100)) --number

+CAST(a.CurrOccupationRatio - a.qgOccupationRatio AS varchar(100)) --char
等于
CAST(a.CurrOccupationRatio - a.qgOccupationRatio AS varchar(100))--char

加号并没有用,如果你要加号的话,''+'' 要两个单引号,且上面的类型全要改成字符型
phillip629 2019-07-10
  • 打赏
  • 举报
回复
那怎么改啊,+是需要添加的字符
ZJHZ_叶 2019-07-10
  • 打赏
  • 举报
回复
+ 那一块有问题
加载更多回复(2)
代码下载地址: https://pan.quark.cn/s/068306a56640 在交通运输科学范畴内,交通流量分配是探讨交通系统内交通负荷如何在各个道路路段间进行合理分配的核心议题。交通流分配技术主要应用于模拟和推演交通系统的运行状态,旨在为城市规划人员与交通工程师提供优化道路布局的参考,进而缓解交通拥堵现象,提升道路交通的整体效能。以下将对"交通流分配技术"进行深入阐述: 1. **全部或无分配(All-or-Nothing Distribution)** 全部或无分配是一种基础的交通流分配策略。该技术依据最短路径准则,预设所有从发源地(Origin)至目的地(Destination)的车辆都将选择路程最短的路线。倘若存在多条等长路径,则采用随机方式确定其中一条。此类方法未将交通拥堵因素纳入考量,因为一旦选定路径,便假定所有交通量将沿此路径通行,即便这可能导致部分路段出现超负荷状况。 2. **逐步分配(Progressive Assignment)** 逐步分配技术顾及了交通网络的动态特征。该算法通过逐步优化流量配置,力求使网络内行驶的总代价(诸如通行时间、距离等指标)最小化。运算过程始于初始的全部或无分配状态,随后逐步修正路径选择,直至网络达成稳定状态,即每次流量修正后,总代价的变动幅度不再明显。此方法更贴近现实交通场景,因为车辆会依据即时路况选择最优路径。 3. **迭代平均分配(Iterative Average Distribution)** 迭代平均分配是一种对逐步分配技术的优化版本,其更侧重于实现网络流量的均衡化。在每一轮迭代过程中,算法不仅评估当前路径的优化程度,同时参考前一次迭代的流量配置。通过融入平均化理念,该方法能更有效地分散交通...

17,134

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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