首页 > 技术文章 > PL编程

zyp0519 2021-08-21 18:01 原文

SQL语言知识访问和操作数据库的语言,并不是具有流程控制的程序语言。

而PL/SQL专门用于在各种环境下对Oracle数据库进行访问。由于该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行快速高效的处理。除此之外,可以在oracle数据库的某些客户端工具中,使用PL/SQL语言也是该语言的一个特点。

2.1   PL/SQL块

PL/SQL程序由三个块组成,即声明部分、执行部分、异常处理部分。

PL/SQL块的结构如下:

 

 

 

其中:执行部分不能省略。

  1. 无名块或匿名块(anonymous):动态构造,只能执行一次,可调用其它程序,但不能被其它程序调用。

  2. 命名块(named):是带有名称的匿名块,这个名称就是标签。

  3.子程序(subprogram):存储在数据库中的存储过程、函数等。当在数据库上建立好后可以在其它程序中调用它们。

  4.触发器 (Trigger):当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。

  5. 程序包(package):存储在数据库中的一组子程序、变量定义。在包中的子程序可以被其它程序包或子程序调用。但如果声明的是局部子程序,则只能在定义该局部子程序的块中调用该局部子程序。

 

2.2   PL/SQL结构

l       PL/SQL块中可以包含子块;

l       子块可以位于 PL/SQL中的任何部分;

l       子块也即PL/SQL中的一条命令;

 

2.3   标识符

PL/SQL程序设计中的标识符定义与SQL 的标识符定义的要求相同。要求和限制有:

l       标识符名不能超过30字符;

l       第一个字符必须为字母;

l       不分大小写;

l       不能用’-‘(减号);

l       不能是SQL保留字。

提示:  一般不要把变量名声明与表中字段名完全一样,如果这样可能得到不正确的结果.

 

2.4   PL/SQL 变量类型

在前面的介绍中,有系统的数据类型,也可以自定义数据类型。下表给出ORACLE类型和PL/SQL中的变量类型的合法使用列表:

2.4.1  变量类型

在ORACLE8i中可以使用的变量类型有

类型

子类

说     明

范   围

ORACLE限制

CHAR

Character

String

Rowid

Nchar

定长字符串

 

 

民族语言字符集

0à32767

可选,确省=1

2000

VARCHAR2

Varchar, String

NVARCHAR2

可变字符串

民族语言字符集

0à32767

4000

4000

BINARY_INTEGER

 

带符号整数,为整数计算优化性能

 

 

NUMBER(p,s)

Dec

 

Double precision

Integer

Int

Numeric

Real

Small int

小数, NUMBER 的子类型

高精度实数

整数, NUMBER 的子类型

整数, NUMBER 的子类型

与NUMBER等价

与NUMBER等价

整数, 比 integer 小

 

 

LONG

 

变长字符串

0->2147483647

32,767字节

DATE

 

日期型

公元前4712年1月1日至公元后4712年12月31日

 

BOOLEAN

 

布尔型

TRUE, FALSE,NULL

不使用

ROWID

 

存放数据库行号

 

 

UROWID

 

通用行标识符,字符类型

 

 

boolean (逻辑判断 true、false、null)
v_num1 := 50; -- = 在PL/SQL中是判断,而:=则是赋值
v_num2 := 60;
v_bool := (v_num1 < v_num2); 

例1. 插入一条记录并显示;

复制代码

DECLARE
   Row_id ROWID;
   info    VARCHAR2(40);
BEGIN
  INSERT INTO scott.dept VALUES (90, '财务室', '海口')
  RETURNING rowid, dname||':'||to_char(deptno)||':'||loc
  INTO row_id, info;
  DBMS_OUTPUT.PUT_LINE('ROWID:'||row_id);
  DBMS_OUTPUT.PUT_LINE(info);
END;
 
复制代码
 

plsql中的三种循环

--while循环(条件成立时执行)
declare
    pnum number:=1;

    while pnum<=10 loop
        dbms_output.put_line(pnum);
        pnum:=pnum+1;
    end loop;
end;        

 

--loop循环(条件成立时退出)
declare
    pnum number:=1;
begin
    loop

--退出条件:循环变量大于10
        exit when pnum>10;
--打印该变量的值
        DBMS_OUTPUT.PUT_LINE(pnum);
--循环变量+1
        pnum:=pnum+1;
    end loop;
end;        

 

--for循环(1..10表示连续区间)
declare 
    punm number:=1;
begin
    for pnum in 1..10 loop
        dbms_output.put_line(pnum);
    end loop;
end; 

 

运用

/* 打印1--10 */
begin
  for i in 1..10 loop
    dbms_output.put_line(i);
  end loop;
end;

/* 打印直角三角形 */
begin
  for i in 1..10 loop
    for j in 1..i loop
      dbms_output.put('*');
    end loop;
    dbms_output.put_line('');
  end loop;
end;


/* 打印正三角形 */
begin
  for i in 1..10 loop
    for j in 1..10-i loop
      dbms_output.put(' ');
    end loop;
    
    for k in 1..2*i-1 loop
      dbms_output.put('*');
    end loop;
    
    dbms_output.put_line('');
  end loop;
end;


/* 打印镂空正三角形 */
begin
  for i in 1..10 loop
    for j in 1..10-i loop
      dbms_output.put(' ');
    end loop;
    
    for k in 1..2*i-1 loop
      if k=1 or k=2*i-1 or i=10 then
        dbms_output.put('*');
      else
        dbms_output.put(' ');
      end if;
    end loop;
    
    dbms_output.put_line('');
  end loop;
end;

 




 
 

推荐阅读