zoukankan      html  css  js  c++  java
  • Oracle存储过程学习笔记

    SQL是一种语言!

    SQL是一种语言!

    SQL是一种语言!

    个人理解:存储过程就相当于Java中的方法;声明变量区域就相当于java中的声明局部变量一样,只是放到一个指定区域定义了

    一、先看一部分基础:

    1、语法:

    CREATE OR REPLACE PROCEDURE 存储过程名字
    (
      --声明参数(注意不需要写长度
    ,和java的定义新的方法时的参数一样)   参数1 IN NUMBER,   参数2 out NUMBER )IS   -- 声明变量区域,不需要声明变量可以不写   -- 变量声明,每个声明用分号结束。可以在声明的同时初始化   变量1 INTEGER :=0;   变量2 DATE; BEGIN   --业务逻辑执行区域 END 存储过程名字; 这里的IS也可以用AS替代!

    举个例子:

    create        -- 存储过程头部区域开始 
    or replace    --可选表示如果数据库中已经存在一条相同名称的存储过程就把它替换掉
    procedure
    proc_emp_create --存储过程名称 procedure_name
    (
      empno number, ename varchar2, job varchar2, mgr number, hiredate date, sal number, comm number, deptno number
    )
    as
      --声明区域,不需要声明变量可以不写
    begin -- PL/SQL标准执行语句
      --执行区域
       insert into emp values(empno, ename, job, mgr, hiredate, sal, comm, deptno);
    end;

    一个存储过程可以分成三个区域:

    头部区域
    用于编写最基本的存储过程头部标记,定义是否要创建一个替代原有存储过程的存储过程;决定是否定义参数;定义参数的类型(in out inout);定义执行权限(Schema)。
    
    声明区域
    用于声明变量(要定义长度)包括cursor;
    
    执行区域
    用于执行业务逻辑代码,可以使用条件语句(选择、判断、循环。。。)来进行一些业务逻辑CRUD的处理;

    2.SELECT INTO STATEMENT

    将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
    记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
    例子: 
    BEGIN
       SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
      xxxx;
    END;
    
    在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。
    可以在该语法之前,先利用select count(*) from 查看数据库中是否存在该记录,如果存在,再利用select...into...

    注意事项:

    1、在oracle中,数据表别名不能加as,如:
    select a.appname from appinfo a;-- 正确
    select a.appname from appinfo as a;-- 错误
    也许,是怕和oracle中的存储过程中的关键字as冲突的问题吧;
    
    2、oracle 的is 和as有什么区别?  
    在存储过程(PROCEDURE)和函数(FUNCTION)中没有区别;
    在视图(VIEW)中只能用AS不能用IS;
    在游标(CURSOR)中只能用IS不能用AS;

    二、再看一个例子来熟悉创建和调用(自己操作看结果)

    create table mytest(
        name varchar2(50),
        age number(10)
    );
    
    --循环往表中插入数据
    DECLARE
       X number; --声明变量
    BEGIN
       x := 1; --给初值
       FOR X IN REVERSE 1 .. 10 LOOP
         insert into mytest  values ('张三',10);
       END LOOP;
       COMMIT;
    END;
    
    --创建存储过程
    create or replace procedure AutoUpdateName(
      v_oldName in VARCHAR2,/*旧名称*/
      v_newName in VARCHAR2/*新名称*/
    )
     is
    begin
      
      UPDATE mytest SET name=REPLACE(name,v_oldName,v_newName) WHERE  name LIKE '%'||v_oldName||'%';

      COMMIT; end AutoUpdateName; --调用该存储过程 begin   AutoUpdateName('张三','李四');   commit; end;

    结果会看到,调用该存储过程后将表中的数据张三全部替换成为了李四;

    end;

  • 相关阅读:
    mac重启nginx时报nginx.pid不存在的解决办法
    js 正则表达式
    js 闭包
    js yarn
    js npm
    vue3 vite
    node 错误处理
    node fs
    linux包管理工具使用和区别(转)
    MySQL数据库学习----理论基础
  • 原文地址:https://www.cnblogs.com/xh_Blog/p/9947863.html
Copyright © 2011-2022 走看看