日期:2014-05-16  浏览次数:20923 次

用存储过程编程遇到的小问题
declare 
  nu number(5);
  smsms varchar(3999);
 sms VARCHAR(3999):='美国有线电视新闻网(CNN)15日称美情报部门倾向于认为失联客机飞行员对客机失联负有责任,并且其行为有主观故意因素。由于马航信息显示副机长阿卜杜勒?法里克之前并没有特别要求与机长扎哈里?艾哈迈德?沙阿搭班,';
 su varchar2(999);
 i number(4):=1;
 n number(2):=0;
cha number(3);

begin
  nu:=length(sms);
 while i<nu loop
   cha:=nu-i;
   if cha<70 then
 su:=substr(sms,i,70);
   dbms_output.put_line('output SMS: '||su);
   n:=n+1;
else
    su:=substr(sms,i);
   dbms_output.put_line('output SMS: '||su);
     end if;
i:=i+70;
     end loop;
  dbms_output.put_line('the sms length is: '||nu);
end;

关于这个程序,有两个问题:1.su:=substr(sms,i,70);无法实现对sms字符串截取70个字符的操作,都是从i处直接输出到字符串结尾了。
2.如果我想实现可以sms的字符串输入该如何操作?
刚刚接触oracle,很多地方还不太理解,请教的问题可能也比较简单,先谢谢各位大神的指教了。
------解决方案--------------------
问题1:是因为你程序就这么写的啊,
   if cha<70 then
  su:=substr(sms,i,70);
比如 nu = 100, 当i=31的时候才会执行(su:=substr(sms,i,70);),对吧
那么这个时候你看到的效果就是从i处直接输出到字符串结尾了。不知道我这么说你能不能明白

问题2:可以把sms作为存储过程的参数,这样就可以了。

希望对你有帮助。
------解决方案--------------------
1.同楼上,你的if else控制始终会让i+70>nu时才能执行su:=substr(sms,i,70),必然会输出到字符串尾
2.如果你只是做读取与输入测试,那么用&即可读取键盘输入
例如:sms:=&请输入

输入时如果接收者为varchar2类型,输入的值前后记得加上单引号