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

目录

简介

CASE WHEN 结构

oracle 中应用 

postgresql中的应用 

IF 结构

        oracle中if循环的应用

postgresql中示例

loop 和IF 的结合应用 结构

 postgresq中的应用示例

Oracle中的语法示例

for 结构

loop和FOR 的结合应用

Oracle示例:

postgresql示例

while  结构

oracle中的应用示例

postgresql中的应用示例


简介

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

oracle建表语句

-- Create table
create table FINANCIAL_INDEX
(
  id     NUMBER(11) not null,
  cwzbkm varchar2(100),
  "2011" NUMBER,
  "2010" NUMBER,
  "2009" NUMBER
);

postgresql 建表语句

--drop table FINANCIAL_INDEX;
-- Create table
create table FINANCIAL_INDEX
(
  id     integer not null,
  cwzbkm varchar(100),
  "2011" numeric(10,2),
  "2010" numeric(10,2),
  "2009" numeric(10,2)
); 

测试数据 

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

CASE WHEN 结构

##第一种写法
CASE case_value
    WHEN when_value THEN
        statement_list
    ELSE
        statement_list
END CASE;

##第二种写法
CASE WHEN case_value [=/>|<|<>] when_value THEN
        statement_list
    ELSE
        statement_list
END CASE; 

/*第一种写法相当于 第二种写法为等号时的效果*/

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

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

select id,
       cwzbkm,
       "2009",
       "2010",
       "2011",
       case
         when "2009" < "2010" and "2010" < "2011" then
          'true'
       end as "values"
  from financial_index

oracle 中应用 

8ceb478cb48e4b97a7eb96c1c3697a2d.png

postgresql中的应用 

4a730694d8a5405fa32686fd5e98987a.png

IF 结构

IF condition
THEN
	statement_list
ELSE
	statement_list
END IF;

        oracle中if循环的应用

declare
  v_a  number := '&边长A';
  v_b  number := '&边长B';
  v_c  number := '&边长C';
  
begin
  
  if  (v_a+v_b) <= v_c or (v_a+v_c) <= v_b  or (v_b+v_c) <= v_a then
    dbms_output.put_line( '无法组成三角形');
  elsif 
       v_a = v_b and v_b = v_c then
    dbms_output.put_line( '等边三角形');
  elsif  
      v_a = v_b or v_c = v_b or v_c = v_a then
      
    dbms_output.put_line('等腰三角形');
  else
     dbms_output.put_line('一般三角形'); 
  end if;  

end;

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

dde23d8ac44c466398c832315399249f.png

        输入参数值 查看结果

20f023b1998844e0b3c4c59aa69fc445.png

postgresql中示例

do $$
declare
  v_a  integer := 1 ;
  v_b  integer  := 4;
  v_c  integer := 2;
  
begin
  
  if  (v_a+v_b) <= v_c or (v_a+v_c) <= v_b  or (v_b+v_c) <= v_a then
    raise notice '无法组成三角形';
  elsif 
       v_a = v_b and v_b = v_c then
     raise notice '等边三角形';
  elsif  
      v_a = v_b or v_c = v_b or v_c = v_a then
      
     raise notice '等腰三角形';
  else
     raise notice '一般三角形'; 
  end if;  

end $$;

fb3da4f101ea45cdacddcd164500174a.png

在postgresql中单次执行 使用DO  并带上一对$$  $$  作为包头包尾 框住代码块 

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

loop 和IF 的结合应用 结构

LOOP
	statement_list

	IF exit_condition THEN
		EXIT; 
	END IF; 
END LOOP;

 postgresq中的应用示例

DO $$
DECLARE
  v_a  INTEGER := 5;
  v_b  INTEGER := 5;
  v_c  INTEGER := 7;
BEGIN
  LOOP 
    EXIT WHEN (v_a + v_b + v_c)>100;  --设置退出条件
    IF v_a = v_b and  v_c = v_b and  v_c = v_a THEN      
      RAISE NOTICE '%,%,% 组成等边三角形', v_a, v_b, v_c;
    ELSIF (v_a + v_b) > v_c THEN 
      RAISE NOTICE '%,%,% 组成一般三角形', v_a, v_b, v_c;
    ELSIF v_a = v_b or  v_c = v_b or  v_c = v_a THEN 
      RAISE NOTICE '%,%,% 组成等边三角形', v_a, v_b, v_c;
	 else  RAISE NOTICE '%,%,% 无法组成三角形', v_a, v_b, v_c;
    END IF;
    v_a := ROUND(RANDOM() * 10 + v_a);
    v_b := ROUND(RANDOM() * 10 + v_b);
    v_c := ROUND(RANDOM() * 10 + v_c);
  END LOOP;  
END $$;

 546a6a1185134c889fdbe9b46ae3a1ac.png

Oracle中的语法示例

DECLARE
  v_a INTEGER := 5;
  v_b INTEGER := 2;
  v_c INTEGER := 1;
