01 pl/sql简介及代码块

pl/sql procedural language 过程化语言,是Oracle在标准的SQL基础之上的扩展,可以定义变量、使用逻辑控制语句。默认Oracle一次只能处理一条语句,如果使用PL/SQL,可以使用块组织多条语句,作为一个整体执行,只向数据库服务器发送一次请求调用。块,是pl/sql最基本的单元,由块可组成不同的程序形式,如匿名块、存储过程、函数、包、触发器等。本文将介绍块的使用。

1、系统、软件和约束条件

  • win10
  • oracle11g
  • sql developer

2、块

  • 块的组成:定义部分【可选】、执行部分【必选】、异常处理部分【可选】
  • 1 声明一个变量,打印
set serveroutput on;--打开输出开关【每个终端执行一次即可】
declare --申明部分
  v_name varchar(20); --声明一个变量v_name
begin --执行部分开始
  v_name := 'zhangli'; --给v_name赋值为zhangli
  dbms_output.put_line(v_name);--打印变量到控制台
end; --执行部分结束
  • 2 使用type声明标量,接受键盘输入,打印
declare 
  v_name emp.ename%type; --声明一个简单变量v_name,以type方式赋予类型
begin --执行部分开始
  select ename into v_name from emp where empno=&no;--接受键盘输入,将用户名称赋予v_name
  dbms_output.put_line(v_name);--打印变量到控制台
end; --执行部分结束
  • 3 使用rowtype声明变量,接受键盘输入,打印
declare 
  v_emp_record emp%rowtype; --声明一个简单变量v_emp_record,以rowtype方式赋予类型
begin --执行部分开始
  select * into v_emp_record from emp where empno=&no;--接受键盘输入,将用户名称赋予v_emp_record 
  dbms_output.put_line(v_emp_record .ename||v_emp_record.sal);--打印变量到控制台
end; --执行部分结束
  • 4 申明复合类型,接受键盘输入,打印
declare 
  type emp_record_type is record (name emp.ename%type,sal emp.sal%type); --定义记录类型
  v_emp_record emp_record_type; --定义记录类型的变量
begin --执行部分开始
  select ename,sal into v_emp_record from emp where empno=&no;--接受键盘输入,将用户名称赋予v_emp_record 
  dbms_output.put_line(v_emp_record .name||v_emp_record.sal);--打印变量到控制台
end; --执行部分结束
  • 5 pl/sql索引表
declare 
  type emp_table_type is table of emp.ename%type index by binary_integer;  --定义表类型
  v_emp_table emp_table_type;  --定义表类型的变量
begin
  select ename into v_emp_table(-20) from emp where empno=7369;--下表是整型,随意指定
  select ename into v_emp_table(13) from emp where empno=7654;
  dbms_output.put_line('7369姓名:'||v_emp_table(-20)||',7654姓名:'||v_emp_table(13));
end;
  • 6 pl/sql嵌套表
declare
  type name_table is table of emp.ename%type;--声明一个表类型
  v_name_table name_table;
begin
  v_name_table:=name_table('abc','efg');
  dbms_output.put_line(v_name_table(1));
end;
  • 7 varray数组
declare
  type a_array is varray(3) of varchar2(10);  --定义数组类型
  v_names a_array; --定义数组类型的变量
begin
  v_names :=a_array('zhangli','ali','xiaoli'); --为数组元素赋值
  dbms_output.put_line(v_names (1)||','||v_names (2)||','||v_names (3));
end;
  • 8 if表达式 ,输入雇员编号,查询工资,如果工资大于3000,显示白领;如果工资大于1500小于3000,显示蓝领,否则显示灰领
declare
  v_sal emp.sal%type;
begin
  select sal into v_sal from emp where empno=&no;
  if v_sal>=3000 then
    dbms_output.put_line('白领');
  elsif v_sal>=1500 and v_sal<3000 then
    dbms_output.put_line('蓝领');
  else
    dbms_output.put_line('灰领');
  end if;
end;
  • 9 case表达式,输入成绩等级,如果是A,输出perfect,如果是B输出very good,如果是C输出good,否则输出bad
declare
  v_grade varchar2(1);
  v_comm varchar2(20);
begin
  v_grade:=upper('&grade');
  case v_grade
    when 'A' then v_comm:='perfect';
    when 'B' then v_comm:='very good';
    when 'C' then v_comm:='good';
    else  v_comm:='bad';
  end case;
  dbms_output.put_line(v_comm);
end;    
  • 10 loop循环,从1打印到20
declare
  v_i number(2):=1;
begin
  loop 
    dbms_output.put_line(v_i);
    v_i:=v_i+1;
    exit when v_i>20;
  end loop;
end;
  • 11 while循环,从1打印到20
declare
  v_i number(2);
begin
  v_i:=1;
  while v_i<=20 
  loop
    dbms_output.put_line(v_i);
    v_i:=v_i+1;
  end loop;
end;
  • 12 for循环,从1打印到20
begin
  for i in 1..20
  loop
    dbms_output.put_line(i);
  end loop;
end;
  • 12 使用循环完成乘法口诀
declare
  v_i number(10) := 1;
  v_line number(10) :=1;
  v_abc varchar(200) default '';
begin
  loop
    for v_i in 1..v_line
    loop
      v_abc:= v_abc || v_i||'*'||v_line||'='||v_i*v_line||' ';
      --dbms_output.put_line(v_i*v_line);
    end loop;
    dbms_output.put_line(v_abc);
    v_abc :='';
    v_line:=v_line+1;
    exit when v_line>9;
  end loop;
end;

至此,我们熟悉了pl/sql编程中的块,为我们下面的学习打下了基础。

posted @ 2020-03-26 20:08  张力的程序园  阅读(481)  评论(0)    收藏  举报