用存储过程编程遇到的小问题

life-of-pi 2014-03-17 03:38:34
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,很多地方还不太理解,请教的问题可能也比较简单,先谢谢各位大神的指教了。
...全文
208 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
life-of-pi 2014-03-19
  • 打赏
  • 举报
回复
问题都解决了,谢谢rihyou和zuorxk_wl的回复,尤其是zuorxk,刚刚接触,很多问题都很低级,谢谢你的耐心解答。劳驾二位了。结贴结贴
life-of-pi 2014-03-17
  • 打赏
  • 举报
回复
引用 11 楼 zuorxk_wl 的回复:
你是复制到存储过程中了?
我复制到的plsql develop 的test window中就不行,不知道为什么
一生一事 2014-03-17
  • 打赏
  • 举报
回复
你是复制到存储过程中了?
life-of-pi 2014-03-17
  • 打赏
  • 举报
回复
引用 9 楼 zuorxk_wl 的回复:

declare 
  nu number(5);
  smsms varchar(3999);
 sms VARCHAR(3999);
 su varchar2(999);
 i number(4):=1;
 n number(2):=0;
cha number(3);

begin
  sms:=&请输入;
  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;
&后面只是作提示作用的语句
你这程序我直接粘在PL/SQL developer里还是报错,还是那个错误,是我软件的问题吗?
一生一事 2014-03-17
  • 打赏
  • 举报
回复

declare 
  nu number(5);
  smsms varchar(3999);
 sms VARCHAR(3999);
 su varchar2(999);
 i number(4):=1;
 n number(2):=0;
cha number(3);

begin
  sms:=&请输入;
  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;
&后面只是作提示作用的语句
life-of-pi 2014-03-17
  • 打赏
  • 举报
回复
引用 7 楼 zuorxk_wl 的回复:
切记替换变量会直接赋值给sms,所以若想输入字符串,输入格式如: '马航失踪'



begin

sms:=&sms;
nu:=length(sms);
while i<nu loop
。。。。
改成这样,还是报错

ORA-06550: 第 12 行, 第 8 列:
PLS-00103: 出现符号 "&"在需要下列之一时:
( - + case mod new not null
<an identifier> <a double-quoted delimited-identifier>
<a bind variable> avg count current exists max min prior sql
stddev sum variance execute forall merge time timestamp
interval date
<a string literal with character set specification>
<a number> <a single-quoted SQL string> pipe
<一个带有字符集说明的可带引号的字符串文字>
<一个可带引号的 SQL 字符串>
符号 "-在 "&" 继续之前已插入。

ps:12行第8列就是&sms的&处,不知道怎么错了,要崩溃了
一生一事 2014-03-17
  • 打赏
  • 举报
回复
切记替换变量会直接赋值给sms,所以若想输入字符串,输入格式如: '马航失踪'
一生一事 2014-03-17
  • 打赏
  • 举报
回复
declare sms VARCHAR(3999); begin sms:=&请输入字符串; --这个就可以弹出输入对话框 提示你输入 输入值(即替换变量)会直接赋值给sms end
life-of-pi 2014-03-17
  • 打赏
  • 举报
回复
引用 2 楼 zuorxk_wl 的回复:
1.同楼上,你的if else控制始终会让i+70>nu时才能执行su:=substr(sms,i,70),必然会输出到字符串尾 2.如果你只是做读取与输入测试,那么用&即可读取键盘输入 例如:sms:=&请输入 输入时如果接收者为varchar2类型,输入的值前后记得加上单引号
不好意思,我改后的结果是sms VARCHAR(3999):=&sms; 这样的,结果运行系统会报错,我不太清楚该怎么该。
life-of-pi 2014-03-17
  • 打赏
  • 举报
回复
引用 2 楼 zuorxk_wl 的回复:
1.同楼上,你的if else控制始终会让i+70>nu时才能执行su:=substr(sms,i,70),必然会输出到字符串尾
2.如果你只是做读取与输入测试,那么用&即可读取键盘输入
例如:sms:=&请输入

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


我将 sms VARCHAR(3999);改成sms VARCHAR(3999):=&sms;:=&sms;系统会报错。如下
ORA-06550: 第 5 行, 第 21 列:
PLS-00103: 出现符号 "&"在需要下列之一时:
( - + case mod new not null
<an identifier> <a double-quoted delimited-identifier>
<a bind variable> avg count current exists max min prior sql
stddev sum variance execute forall merge time timestamp
interval date
<a string literal with character set specification>
<a number> <a single-quoted SQL string> pipe
<一个带有字符集说明的可带引号的字符串文字>
<一个可带引号的 SQL 字符串>
符号 "&" 被忽略。

我一直不知道怎么该怎么该这句,网上也没有找到,辛苦了,谢谢。
life-of-pi 2014-03-17
  • 打赏
  • 举报
回复
引用 1 楼 rihyou 的回复:
问题1:是因为你程序就这么写的啊, if cha<70 then su:=substr(sms,i,70); 比如 nu = 100, 当i=31的时候才会执行(su:=substr(sms,i,70);),对吧 那么这个时候你看到的效果就是从i处直接输出到字符串结尾了。不知道我这么说你能不能明白 问题2:可以把sms作为存储过程的参数,这样就可以了。 希望对你有帮助。
恩,第一个问题是我没注意,已经解决了。谢谢,第二个我还不太懂,你的意思是用&吗?但我用这个总是报错
一生一事 2014-03-17
  • 打赏
  • 举报
回复
1.同楼上,你的if else控制始终会让i+70>nu时才能执行su:=substr(sms,i,70),必然会输出到字符串尾 2.如果你只是做读取与输入测试,那么用&即可读取键盘输入 例如:sms:=&请输入 输入时如果接收者为varchar2类型,输入的值前后记得加上单引号
胖胖_多多 2014-03-17
  • 打赏
  • 举报
回复
问题1:是因为你程序就这么写的啊, if cha<70 then su:=substr(sms,i,70); 比如 nu = 100, 当i=31的时候才会执行(su:=substr(sms,i,70);),对吧 那么这个时候你看到的效果就是从i处直接输出到字符串结尾了。不知道我这么说你能不能明白 问题2:可以把sms作为存储过程的参数,这样就可以了。 希望对你有帮助。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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