Lenguaje de programación Oracle- (4) pl / sql

----- lenguaje de programación pl / sql

----- El lenguaje de programación pl / sql es una extensión del lenguaje sql, lo que hace que el lenguaje sql tenga las características de la programación procedimental.
----- El lenguaje de programación pl / sql es más flexible y eficiente que los lenguajes de programación de procedimientos generales.

---- Método de declaración

  ----赋值操作可以使用: =也可以使用into查询语句赋值
	declare 
	  i number(2) :=10;
	  s varchar2(10) :='小明';
	  ena emp.ename%type;       ----引用型变量
	  emprow emp%rowtype;       ----记录型变量
	begin 
	  dbms_output.put_line(i);
	  dbms_output.put_line(s);
	  select ename into ena from emp where empno=7788;
	  dbms_output.put_line(ena);
	  select * into emprow from emp where empno=7788;
	  dbms_output.put_line(emprow.ename||'的工作为:'||emprow.job);
	end;
	
	---pl/sql中的if判断
	---输入小于18的数字,输出未成年
	---输入大于18小于40的数字,输出中年人
	---输入大于40的数字,输出老年人
	declare
	  i number(3) := ⅈ
	begin
	  if i<18 then
	    dbms_output.put_line('未成年');
	  elsif  i<40 then 
	    dbms_output.put_line('中年人');
	  else
	    dbms_output.put_line('老年人');
	  end if;
	end;
	
	---pl/sql中的loop循环
	---用三种方式输出1到10的十个数字
	---while循环
	declare 
	   i number(2) :=1;
	begin
	   while i<11 loop
	     dbms_output.put_line(i);
	     i :=i+1;
	   end loop;
	
	end;
	
	---exit循环
	declare
	  i number(2) :=1;
	begin
	  loop
	     exit when i>10;
	     dbms_output.put_line(i);
	     i :=i+1;
	  end loop;
	end;
	
	---for循环
	declare
	
	begin
	  for i in 1..10 loop
	     dbms_output.put_line(i);
	  end loop;
	end;

-Cursor: puede almacenar múltiples objetos, múltiples filas de registros

  ---输出emp表中所有员工的姓名
	declare 
	  cursor c1 is select * from emp;
	  emprow emp%rowtype;
	begin
	  open c1;
	    loop
	      fetch c1 into emprow;
	      exit when c1%notfound;
	      dbms_output.put_line(emprow.ename);
	    end loop;
	  close c1;
	end;
	
	---给指定部门员工涨工资
	declare
	  cursor c2(eno emp.deptno%type) 
	  is select empno from emp where deptno = eno;
	  en emp.empno%type;
	begin
	  open c2(10);
	     loop 
	       fetch c2 into en;
	       exit when c2%notfound;
	       update emp set sal=sal+100 where empno=en;
	       commit;
	     end loop;
	  close c2;
	end;
	
	---查询10好部门员工信息
	select * from emp where deptno = 10;

-Procedimiento almacenado

-Procedimiento almacenado: El procedimiento almacenado es una sección del lenguaje pl / sql que ha sido compilado de antemano y colocado en el lado de la base de datos
--------- se puede llamar entre. Esta sección de pl / sql es generalmente un negocio de paso fijo.

  ----给指定员工涨100块钱
	create or replace procedure p1(eno emp.empno%type )
	is 
	
	begin
	  update emp set sal=sal+100 where empno=eno;
	  commit;
	end;
	
	
	select * from emp where empno=7788; 
	---测试pl
	declare 
	  
	begin
	  p1(7788);
	end;

---- Realice el cálculo del salario anual del empleado especificado a través de la función de almacenamiento

---- Ni el procedimiento almacenado ni los parámetros de función almacenados pueden tener longitud
---- El tipo de valor de retorno de la función almacenada no puede tener longitud

	----1.(in类型默认)
	create or replace function f_yearsal(eno emp.empno%type) return number
	is 
	  s number(10);
	begin 
	  select sal*12+nvl(comm,0) into s from emp where empno= eno;
	  return s;
	end;
	
	----测试f_yearsal
	----存储函数在调用的时候,返回值需要接收。
	declare 
	  s number(10);
	begin 
	  s :=f_yearsal(7788);
	  dbms_output.put_line(s);
	end;
	
	---2.out类型参数如何使用
	---使用存储过程来算年薪
	create or replace procedure p_yearsal(eno emp.empno%type,yearsal out number)
	is 
	    s number(10);
	    c emp.comm%type;
	begin
	  select sal*12, nvl(comm,0)  into s,c  from emp where empno= eno;
	  yearsal :=s+c;
	end;
	
	
	----测试p_yearsal
	declare 
	  yearsal number(10);
	begin
	  p_yearsal(7788,yearsal);
	    dbms_output.put_line(yearsal);
	end;

