1 Star 4 Fork 1

CodeStore / PLSQL

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

PL/SQL

面向过程编程语言

-- 语法
DECLARE
   -- 声明部分(变量的声明、游标的声明(cursor)、例外的声明(异常))
BEGIN
   -- 语句序列(DML语句)
EXCEPTION
   -- 例外处理语句
END;

声明部分简介

说明变量

DECLARE
   -- 说明变量:char、varchar2、date、number、boolean、long
   v_num number;
   -- 赋值
   v_char varchar2(24) := 'it is good';
BEGIN
   -- 赋值
   v_num := 10;
   -- 拼接结果
   dbms_output.put_line('hello, world' || '! v_num=' || v_num || ', v_char=' || v_char);
END;

引用变量

DECLARE
   -- 引用变量:v_name所对应的类型与emp表中ename字段的类型相同
   v_name emp.ename%type;
BEGIN
   -- 在SQL中使用 into 来赋值
   select ename into v_name from emp where empno=7369;
   -- 拼接结果
   dbms_output.put_line('名字为:' || v_name);
END;

记录型变量

DECLARE
   -- 记录型变量
   v_row emp%rowtype;
BEGIN
   SELECT * INTO v_row FROM emp WHERE empno = 7369;
   dbms_output.put_line('名字为:' || v_row.ename);
END;

if

语法

语法:
[1] IF 条件 THEN 
        code....;
    END IF;
[2] IF 条件 THEN
        code....;
    ELSE
        code....;
    END IF;
[3] IF 条件 THEN
        code....;
   ELSIF 条件 THEN
        code...
    ELSE
        code....;
    END IF;
例:
DECLARE
    v_date VARCHAR2(24);
BEGIN
    SELECT trim(to_char(SYSDATE, 'dy')) INTO v_date FROM dual;  -- 当天属于周几
    IF v_date IN ('sun', 'sat') THEN 
      dbms_output.put_line('在中国今天是周末哦!');
    ELSE
      dbms_output.put_line('在中国今天是工作日哦!');
    END IF;
END;

循环

语法

语法:
        [1] WHILE 条件 
          LOOP
            code...;
          END LOOP;
        [2] LOOP
              EXIT WHEN 条件
                   code....
              END LOOP;
        [3] FOR i IN 1...n
                LOOP
                  code...
                END LOOP;

例:

-- 输出1-10

-- 法一:
DECLARE
   v_tag NUMBER := 1;
BEGIN
   WHILE v_tag < 10
     LOOP
         dbms_output.put_line(v_tag);
         v_tag := v_tag + 1;
     END LOOP;
END;

-- 法二:
DECLARE
    v_tag NUMBER := 1;
BEGIN
    LOOP
      EXIT WHEN v_tag >= 10;
           dbms_output.put_line(v_tag);
           v_tag := v_tag + 1;
      END LOOP; 
END;

-- 法三:
DECLARE
      
BEGIN
      FOR i IN 1..10
        LOOP
          dbms_output.put_line(i);
        END LOOP;
END;

游标

概念

  • 在Java中有集合的概念,那么在plsql中也会有用到多条记录的情况,这时候我们就要用到游标。游标可以存储查询返回的多条数据。
  • 语法
-- 语法:
   CURSOR 游标名 [(paramName paramType, ....)] IS SELECT 语句...;
  • 取值步骤
  1. 打开游标 open cursor
  2. 开启循环 loop;
  3. 取值 fetch 游标名称 into 变量名
  4. 结束循环 end loop;
  5. 关闭游标 close 游标名称
    • 范例一(普通游标)
-- 使用游标方式输出员工编号和姓名
DECLARE
   pemp emp%ROWTYPE;
   -- 定义游标
   CURSOR pc IS SELECT * FROM emp;
BEGIN
   -- 打开游标
   OPEN pc;
   -- 取数据
   LOOP
      FETCH pc INTO pemp;
      EXIT WHEN pc%NOTFOUND;
      dbms_output.put_line(pemp.empno || '-' || pemp.ename);
   END LOOP;
END;
  • 范例二(系统引用游标)(推荐
--输出所有员工的名称与工资
DECLARE
    mycursor1 SYS_REFCURSOR;
    vrow emp%ROWTYPE;
BEGIN
    OPEN mycursor1 FOR SELECT * FROM emp;
        LOOP
        FETCH mycursor1 into vrow;
        EXIT WHEN mycursor1%NOTFOUND;--%notfound,游标中已经取到最后,没有数据了
            dbms_output.put_line(' 员工姓名:' || vrow.ename || ' 工资:' || vrow.sal);  
        END LOOP;
    CLOSE mycursor1;
END;

存储过程

在大学数据库中,一组为了完成特定功能的SQL语句集。经编译后储存在数据库中,用户通过指定的存储过程的名字给出参数来执行它。存储过程是数据库中一个重要的对象,任何一个设计良好的数据库程序都应该要使用到存储过程。

  • 创建存储过程的语法
-- 方式一:
CREATE OR REPLACE PROCEDURE 过程名(参数名 IN/OUT 数据类型) 
AS
   code...
BEGIN
   code...
END;

-- 方式二:
CREATE OR REPLACE PROCEDURE 过程名(参数名 IN/OUT 数据类型) 
IS
   code...
BEGIN
   code...
END 过程名;

例:

-- 方式一
CREATE OR REPLACE PROCEDURE pro_t1(tager IN NUMBER) AS
BEGIN 
   dbms_output.put_line(tager);
END;

CALL pro_t1(23);

-- 方式二
CREATE OR REPLACE PROCEDURE pro_allEmp
IS
   v_row emp%rowtype;
begin
   SELECT * INTO v_row FROM emp WHERE empno = 7369;
   dbms_output.put_line('名字为:' || v_row.ename);
END pro_allEmp; 

CALL pro_allEmp();

存储函数

触发器

空文件

简介

Oracle数据库中PLSQL面向过程语言 展开 收起
Java
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Java
1
https://gitee.com/tzj2015/PLSQL.git
git@gitee.com:tzj2015/PLSQL.git
tzj2015
PLSQL
PLSQL
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891