当前位置:   article > 正文

postgresql和Oracle中几种循环结构示例_postgresql 循环

postgresql 循环

目录

简介

CASE WHEN 结构

oracle 中应用 

postgresql中的应用 

IF 结构

        oracle中if循环的应用

postgresql中示例

loop 和IF 的结合应用 结构

 postgresq中的应用示例

Oracle中的语法示例

for 结构

loop和FOR 的结合应用

Oracle示例:

postgresql示例

while  结构

oracle中的应用示例

postgresql中的应用示例


简介

        在任何编程语言中,循环语法自然是较为重要的分支,本文以oracle,postgresql数据库的循环结构为例进行讲解。

oracle建表语句

  1. -- Create table
  2. create table FINANCIAL_INDEX
  3. (
  4. id NUMBER(11) not null,
  5. cwzbkm varchar2(100),
  6. "2011" NUMBER,
  7. "2010" NUMBER,
  8. "2009" NUMBER
  9. );

postgresql 建表语句

  1. --drop table FINANCIAL_INDEX;
  2. -- Create table
  3. create table FINANCIAL_INDEX
  4. (
  5. id integer not null,
  6. cwzbkm varchar(100),
  7. "2011" numeric(10,2),
  8. "2010" numeric(10,2),
  9. "2009" numeric(10,2)
  10. );

测试数据 

  1. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('1', '总资产收益率(%)', '33.24', '31.73', '40.08');
  2. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('2', '净资产收益率(%)', '42.7', '40.93', '54.41');
  3. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('3', '主营业务利润率(%)', '38.93', '30.36', '30.16');
  4. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('4', '总资产净利润率(%)', '33.24', '31.73', '40.08');
  5. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('5', '成本费用利润率(%)', '64.18', '60.18', '59.89');
  6. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('6', '营业利润率(%)', '33.61', '32.17', '33.95');
  7. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('7', '主营业务成本率(%)', '41.58', '41.66', '40.99');
  8. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('8', '销售净利率(%)', '38.93', '30.36', '30.16');
  9. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('9', '销售毛利率(%)', '58.42', '58.34', '59.01');
  10. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('10', '主营业务收入增长率(%)', '18.48', '30', '46.74');
  11. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('11', '净利润增长率(%)', '51.93', '30.85', '57.64');
  12. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('12', '利润总额增长率(%)', '44.93', '28.88', '64.53');
  13. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('13', '全部从业人员数增长率(%)', '15.91', '38.33', '33.21');
  14. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('14', '总资产增长率(%)', '53.66', '33.57', '142.02');
  15. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('15', '应收账款周转率(%)', '14', '9.6', '12.9');
  16. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('16', '应收账款周转天数(天)', '25.8', '37.5', '27.8');
  17. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('17', '存货周转率(次)', '5.8', '5.8', '6');
  18. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('18', '存货周转天数(天)', '61.9', '62.5', '60.3');
  19. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('19', '固定资产周转率(次)', '3.9', '6.1', '8.8');
  20. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('20', '固定资产周转天数(天)', '92.6', '59.2', '40.7');
  21. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('21', '总资产周转率(次)', '0.9', '1', '1.3');
  22. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('22', '总资产周天数(天)', '421.7', '344.4', '270.9');
  23. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('23', '流动资产周转率(次)', '1.2', '1.5', '1.8');
  24. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('24', '流动资产周转天数(天)', '312.1', '247', '194.9');
  25. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('25', '股东权益周转率(次)', '1.1', '1.3', '1.8');
  26. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('26', '流动比率(-)', '3.47', '3.57', '3.05');
  27. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('27', '速动比率(-)', '3.23', '3.19', '2.73');
  28. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('28', '利息支付倍数(-)', '-58.24', '0', '-29.72');
  29. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('29', '股东权益比率(%)', '77.04', '79.03', '75.54');
  30. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('30', '长期负债比率(%)', '0', '1.24', '0.42');
  31. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('31', '股东权益比固定资产比率(%)', '325.18', '409.14', '525.87');
  32. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('32', '股东权益对负债比率(%)', '335.58', '376.96', '308.78');
  33. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('33', '权益乘数(-)', '1.28', '1.29', '1.36');
  34. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('34', '资本化比率(%)', '0', '1.54', '0.55');
  35. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('35', '资本固定化比率(%)', '30.75', '37.37', '35.28');
  36. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('36', '产权比率(%)', '29.8', '26.53', '32.39');
  37. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('37', '固定资产比重(%)', '23.69', '19.32', '14.36');
  38. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('38', '固定资产对长期负债比率(%)', '0', '1562.56', '3437.92');
  39. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('39', '资产负债率(%)', '22.96', '20.97', '24.46');
  40. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('40', '销售费用率(%)', '0.84', '0.73', '0.78');
  41. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('41', '管理费用率(%)', '2.73', '2.84', '2.69');
  42. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('42', '财务费用率(%)', '0.82', '0.75', '0.68');
  43. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('43', '息税前利润率(%)', '6.5', '6.2', '5.8');
  44. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('44', '销售税费率', '1.2', '1.1', '0.9');
  45. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('45', '应付账款周转率', '10', '8.5', '8.4');
  46. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('46', '现金流动负债率', '13.38', '12.25', '12.22');
  47. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('47', '营业外收支净额', '-52753.8', '-105632.1', '-148830.5');
  48. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('48', '资产保值增长率(%)', '43.78', '38.23', '105.27');
  49. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('49', '现金比率(%)', '123.5', '98.8', '116.8');
  50. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('50', '收益质量比率(%)', '87.3', '67.2', '65.3');
  51. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('51', '净利润现金保证比率(%)', '92.4', '96.3', '88.9');
  52. INSERT INTO financial_index (ID, CWZBKM, "2011", "2010", "2009") VALUES ('52', '经营现金结构比率(%)', '45.7', '27.5', '54.3');

CASE WHEN 结构

  1. ##第一种写法
  2. CASE case_value
  3.     WHEN when_value THEN
  4.         statement_list
  5.     ELSE
  6.         statement_list
  7. END CASE;
  8. ##第二种写法
  9. CASE WHEN case_value [=/>|<|<>] when_value THEN
  10.         statement_list
  11.     ELSE
  12.         statement_list
  13. END CASE;
  14. /*第一种写法相当于 第二种写法为等号时的效果*/

        case when 循环是一个相对简单 也是比较常用的一种语法,在此语法上 两者没有区别 代码可以供用

        示例:测试数据中当字段 2009年 2010年 2011年    指标有三年连续递增的 输出字段values 值为true

  1. select id,
  2. cwzbkm,
  3. "2009",
  4. "2010",
  5. "2011",
  6. case
  7. when "2009" < "2010" and "2010" < "2011" then
  8. 'true'
  9. end as "values"
  10. from financial_index

oracle 中应用 

8ceb478cb48e4b97a7eb96c1c3697a2d.png

postgresql中的应用 

4a730694d8a5405fa32686fd5e98987a.png

IF 结构

  1. IF condition
  2. THEN
  3. statement_list
  4. ELSE
  5. statement_list
  6. END IF;

        oracle中if循环的应用

  1. declare
  2. v_a number := '&边长A';
  3. v_b number := '&边长B';
  4. v_c number := '&边长C';
  5. begin
  6. if (v_a+v_b) <= v_c or (v_a+v_c) <= v_b or (v_b+v_c) <= v_a then
  7. dbms_output.put_line( '无法组成三角形');
  8. elsif
  9. v_a = v_b and v_b = v_c then
  10. dbms_output.put_line( '等边三角形');
  11. elsif
  12. v_a = v_b or v_c = v_b or v_c = v_a then
  13. dbms_output.put_line('等腰三角形');
  14. else
  15. dbms_output.put_line('一般三角形');
  16. end if;
  17. end;

         & --是Oracle中键盘输入的意思,每一个参数对应&后的字符不能相同 否则会定义为同一值。

dde23d8ac44c466398c832315399249f.png

        输入参数值 查看结果

20f023b1998844e0b3c4c59aa69fc445.png

postgresql中示例

  1. do $$
  2. declare
  3. v_a integer := 1 ;
  4. v_b integer := 4;
  5. v_c integer := 2;
  6. begin
  7. if (v_a+v_b) <= v_c or (v_a+v_c) <= v_b or (v_b+v_c) <= v_a then
  8. raise notice '无法组成三角形';
  9. elsif
  10. v_a = v_b and v_b = v_c then
  11. raise notice '等边三角形';
  12. elsif
  13. v_a = v_b or v_c = v_b or v_c = v_a then
  14. raise notice '等腰三角形';
  15. else
  16. raise notice '一般三角形';
  17. end if;
  18. end $$;

fb3da4f101ea45cdacddcd164500174a.png

在postgresql中单次执行 使用DO  并带上一对

  作为包头包尾 框住代码块 

在case when 语法和if 语法中  都有一个“短路原则” 当执行到第一个被满足的case when 或者 if/elsif  的条件时  就会跳出循环体。二次单个IF 如何在没有其他控制语言操作的情况 只会循环一次。

loop 和IF 的结合应用 结构

  1. LOOP
  2. statement_list
  3. IF exit_condition THEN
  4. EXIT;
  5. END IF;
  6. END LOOP;

 postgresq中的应用示例

  1. DO $$
  2. DECLARE
  3. v_a INTEGER := 5;
  4. v_b INTEGER := 5;
  5. v_c INTEGER := 7;
  6. BEGIN
  7. LOOP
  8. EXIT WHEN (v_a + v_b + v_c)>100; --设置退出条件
  9. IF v_a = v_b and v_c = v_b and v_c = v_a THEN
  10. RAISE NOTICE '%,%,% 组成等边三角形', v_a, v_b, v_c;
  11. ELSIF (v_a + v_b) > v_c THEN
  12. RAISE NOTICE '%,%,% 组成一般三角形', v_a, v_b, v_c;
  13. ELSIF v_a = v_b or v_c = v_b or v_c = v_a THEN
  14. RAISE NOTICE '%,%,% 组成等边三角形', v_a, v_b, v_c;
  15. else RAISE NOTICE '%,%,% 无法组成三角形', v_a, v_b, v_c;
  16. END IF;
  17. v_a := ROUND(RANDOM() * 10 + v_a);
  18. v_b := ROUND(RANDOM() * 10 + v_b);
  19. v_c := ROUND(RANDOM() * 10 + v_c);
  20. END LOOP;
  21. END $$;

 546a6a1185134c889fdbe9b46ae3a1ac.png

Oracle中的语法示例

  1. DECLARE
  2. v_a INTEGER := 5;
  3. v_b INTEGER := 2;
  4. v_c INTEGER := 1;
  5. BEGIN
  6. LOOP
  7. EXIT WHEN (v_a + v_b + v_c)>100; --设置退出条件
  8. IF v_a = v_b AND v_c = v_b AND v_c = v_a THEN
  9. DBMS_OUTPUT.PUT_LINE(v_a || ',' || v_b || ',' || v_c || ' 组成等边三角形');
  10. ELSIF (v_a + v_b) > v_c THEN
  11. DBMS_OUTPUT.PUT_LINE(v_a || ',' || v_b || ',' || v_c || ' 组成一般三角形');
  12. ELSIF v_a = v_b OR v_c = v_b OR v_c = v_a THEN
  13. DBMS_OUTPUT.PUT_LINE(v_a || ',' || v_b || ',' || v_c || ' 组成等腰三角形');
  14. ELSE
  15. DBMS_OUTPUT.PUT_LINE(v_a || ',' || v_b || ',' || v_c || ' 无法组成三角形');
  16. END IF;
  17. v_a := ROUND(DBMS_RANDOM.VALUE*10 + v_a);
  18. v_b := ROUND(DBMS_RANDOM.VALUE*10 + v_b);
  19. v_c := ROUND(DBMS_RANDOM.VALUE*10 + v_c);
  20. END LOOP;
  21. END;

cde0c183b5ef4d28b2c10aa8d89fa604.png

LOOP 用于控制 IF无次数约束的循环  直到满足loop的退出条件为止。 

for 结构

  1. FOR var IN 1..10 LOOP
  2. statement_list
  3. END LOOP;

loop和FOR 的结合应用

Oracle示例:

loop 的另类使用 添加 特殊变量SQL%NOTFOUND  关于特殊变量后续会再做详细介绍

SQL%NOTFOUND --如果循环语句中没有找到任何行,则退出循环体

  1. DECLARE
  2. ROW_RECCORD FINANCIAL_INDEX%rowtype;
  3. BEGIN
  4. FOR ROW_RECCORD IN (SELECT * FROM FINANCIAL_INDEX) LOOP
  5. IF MOD(ROW_RECCORD.ID, 2) = 0 THEN
  6. DBMS_OUTPUT.PUT_LINE('ID: ' || ROW_RECCORD.ID || ', ' || 'cwzbkm: ' ||
  7. ROW_RECCORD.cwzbkm || ', ' || '2009: ' ||
  8. ROW_RECCORD."2009" || ', ' || '2010: ' ||
  9. ROW_RECCORD."2010" || ', ' || '2011: ' ||
  10. ROW_RECCORD."2011" );
  11. END IF;
  12. END LOOP;
  13. END;

执行完后查看效果

826164686f5e49899f25537bdf395f97.png

postgresql示例

  1. do $$
  2. DECLARE
  3. ROW_RECCORD FINANCIAL_INDEX%rowtype;
  4. BEGIN
  5. FOR ROW_RECCORD IN SELECT * FROM FINANCIAL_INDEX LOOP
  6. IF MOD(ROW_RECCORD.ID, 2) = 0 THEN
  7. RAISE NOTICE 'ID: %, cwzbkm: %, 2009: %, 2010: %, 2011: %',
  8. ROW_RECCORD.ID, ROW_RECCORD.cwzbkm, ROW_RECCORD."2009",
  9. ROW_RECCORD."2010", ROW_RECCORD."2011";
  10. END IF;
  11. END LOOP;
  12. END$$;

 fe7b3a585ac640358b756990d2abb88f.png

while  结构

  1. while condition
  2. loop
  3. statement_list
  4. end loop;

loop和whilie 的结合应用

oracle中的应用示例

  1. /*
  2. 用存储过程对1-100数字进行求和计算
  3. */
  4. declare
  5. v_sum NUMBER := 0;
  6. v_i NUMBER;
  7. BEGIN
  8. v_i := 1;
  9. WHILE v_i <= 100 LOOP
  10. v_sum := v_sum + v_i;
  11. v_i := v_i+1;
  12. END LOOP;
  13. DBMS_OUTPUT.put_line('1-100的和是:'||v_sum);
  14. END;

8a6f356475d4451799a0ff140be7ccbd.png

postgresql中的应用示例

  1. /*
  2. 用存储过程对1-100数字进行求和计算
  3. */
  4. do $$
  5. declare
  6. v_sum integer := 0;
  7. v_i integer;
  8. BEGIN
  9. v_i := 1;
  10. WHILE v_i <= 100 LOOP
  11. v_sum := v_sum + v_i;
  12. v_i := v_i+1;
  13. END LOOP;
  14. raise notice '1-100的和是:%',v_sum;
  15. END$$;

42ebabbb023b43869a4ff4887167d59c.png

loop 在循环中常常会伴随这if  ,case when ,while ,for等循环结构使用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/406030
推荐阅读
相关标签
  

闽ICP备14008679号