---- ¿Cuál es la diferencia entre los parámetros de tipo de entrada y salida?
---- Todos los parámetros involucrados en la asignación de la instrucción de consulta into o la operación de asignación: = deben decorarse con out y el resto debe decorarse con in

---- La diferencia entre un procedimiento almacenado y una función almacenada
---- Diferencia de sintaxis: las palabras clave son diferentes
------------- Las funciones almacenadas tienen dos retornos más que los procedimientos almacenados
---- Esencial Diferencia: la función almacenada tiene un valor de retorno, pero el procedimiento almacenado no devuelve un valor
. Si el procedimiento almacenado quiere implementar un negocio con un valor de retorno, debemos usar un parámetro de tipo out
---- --------- Incluso si el procedimiento almacenado usa parámetros de tipo, su esencia no es realmente un valor de retorno
--------- sino en el procedimiento almacenado Asistencia de parámetro de tipo, y luego, después de la ejecución, obtenemos directamente el valor del parámetro de tipo de salida

	---我们可以使用存储函数有返回值的特性,来定义函数。
	---而存储过程不能用来自定义函数。
	---案例需求:查询出员工姓名,员工所在部门名称。
	---案例准备工作,把scott用户下的dept表赋值到当前用户下
	create table dept as select * from scott.dept;
	---使用传统方式来实现案例需求
	select e.ename,d.dname
	from emp e,dept d
	where e.deptno =d.deptno;
	
	----使用存储函数来实现提供一个部门编号,输出一个部门名称。
	create or replace function fdna(dno dept.deptno%type) return dept.dname%type
	is 
	  dna dept.dname%type;
	begin
	  select dname into dna from dept where deptno=dno;
	  return dna;
	end;
	
	---使用fdna存储来实现案例需求:查询出员工姓名,员工所在部门名称。
	select e.ename,fdna(e.deptno)
	from emp e;

---- Trigger, es hacer una regla, cuando agregamos, eliminamos y modificamos operaciones

----只要满足该规则,自动触发,无需调用。
----语句级触发器
----行级触发器:包含有for each row的就是行级触发器。
------------------------加for each row是为了使用:old或者:new对象或者一行记录
	
	-----插入一条记录,输出一个新员工入职
	create or replace trigger t1
	after 
	insert
	on person 
	declare
	
	begin
	   dbms_output.put_line('一个新员工入职');
	end;
	
	---触发t1
	insert into person values (1,'小红');
	commit;
	select * from person
	
	---行级触发器
	---不能给员工降薪
	---raise _application_error(-20001~20999之间,'错误提示信息)
	create or replace trigger t2
	before 
	update 
	on emp
	for each row 
	declare 
	
	begin
	  if :old.sal>:new.sal then 
	    raise_application_error(-20001,'不能给老子降薪,懂了吗傻逼?');
	  end if;
	end; 
	    
	----触发t2
	update emp set sal=sal-1 where empno =7788;
	commit;
	
	select * from emp where empno =7788;
	
	----触发器实现主键自增。【行级触发器】
	----分析:在用户做插入操作之前,拿到即将插入的数据,
	----给改数据中的主键列赋值。
	create or replace trigger auid
	before 
	insert
	on person
	for each row 
	declare
	 
	begin
	  select s_person.nextval into  :new.pid from dual;
	  
	end;
	
	---查询person表
	select * from person;
	
	---使用auid实现主键自增
	insert into person (pname)  values('a');
	commit;
	 
	insert into person  values(1,'b');
	commit;
	 
	-----oracle10g   ojdbc14.jar
	-----oracle11g   ojdbc6.jar

Actualizando continuamente ...

Supongo que te gusta

Origin blog.csdn.net/weixin_44325444/article/details/106431694
Recomendado
Clasificación