zoukankan      html  css  js  c++  java
  • 【SQL】Oracle的PL/SQL语法及其拓展数据类型总结

    PL/SQL语法

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

    模板:

    DECLARE
    	/*变量声明*/
    BEGIN
    	/*程序主体*/
    EXCEPTION
    	/*异常处理部分*/
    END;

    接收用户的输入信息

    PL/SQL  块还可以接收用户的输入信息,例如:现在要求用户输入一个雇员编号,之后根据输入的内容进行查询,查询雇员的姓名。
    用户的输入信息使用“&”完成。
    范例:

    DECLARE
    	t_eno NUMBER ;
    	t_ename VARCHAR2(30) ; 
    BEGIN
    	--  输入的信息保存在 eno 里
    	t_eno := &no;
    	--  之后根据 eno 的值,对数据库进行查询操作
    	SELECT ename INTO t_ename FROM emp WHERE empno=t_eno ; 
    	DBMS_OUTPUT.put_line('编号为:'||t_eno||'雇员的姓名为:'||t_ename) ;
    EXCEPTION
    	WHEN no_data_found THEN DBMS_OUTPUT.put_line('没有此雇员') ; 
    END ;

    自定义数据类型之%type

    定义一个变量,可以将其与表中某个列的数据类型一致。

    如上例修改为以下也可运行。

    DECLARE
    t_eno emp.empno%type ;
    t_ename emp.ename%type; 
    BEGIN
      --  输入的信息保存在 eno 里
      t_eno := &no;
      --  之后根据 eno 的值,对数据库进行查询操作
      SELECT ename INTO t_ename FROM emp WHERE empno=t_eno ; 
      DBMS_OUTPUT.put_line('编号为:'||t_eno||'雇员的姓名为:'||t_ename) ;
    EXCEPTION
     	 WHEN no_data_found THEN DBMS_OUTPUT.put_line('没有此雇员') ; 
    END ;
    DECLARE
    t_eno emp.empno%type ;
    t_ename emp.ename%type; 
    BEGIN
      --  输入的信息保存在 eno 里
      t_eno := &no;
      --  之后根据 eno 的值,对数据库进行查询操作
      SELECT ename INTO t_ename FROM emp WHERE empno=t_eno ; 
      DBMS_OUTPUT.put_line('编号为:'||t_eno||'雇员的姓名为:'||t_ename) ;
    EXCEPTION
     	 WHEN no_data_found THEN DBMS_OUTPUT.put_line('没有此雇员') ; 
    END ;

    复合数据类型之record


    将一个或多个标量封装成一个对象,由单行多列的标量构成的复合结构,组成类似于一维数组。 
    如下例查询表中两列将其放入记录类型并输出显示。

    DECLARE
    	type rec_test1 is record(
    	t_empno emp.empno%type,
    	t_ename emp.ename%type
    	); --定义一个record类型
    	rt rec_test1;--使用你刚才定义的record类型,定义了一个变量rt.
    BEGIN
    	select empno,ename into rt.t_empno,rt.t_ename from emp where empno=1001;
    	dbms_output.put_line('empno:'||rt.t_empno);
    END ;
    DECLARE
      type rec_test1 is record(
      a1 number,
      a2 varchar2(10)
      );
      rt1 rec_test1;
      rt2 rec_test1;
    BEGIN
      rt1.a1:=1;
      rt1.a2:='china';
      rt2.a1:=2;
      rt2.a2:='usa';
      dbms_output.put_line('rt1.a2:'||rt1.a2);
      dbms_output.put_line('rt2.a2:'||rt2.a2);
    END ;

    复合数据类型之%rowtype


    %ROWTYPE可以说是record的升级简化版。 
    区别在与前者结构为表结构,后者为自定义结构。
    二者在使用上没有很大区别。前者方便,后者灵活。
    在实际中根据情况来具体决定使用。

    使用记录更新数据,如果用记录(RECORD)更新数据,那么只能使用记录成员;如果用%ROWTYPE更新数据,可以直接使用%ROWTYPE 。如:

    DECLARE
      vEmp emp%RowType;
    Begin
      select * InTo vEmp from empa where empa.EMPNO = '7934';
      update  empa set ROW = vEmp where EMPNO ='1111'; 
      commit;
    End; 


    【注】在进行如上操作前,需要复制表emp到empa。
    复制表的结构

    CREATE TABLE empa as SELECT * FROM emp WHERE 1=2;

    复制表的数据

    INSERT INTO empa SELECT * FROM emp;

    Oracle扩展数据类型小结

    %type:可让变量的类型与指定表的某列保持一致;
    t_empno 表名.列名%type;

    %record:单行多列,类似于一位数组;
    1.先创建类型 2.再创建该类型的变量
    type XXX is record(
    列1 数据类型(长度),列2 数据类型(长度)…
    );
    x XXX; --x是变量, XXX是它的类型
    如何引用某列? x.列名 即可

    %rowtype: 是%record的升级简化版,可让其与某张表的结构完全一致.

    x 表名%rowtype; --x是变量名


  • 相关阅读:
    jquery ajax get 数组参数
    xcopy中文文件名,中文件目录乱码问题
    小程序使用wxParse插件解析html标签图片间距问题
    30分钟彻底弄懂flex布局
    abp ueditor 多图以及文件无法上传
    Lubuntu 18.04 自动登录
    树莓派虚拟环境手动安装HA
    ESP-01S刷ESPEasy固件,接入HA
    百度TTS的来由
    Pi 3B+编译安装python3.6.8
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3241407.html
Copyright © 2011-2022 走看看