BEGIN
  LOOP 
     EXIT WHEN (v_a + v_b + v_c)>100;  --设置退出条件
    IF v_a = v_b AND v_c = v_b AND v_c = v_a THEN      
      DBMS_OUTPUT.PUT_LINE(v_a || ',' || v_b || ',' || v_c || ' 组成等边三角形');
    ELSIF (v_a + v_b) > v_c THEN 
      DBMS_OUTPUT.PUT_LINE(v_a || ',' || v_b || ',' || v_c || ' 组成一般三角形');
    ELSIF v_a = v_b OR v_c = v_b OR v_c = v_a THEN 
      DBMS_OUTPUT.PUT_LINE(v_a || ',' || v_b || ',' || v_c || ' 组成等腰三角形');
  ELSE
    DBMS_OUTPUT.PUT_LINE(v_a || ',' || v_b || ',' || v_c || ' 无法组成三角形');
    END IF;
    v_a := ROUND(DBMS_RANDOM.VALUE*10 + v_a);
    v_b := ROUND(DBMS_RANDOM.VALUE*10 + v_b);
    v_c := ROUND(DBMS_RANDOM.VALUE*10 + v_c);
  END LOOP;  
END;

cde0c183b5ef4d28b2c10aa8d89fa604.png

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

for 结构

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

loop和FOR 的结合应用

Oracle示例:

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

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

DECLARE
  ROW_RECCORD FINANCIAL_INDEX%rowtype;
BEGIN
  FOR ROW_RECCORD IN (SELECT * FROM FINANCIAL_INDEX) LOOP
    IF MOD(ROW_RECCORD.ID, 2) = 0 THEN
      DBMS_OUTPUT.PUT_LINE('ID: ' || ROW_RECCORD.ID || ', ' || 'cwzbkm: ' ||
                           ROW_RECCORD.cwzbkm || ', ' || '2009: ' ||
                           ROW_RECCORD."2009" || ', ' || '2010: ' ||
                           ROW_RECCORD."2010" || ', ' || '2011: ' ||
                           ROW_RECCORD."2011" );
    END IF;
  END LOOP;
END;

执行完后查看效果

826164686f5e49899f25537bdf395f97.png

postgresql示例

do $$
DECLARE
ROW_RECCORD FINANCIAL_INDEX%rowtype;
BEGIN
FOR ROW_RECCORD IN SELECT * FROM FINANCIAL_INDEX LOOP
IF MOD(ROW_RECCORD.ID, 2) = 0 THEN
RAISE NOTICE 'ID: %, cwzbkm: %, 2009: %, 2010: %, 2011: %',
ROW_RECCORD.ID, ROW_RECCORD.cwzbkm, ROW_RECCORD."2009",
ROW_RECCORD."2010", ROW_RECCORD."2011";
END IF;
END LOOP;
END$$;

 fe7b3a585ac640358b756990d2abb88f.png

while  结构

while  condition
loop
  statement_list
end loop;

loop和whilie 的结合应用

oracle中的应用示例

/*
  用存储过程对1-100数字进行求和计算
*/
declare
  v_sum NUMBER := 0;
  v_i NUMBER;
BEGIN
  v_i  := 1;
  WHILE v_i <= 100 LOOP
        v_sum := v_sum + v_i;
        v_i := v_i+1;
    END LOOP;
   DBMS_OUTPUT.put_line('1-100的和是:'||v_sum);
END;

8a6f356475d4451799a0ff140be7ccbd.png

postgresql中的应用示例

/*
  用存储过程对1-100数字进行求和计算
*/
do $$
declare
  v_sum integer := 0;
  v_i integer;
BEGIN
  v_i  := 1;
  WHILE v_i <= 100 LOOP
        v_sum := v_sum + v_i;
        v_i := v_i+1;
    END LOOP;
   raise notice  '1-100的和是:%',v_sum;
END$$;

42ebabbb023b43869a4ff4887167d59c.png

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES,现在已经更名为PostgreSQL. PostgreSQL支持大部分SQL标准并且提供了许多其它现代特性:复杂查询、外键、触发器、视图、事务完整性等。PostgreSQL 是一个免费的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),和专有系统(比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server)之外的另一种选择。事实上, PostgreSQL 的特性覆盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,首先,它包括了可以说是目前世界上最丰富的数据类型的支持,其有些数据类型可以说连商业数据库都不具备, 比如 IP 类型和几何类型等;其次,PostgreSQL 是全功能的自由软件数据库,很长时间以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统(MVCC)、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统。 Inprise 的 InterBase 以及SAP等厂商将其原先专有软件开放为自由软件之后才打破了这个唯一。最后,PostgreSQL拥有一支非常活跃的开发队伍,而且在许多黑客的努力下,PostgreSQL 的质量日益提高。从技术角度来讲,PostgreSQL 采用的是比较经典的C/S(client/server)结构,也就是一个客户端对应一个服务器端守护进程的模式,这个守护进程分析客户端来的查询请求,生成规划树,进行数据检索并最终把结果格式化输出后返回给客户端。为了便于客户端的程序的编写,由数据库服务器提供了统一的客户端 C 接口。而不同的客户端接口都是源自这个 C 接口,比如ODBC,JDBC,Python,Perl,Tcl,C/C++,ESQL等, 同时也要指出的是,PostgreSQL 对接口的支持也是非常丰富的,几乎支持所有类型的数据库客户端接口。这一点也可以说是 PostgreSQL 一大优点。本课程作为PostgreSQL数据库管理一,主要讲解以下内容: 1.     PostgreSQL 存储过程基本知识2.     PostgreSQL 用户自定义函数3.     PostgreSQL 控制结构4.     PostgreSQL 游标和存储过程5.     PostgreSQL 索引6.     PostgreSQL 视图7.     PostgreSQL 触发器8.     PostgreSQL 角色、备份和还原9.     PostgreSQL 表空间管理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值