for i in ('','','') loop 问题

qq_33707041 2018-02-12 05:37:51
学习过程中遇到一个问题,望大家帮帮我
create or replace function f_checkid(p_id NUMBER) RETURN NUMBER IS
i NUMBER :=0;
v_sum NUMBER :=0;
v_sum1 NUMBER :=0;
BEGIN
FOR k IN (7,9,10,5,8,4,2,1,3,6,7,9,10,5,8,4,2) LOOP

i = i + 1;
v_sum =v_sum + v_sum1;
v_i = substr(p_id,i,1);
v_sum1 = k * v_i;
END LOOP;
dbms_output.put_line(v_sum);

RETURN v_sum ;
end f_checkid;




报错信息:
Compilation errors for FUNCTION HRTEST.F_CHECKID

Error: PLS-00103: Encountered the symbol "LOOP" when expecting one of the following:

* & - + / at mod remainder rem .. <an exponent (**)> ||
multiset year day
Line: 6
Text: FOR k IN (7,9,10,5,8,4,2,1,3,6,7,9,10,5,8,4,2) LOOP
...全文
1825 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_33707041 2018-02-22
  • 打赏
  • 举报
回复
感谢感谢,人生第一个函数
qq_33707041 2018-02-22
  • 打赏
  • 举报
回复
谢谢大神,过年第一天上班,就写了一下校验身份证最后一位。对了,感谢
create or replace function f_checkid(p_id NUMBER) RETURN VARCHAR2 IS
  TYPE typ_nums IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
  v_nums  typ_nums;
  --v_index NUMBER;
  v_i    NUMBER := 0;
  --i      NUMBER ;
  k      NUMBER := 0;
  v_sum  NUMBER := 0;
  v_sum1 NUMBER := 0;
  v_idn  NUMBER := 0;
  v_mod  NUMBER := 0;
  v_result VARCHAR2(2):= 0;
BEGIN
  --FOR k IN  ('1','2') LOOP
  --i := [7, 9, 10, 5, 8, 4, 2, 1, 3, 6, 7, 9, 10, 5, 8, 4, 2].first;
  v_nums(1) := 7;
  v_nums(2) := 9;
  v_nums(3) := 10;
  v_nums(4) := 5;
  v_nums(5) := 8;
  v_nums(6) := 4;
  v_nums(7) := 2;
  v_nums(8) := 1;
  v_nums(9) := 6;
  v_nums(10) := 3;
  v_nums(11) := 7;
  v_nums(12) := 9;
  v_nums(13) := 10;
  v_nums(14) := 5;
  v_nums(15) := 8;
  v_nums(16) := 4;
  v_nums(17) := 2;
  --i := v_nums.first;
  while k < 17  LOOP
    k :=k + 1;
    v_i :=v_nums(k);
    dbms_output.put_line(k);
    --dbms_output.put_line(v_i);
    v_idn  :=substr(p_id,k,1);
    dbms_output.put_line(v_idn);    
    v_sum1 :=v_i*v_idn;
    v_sum := v_sum + v_sum1;
    --i := v_nums.next(i);
  end loop;
  --dbms_output.put_line(v_sum);
  v_mod  := mod(v_sum,11);
  IF v_mod= 0 THEN v_result := '1';
    ELSIF v_mod= 1 THEN v_result := '0';
    ELSIF v_mod= 2 THEN v_result := 'X';
    ELSIF v_mod= 3 THEN v_result := '9';
    ELSIF v_mod= 4 THEN v_result := '8';
    ELSIF v_mod= 5 THEN v_result := '7';
    ELSIF v_mod= 6 THEN v_result := '6';
    ELSIF v_mod= 7 THEN v_result := '5';
    ELSIF v_mod= 8 THEN v_result := '4';
    ELSIF v_mod= 9 THEN v_result := '3';
    ELSIF v_mod= 10 THEN v_result := '2';
  ELSE NULL;
  END IF;
  RETURN v_result;
end f_checkid;
jdsnhan 2018-02-13
  • 打赏
  • 举报
回复
参考

create or replace function f_checkid(p_id NUMBER) RETURN NUMBER IS
  TYPE typ_nums IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
  v_nums  typ_nums;
  --v_index NUMBER;

  i      NUMBER := 0;
  v_sum  NUMBER := 0;
  v_sum1 NUMBER := 0;
BEGIN
  --FOR k IN  ('1','2') LOOP
  --i := [7, 9, 10, 5, 8, 4, 2, 1, 3, 6, 7, 9, 10, 5, 8, 4, 2].first;
  v_nums(1) := 7;
  v_nums(2) := 9;
  v_nums(3) := 10;
  v_nums(4) := 5;
  v_nums(5) := 8;
  v_nums(6) := 4;

  i := v_nums.first;
  while i is not null loop
    dbms_output.put_line(i);
    v_sum := v_sum + v_nums(i);
    i := v_nums.next(i);
  end loop;
  dbms_output.put_line(v_sum);

  RETURN v_sum;
end f_checkid;

  • 打赏
  • 举报
回复
引用 2 楼 qq_33707041的回复:
那如果我不想要在1-10里面循环呢。我就只想在上面这几个数里面循环呢,怎么解决 [quote=引用 1 楼 baidu_36457652 的回复:] FOR i in 1 .. 10 LOOP 要这个样子
[/quote] 在loop 里面用if 做判断,如果是你需要的就做某种操作,如果不是就做另外一种
qq_33707041 2018-02-13
  • 打赏
  • 举报
回复
那如果我不想要在1-10里面循环呢。我就只想在上面这几个数里面循环呢,怎么解决
引用 1 楼 baidu_36457652 的回复:
FOR i in 1 .. 10 LOOP 要这个样子
zcs_zzh 2018-02-13
  • 打赏
  • 举报
回复
供参考:
CREATE OR REPLACE FUNCTION f_checkid(p_id NUMBER) RETURN NUMBER IS
  i      NUMBER := 0;
  v_sum  NUMBER := 0;
  v_sum1 NUMBER := 0;

  v_num_list    VARCHAR2(1000) := '7, 9, 10, 5, 8, 4, 2, 1, 3, 6, 7, 9, 10, 5, 8, 4, 2'; --将数字串保留在字符串中
  v_len         NUMBER := length(v_num_list) - length(REPLACE(v_num_list, ',')) + 1; --取得数据串中数字的个数,就是逗号的个数加1
  v_current_num NUMBER; --保存循环中的数字串的当前值

  v_i NUMBER;
BEGIN
  FOR k IN 1 .. v_len LOOP
  
    v_current_num := to_number(regexp_substr(v_num_list, '(\d)+', 1, i)); --取得当前值
    i             := i + 1;
    v_sum         := v_sum + v_sum1;
    v_i           := substr(p_id, i, 1);
    v_sum1        := v_current_num * v_i;
  END LOOP;
  dbms_output.put_line(v_sum);

  RETURN v_sum;
END f_checkid;
  • 打赏
  • 举报
回复
FOR i in 1 .. 10 LOOP 要这个样子

17,081

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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