在本文中,我们将为您详细介绍将varchar2列转换为数字数据类型时出现无效标识符错误的相关知识,并且为您解答关于将数据类型varchar转换为numeric时出错的疑问,此外,我们还会提供一些关于L
在本文中,我们将为您详细介绍将 varchar2 列转换为数字数据类型时出现无效标识符错误的相关知识,并且为您解答关于将数据类型varchar转换为numeric时出错的疑问,此外,我们还会提供一些关于LONG 数据类型转换为 VARCHAR2 并相互转换、ORA-22858: 数据类型的变更无效 varchar2类型转换为clob类型、sql – 将nvarchar值转换为数据类型int时,转换失败、sql 中将数据类型 nvarchar 转换为 numeric 时出错怎么办的有用信息。
本文目录一览:- 将 varchar2 列转换为数字数据类型时出现无效标识符错误(将数据类型varchar转换为numeric时出错)
- LONG 数据类型转换为 VARCHAR2 并相互转换
- ORA-22858: 数据类型的变更无效 varchar2类型转换为clob类型
- sql – 将nvarchar值转换为数据类型int时,转换失败
- sql 中将数据类型 nvarchar 转换为 numeric 时出错怎么办
将 varchar2 列转换为数字数据类型时出现无效标识符错误(将数据类型varchar转换为numeric时出错)
如何解决将 varchar2 列转换为数字数据类型时出现无效标识符错误?
我有一个带有 varchar2 列的表(该列包含多个值,如空格、数字和字母数字)。和 B 表与数字列。 我需要使用上面的列将 A 表与 B 表连接起来。 我在连接条件中使用了 TO_NUMBER(A.Column) 它抛出错误无效标识符“A.Column”。我尝试了各种方法,但仍然遇到相同的错误。
示例:
在选择中: 当正则表达式像 (A.column,''[0-9]'') 然后 to_number(trim(A.column)) else null end as A
在加入条件下: 左连接 B ON B.column=to_number(A.column)
解决方法
什么版本的 Oracle?
在 12.2 及更高版本中,您可以将 default null on conversion error
添加到您的 to_number
调用
a
left join b
on b.column = to_number( a.column default null on conversion error )
在早期版本中,您需要加入 case
语句或用户定义的函数调用。类似的东西
create or replace function safe_to_number( p_str in varchar2 )
return number
is
l_num number;
begin
begin
l_num := to_number( p_str );
exception
when others then
l_num := null;
end;
return l_num;
end;
a
left join b
on b.column = safe_to_number( a.column )
假设您的 case
语句有效(这意味着您的所有数字都是没有千位分隔符的整数)
a
left join b
on b.column = Case when regexp_like (A.column,''[0-9]'')
then to_number(trim(A.column))
else null
end
LONG 数据类型转换为 VARCHAR2 并相互转换
-- 方法 1,支持表
--plsql 中将 long 类型隐式转换为 varchar2,但是 sql 不能
CREATE OR REPLACE FUNCTION LONG_TO_CHAR(
in_rowid rowid,
in_owner varchar,
in_table_name varchar,
in_column varchar2)
RETURN varchar AS
text_c1 varchar2(32767);
sql_cur varchar2(2000);
--set serveroutput on size 10000000000;
begin
DBMS_OUTPUT.ENABLE (buffer_size=>null);
sql_cur := ''select ''||in_column||'' from ''||in_owner||''.''||in_table_name||'' where rowid = ''||chr(39)||in_rowid||chr(39);
dbms_output.put_line (sql_cur);
execute immediate sql_cur into text_c1;
text_c1 := substr(text_c1, 1, 4000);
RETURN TEXT_C1;
END;
/
--------------------------------------
--test
-- 参数分别为 rowid,用户,表名,字段名
DROP TABLE VI.TEST1;
CREATE TABLE VI.TEST1(ID NUMBER,V_CLOB CLOB,V_LONG LONG DEFAULT ''create or replace view v_t'',V_SYSDATE DATE DEFAULT SYSDATE);
INSERT INTO VI.TEST1(ID) SELECT 1 FROM DUAL;
COMMIT;
select LONG_TO_CHAR(ROWID, ''VI'', ''TEST1'', ''V_LONG'') FROM TEST1;
-------------------------------------------------------------------------------------------------------------------------------------------------
-- 方法 2,支持表和视图
--long 查询结果转换为 varchar2 类型
/* 来自 Thomas Kyte 《Oracle9i/10g/11g 编程艺术》 12 章节中。由于 long 的操作限制,那么在操作 long 之前可以将该类型的结果转换为 varchar2,
然后再使用 long_help.substr_of,基本意思是将 long 结果的的前 4000 字节转换为 varchar2 类型。如果 long 的数据超过了 4000 字节,那么可以将循环调用此函数
*/
create or replace package long_help
authid current_user
as
function substr_of(
p_query in varchar2,
p_from in number,
p_for in number,
p_name1 in varchar2 default NULL,
p_bind1 in varchar2 default NULL,
p_name2 in varchar2 default NULL,
p_bind2 in varchar2 default NULL,
p_name3 in varchar2 default NULL,
p_bind3 in varchar2 default NULL,
p_name4 in varchar2 default NULL,
p_bind4 in varchar2 default NULL
)
return varchar2;
end;
/
create or replace package body long_help
as
g_cursor number := dbms_sql.open_cursor;
g_query varchar2(32765);
procedure bind_variable(
p_name in varchar2,
p_value in varchar2
)
is
begin
if ( p_name is not null) then
dbms_sql.bind_variable( g_cursor, p_name, p_value );
end if;
end;
function substr_of(
p_query in varchar2,
p_from in number,
p_for in number,
p_name1 in varchar2 default NULL,
p_bind1 in varchar2 default NULL,
p_name2 in varchar2 default NULL,
p_bind2 in varchar2 default NULL,
p_name3 in varchar2 default NULL,
p_bind3 in varchar2 default NULL,
p_name4 in varchar2 default NULL,
p_bind4 in varchar2 default NULL)
return varchar2 as
l_buffer varchar2(4000);
l_buffer_len number;
begin
if ( nvl(p_from,0) <= 0 ) then
raise_application_error(-20002, ''From must be >= 1 (positive numbers)'');
end if;
if ( nvl(p_for,0) not between 1 and 4000 ) then
raise_application_error (-20003, ''For must be between 1 and 4000'' );
end if;
if ( p_query <> g_query or g_query is NULL ) then
if ( upper(trim(nvl(p_query,''x''))) not like ''SELECT%'') then
raise_application_error(-20001, ''This must be a select only'' );
end if;
dbms_sql.parse( g_cursor, p_query, dbms_sql.native );
g_query := p_query;
end if;
bind_variable( p_name1, p_bind1 );
bind_variable( p_name2, p_bind2 );
bind_variable( p_name3, p_bind3 );
bind_variable( p_name4, p_bind4 );
dbms_sql.define_column_long(g_cursor, 1);
if (dbms_sql.execute_and_fetch(g_cursor)>0) then
dbms_sql.column_value_long(g_cursor, 1, p_for, p_from-1,l_buffer, l_buffer_len );
end if;
return l_buffer;
end substr_of;
end;
/
-- 使用方法:
-- 查询 DBA_TAB_PARTITIONS 中的 LONG 类型:HIGH_VALUE
SELECT * FROM(
SELECT TABLE_OWNER,TABLE_NAME,PARTITION_NAME,
LONG_HELP.SUBSTR_OF(''SELECT HIGH_VALUE FROM DBA_TAB_PARTITIONS WHERE TABLE_OWNER=:TABLE_OWNER AND TABLE_NAME=:TABLE_NAME AND PARTITION_NAME=:PARTITION_NAME'',
1,
4000,
''TABLE_OWNER'',
TABLE_OWNER,
''TABLE_NAME'',
TABLE_NAME,
''PARTITION_NAME'',
PARTITION_NAME) HIGH_VALUE
FROM DBA_TAB_PARTITIONS
);
-- 查询 long 类型数据
SELECT LONG_HELP.SUBSTR_OF(''SELECT V_LONG FROM TEST1'',1,4000) FROM TEST1;
-- 查询 DBA_VIEWS 视图的 TEXT 时报错:ORA-01006:绑定变量不存在 (原因可能是不支持视图,应该在外层写筛选条件)
-------------------------------------------------------------------------------------------------------------------------------------------------
-- 方法三,支持表
select sys.dbms_metadata_util.long2varchar(100,''scott.t1'',''name'',rowid) from scott.t1;
-------------------------------------------------------------------------------------------------------------------------------------------------
--varchar2 转化为 long,撰写的 procedure 案例如下
create table erpmainbom(
location varchar2(4000),
locationplus long,
parentpn varchar2(4000),
pn varchar2(4000),
plant varchar2(4000)
);
--location 字段空格之前的字符重新复制给 location,从空格开始的之后的字符拼接 locationplus(long 类型)字段并复制给 locationplus
Create or replace PROCEDURE P_UPDATELOCALPLUS(
strMitm in varchar2,
strSubITEM in varchar2,
strPlant in varchar2)
as
lLocationPlus long;
strLocation varchar2(4000);
strSubLoc varchar2(50);
lTempLoct long;
i number;
Begin
Select location,locationplus into strLocation,lLocationPlus from erpmainbom Where parentpn=strMitm and pn=strSubITEM and plant= strPlant;
If length(strLocation)=4000 then
i:=1;
strSubLoc:=substr(strLocation,4000,i);
While InStr(strSubLoc, '' '') = 0 Loop
i := i + 1;
strSubLoc := substr(strLocation,4000-i,i);
End Loop;
--i:=i+1;
strSubLoc := substr(strLocation,4000-i,i+1);
strLocation := substr(strLocation,1, 4000 - Length(strSubLoc));
lTempLoct:=strSubLoc;
End if;
lLocationPlus:=lTempLoct||lLocationPlus;
update erpmainbom set location=strLocation,locationplus=lLocationPlus where parentpn=strMitm and pn=strSubITEM and plant= strPlant;
commit;
EXCEPTION When others then
Rollback;
end;
/
ORA-22858: 数据类型的变更无效 varchar2类型转换为clob类型
oracle中,如果一个列的类型为varchar2,那么它不能直接转换为clob类型。可以通过间接的方式来修改。下面为实验:
oracle中,如果一个列的类型为varchar2,那么它不能直接转换为clob类型。可以通过间接的方式来修改。下面为实验:
SQL>create table test(id int,name varchar2(10));
Tablecreated
SQL>insert into test values(1,''a'');
1row inserted
SQL>insert into test values(2,''b'');
1row inserted
SQL>commit;
Commitcomplete
SQL>select * from test;
ID NAME
---------------------------------------
1 a
2 b
SQL> desc test
NameType Nullable Default Comments
---------------- -------- ------- --------
ID INTEGER Y
NAMEVARCHAR2(10) Y
SQL> alter table test modify(name clob);
altertable test modify (name clob)
ORA-22858: 数据类型的变更无效
如果直接转换,报错!
我们可以通过间接的方式来操作:
新建一个clob类型的列,将原列的值插入新建的列,,然后删除原列,重命名新列。
SQL> alter table test add name1clob;
Table altered
SQL> update test setname1=name;
2rows updated
SQL> select * from test;
IDNAME NAME1
----------------------------------------------------------------------------------
1 a a
2 b b
SQL> desc test
Name Type Nullable Default Comments
----------------- -------- ------- --------
ID INTEGER Y
NAME VARCHAR2(10) Y
NAME1CLOB Y
SQL> commit;
Commit complete
SQL> alter table test dropcolumn name;
Table altered
SQL> alter table test renamecolumn name1 to name;
Table altered
SQL> select * from test;
ID NAME
---------------------------------------------------------------------
1 a
2 b
SQL> desc test
NameType Nullable Default Comments
----------- -------- ------- --------
ID INTEGER Y
NAMECLOB Y
相关阅读:
GoldenGate不使用数据泵完成Oracle-Oracle的双向复制
使用GoldenGate的数据泵进行Oracle-Oracle的单向复制
如何对 Oracle 数据泵(expdp/impdp) 进行 debug
Oracle 数据库导出数据泵(EXPDP)文件存放的位置
Oracle 10g 数据泵分区表的导出
sql – 将nvarchar值转换为数据类型int时,转换失败
CREATE procedure getdata ( @ID int,@frm varchar(250),@to varchar(250) ) AS BEGIN DECLARE @sql nvarchar(500) set @sql = 'select' set @sql = @sql + ' EmpName,Address,Salary from Emp_Tb where 1=1 ' IF (@ID <> '' and @ID is not null) Begin SET @sql=@sql+' AND Emp_Id_Pk=' +@ID End END print @sql --execute (@sql)
我尝试执行它:
**execute getdata 3,'','';**
但是我收到以下错误:
Conversion Failed when converting the nvarchar value ‘select EmpName,
Address,Salary from Emp_Tb where 1=1 AND Emp_Id_Pk=’ to data type int
请帮忙.
解决方法
您需要将 cast @ID作为字符串.
尝试:
SET @sql=@sql+' AND Emp_Id_Pk=' + CAST(@ID AS NVARCHAR(10))
sql 中将数据类型 nvarchar 转换为 numeric 时出错怎么办
select *from organization o,customer c
where c.customer_square=o.structid
customer_square 是 nvarchar 类型,structid 是 numeric 类型。求大神啊!!在线等!
关于将 varchar2 列转换为数字数据类型时出现无效标识符错误和将数据类型varchar转换为numeric时出错的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于LONG 数据类型转换为 VARCHAR2 并相互转换、ORA-22858: 数据类型的变更无效 varchar2类型转换为clob类型、sql – 将nvarchar值转换为数据类型int时,转换失败、sql 中将数据类型 nvarchar 转换为 numeric 时出错怎么办等相关内容,可以在本站寻找。
本文标签: