• oracle入门(6)——PL/SQL常用语法


    【本文介绍】

    本文不是”语法大全“,只是记录下作项目里自己常用的一些语法。方便查询。

    【语法】

    【输出】  
    (1)输出语法
    DBMS_OUTPUT.PUT_LINE(   )

    【定义】  
    (1)定义变量:
    ......
    as
    变量名  类型(长度)
    begin
    ......

    例如:

    (2)定义变量 ,类型 依赖其他变量的类型
    例如:
    这样,改了name的类型,returnValue类型也跟着改变。
    (3)自定义类型(类似C语言的结构体)每次只能拿一条数据,不然会的报错。
    例如:
    
    
    (4)以“表”做为类型。每次只能拿一条数据,不然会的报错。
    例如:
    
    
    (5)以“表”做为类型的数组,数组下标为int型。每次只能拿一条数据,不然会的报错。
    
    
    (6)以“表”做为类型的数组,数组下表为字符型。每次只能拿一条数据,不然会的报错。
    CREATE OR REPLACE 
    PROCEDURE "userList" 
    AS
    TYPE user_type_list is table OF
    "user"%rowtype --索引表类型
    index by VARCHAR2(20);
     
    myUserList user_type_list;
     
    BEGIN
        SELECT * into myUserList('one') from "user" WHERE "user"."id" = '1';
        DBMS_OUTPUT.PUT_LINE(myUserList('one')."id");
        DBMS_OUTPUT.PUT_LINE(myUserList('one')."name");
        DBMS_OUTPUT.PUT_LINE(myUserList.first);
    END;
    (7)VARCHAR变长数组
    CREATE OR REPLACE 
    PROCEDURE "userList" 
    AS
     
    TYPE user_type_list    --数组名
    is varray(100) OF   --长度
    "user"%rowtype;        --类型
       
    myUserList user_type_list := user_type_list(); --定义
     
    BEGIN
        myUserList.EXTEND; --分配存储空间,相当于C语言里面的malloc
        SELECT * into myUserList(1) from "user" WHERE "user"."id" = '1';
        DBMS_OUTPUT.PUT_LINE(myUserList(1)."id");
        DBMS_OUTPUT.PUT_LINE(myUserList(1)."name");
    END;
    【赋值】  
    (1)赋值
    变量名 := 值
    例如:
    
    
    (2)查询并赋值
    
    
    【控制语句】  
    (1)if语句
    CREATE OR REPLACE 
    PROCEDURE "userList" 
    AS
     
    myResult NUMBER(10,4); --变量
     
    BEGIN
        myResult := SQRT(58+25*3+(19-9)**2);--数值表达式
     
        IF myResult > 10 THEN --if语句
            DBMS_OUTPUT.PUT_LINE('结果大于10');
         
        ELSE IF myResult > 15 then -- else if语句
            DBMS_OUTPUT.PUT_LINE('结果大于15');
        END IF; --结束else if
     
        END IF; --结束if
    END;
    (2)case语句
    CREATE OR REPLACE 
    PROCEDURE "userList" 
    AS
     
    myCase VARCHAR2(10) := 'A'; --变量
     
    BEGIN
        CASE myCase
        WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('A');
        WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('B');
        ELSE DBMS_OUTPUT.PUT_LINE('什么也不匹配');
        END CASE;
    END;
    (3)循环语句
    CREATE OR REPLACE 
    PROCEDURE "userList" 
    AS
     
    myNumber number := 1; --变量
     
    BEGIN
        LOOP --循环开始的标志
            if myNumber < 5 THEN --逻辑部分
                DBMS_OUTPUT.PUT_LINE('myNumber的值为:'||myNumber);
                myNumber := myNumber+1;
            ELSE 
                EXIT ; --一定要有退出语句
            END IF;
        END LOOP; --结束循环
    END;

    CREATE OR REPLACE 
    PROCEDURE "userList" 
    AS
     
    myNumber number := 1; --变量
     
    BEGIN
        LOOP --循环开始的标志
            if myNumber < 5 THEN --逻辑部分
                DBMS_OUTPUT.PUT_LINE('myNumber的值为:'||myNumber);
                myNumber := myNumber+1;
            END IF; 
                EXIT WHEN myNumber >= 5; --eixt when 语句
        END LOOP; --结束循环
    END;

    或:

    CREATE OR REPLACE 
    PROCEDURE "userList" 
    AS
     
    myNumber number := 1; --变量
     
    BEGIN
        FOR inx IN 1..4 --for loop语句
        LOOP --循环开始的标志
            DBMS_OUTPUT.PUT_LINE('myNumber的值为:'||myNumber);
        myNumber := myNumber+1;
        END LOOP; --结束循环
    END;
    【异常】  
    异常处理
    
    
    注释
    单行: --
    多行:/*   */
    转义字符
    【常用函数】  
    数值表达式
    CREATE OR REPLACE 
    PROCEDURE "userList" 
    AS
     
    myResult NUMBER(10,4); --变量
     
    BEGIN
        myResult := SQRT(58+25*3+(19-9)**2);--数值表达式
        DBMS_OUTPUT.PUT_LINE(myResult);
    END;
    字符切割函数
    /**
    用pipe函数实现字符串分割
    **/
    CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);
    /
    CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)
    RETURN ty_str_split PIPELINED
    IS
        j INT := 0;
        i INT := 1;
        len INT := 0;
        len1 INT := 0;
        str VARCHAR2 (4000);
    BEGIN
        len := LENGTH (p_str);
        len1 := LENGTH (p_delimiter);
     
        WHILE j < len LOOP
           j := INSTR (p_str, p_delimiter, i);
     
           IF j = 0 THEN
               j := len;
              str := SUBSTR (p_str, i);
              PIPE ROW (str);
              IF i >= len THEN
                  EXIT;
              END IF;
           ELSE
              str := SUBSTR (p_str, i, j - i);
              i := j + len1;
              PIPE ROW (str);
           END IF;
        END LOOP;
     
        RETURN;
    END fn_split;
    转义字符
    cgar(47) 即代表 : /
    数组长度函数
    len := LENGTH (p_str);
    产生随机数
    substr(DBMS_RANDOM.VALUE(10,24),1,2)
    生成日期
    select to_char(sysdate,'yyyy-mm-dd-hh24-mi-ss') into mydate from dual;
    UUID
    select sys_guid() into myUser."id" from dual;
  • 相关阅读:
    pycharm 使用pip3更新插件已经更新时报错
    剑指Offer系列之题11~题15
    剑指Offer系列之题1~题5
    个人hexo博客(静态,无后台)搭建
    设计模式之单例模式
    Hibernate实现limit语句效果
    Springboot项目中 前端展示本地图片
    eclipse报错:problems during content assist
    python中open与with open的区别
    修改Jenkins目录
  • 原文地址:https://www.cnblogs.com/xiaoMzjm/p/3884878.html
Copyright © 2020-2023  润新知