暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 在SELECT语句中填充空白VARCHAR2

askTom 2015-12-03
590

问题描述


你好

我正忙着将一个C应用程序从RdB ( OpenVMS ,使用f SQL模块语言)迁移到Oracle ( Linux ,使用嵌入式SQL ) ,现在我发现了一个我一直无法解决的问题。

在RdB ,我们有一张表

创建表mytab ( id整数, name char(10) ) ;
插入mytab值( 1 ,'smith') ;
插入到mytab值(2,'史密斯');

由于数据类型char不考虑尾随空格,因此数据库中的值'mith'和'mith'视为相等。

按照客户的意愿,我们必须在新的Oracle数据库中使用VARCHAR2而不是字符:

创建表mytab ( id整数, name char(10) ) ;

现在,值'mith'和'mith'被认为是不同的,但我可以接受这一点。

我不明白的是,在嵌入式SQL语句中,选择名称时,两个语句都填充了与主机变量长度相同的填充空格:

空mytab_选择名称(长ID ,字符名称【11】 )
{
EXEC SQL
选择mytab.name进入:name来自mytab的位置id = :id ;
}

这两个调用mytab_选择名称(1,name)和mytab_选择名称(2,name)都会给变量中的值'mith'(六个尾随空格和\0 )。现在,当我把它们写回数据库时,名字用空格填充,当我按名字选择条目时,我得到
从mytab中选择* ,其中name ='smith'; ->未找到行
从mytab中选择* ,其中name ='smith'; ->未找到行
从mytab中选择* ,其中name ='smith'; ->未找到行

改变这种行为最有效的方法是什么?我不需要在我的价值观中添加尾随空格。

我发现的方法:

从mytab中选择* ,其中铸造(name as char(10)) ='史密斯';
从mytab中选择* wheretriet(name)=trim('mith ');

我得到了4000多条嵌入式SQL语句,这对我来说是最好的方法,我可以“全局”地更改行为。

提前谢谢你的帮助

最好的问候
约尔格



专家解答

我没有学你的榜样。该表有一个char列-它应该是varchar2吗?

在任何情况下,您都可以通过以下方式实现所需:

-重命名表
-根据需要,在表顶部创建视图。

create table mytab(id integer, name varchar2(10)) ;
insert into mytab values(1, 'smith') ;
insert into mytab values(2, 'smith ') ;
commit;

select *
from   mytab
where  name = 'smith    ';

no rows selected

rename mytab to mytab_t;
create or replace view mytab as
  select id, cast(name as char(10)) name from mytab_t;

select *
from   mytab
where  name = 'smith    ';

        ID NAME     
---------- ----------
         1 smith     
         2 smith     


您还需要在执行插入/更新的视图上创建触发器,而不是触发器:

insert into mytab (id, name) values(3, 'smith ') ;

SQL Error: ORA-01733: virtual column not allowed here

create or replace trigger trig 
instead of insert on mytab 
for each row
begin
  insert into mytab_t 
  values (:new.id, cast(:new.name as varchar2(10)));
end;
/

insert into mytab (id, name) values(3, 'smith ') ;

select * from mytab;

        ID NAME     
---------- ----------
         1 smith     
         2 smith     
         3 smith     


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论