问题描述
你好
我正忙着将一个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)都会给变量
从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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




