zoukankan      html  css  js  c++  java
  • oracle学习1 基于oracle数据库的PLSQL编程以及存储过程的创建和使用视频

    https://www.bilibili.com/video/av46777605

    plsql中选择testWindow中可以进行测试

    1、编写函数在plsql的testwindow中

      begin
        dbms_output.put_line('hello,world');
      end;

      运行后可以在DBMS_output标签页中看到

      如果在sqlplus中运行的话,需要输入一个  /  来表示输入完了,但因为sqlplus默认是不打开显示的,需要输入 set serveroutput on

    2、变量赋值

    -- Created on 2019/11/14 by LENOVO
    declare
    --姓名
    V_NAME VARCHAR2(20);
    --薪水
    V_SAL NUMBER;
    --地址
    V_ADDR VARCHAR2(200);
    begin
    --直接赋值
    V_NAME:='ADAM';
    V_SAL:=1590;
    --语句赋值
    select 'hello' into v_addr from dual;
    --打印输出
    DBMS_OUTPUT.PUT_LINE('姓名:'||v_name||',薪水:'||v_sal);
    end;

    3、两个变量该怎么写,另外声明的对象类型是什么样,去【表名】【字段名】【%TYPE】来定义

    declare
    --姓名
    V_NAME PERSON.NAME%TYPE;
    --分数
    V_HEIGHT PERSON.HEIGHT%TYPE;
    begin
    SELECT NAME,HEIGHT INTO V_NAME,V_HEIGHT FROM PERSON WHERE AGE=20;
    DBMS_OUTPUT.PUT_LINE('姓名:'||V_NAME||',身高:'||V_HEIGHT);

    end;

    4、记录型变量

    接受表中的一整行记录,相当于Java中的一个对象,注意,只能接收一条记录

    语法:变量名称   表名%ROWTYPE 如V_PERSON PERSON%ROWTYPE;

    declare
    --一行记录
    V_PERSON PERSON%ROWTYPE;
    begin
    SELECT * INTO V_PERSON FROM PERSON WHERE AGE=20;
    DBMS_OUTPUT.PUT_LINE('姓名:'||V_PERSON.NAME);
    end;

    5、流程控制

    注意关键字ELSIF   中间少了个E

    ---判断person表中的记录数是否超过5条
    declare
    v_count NUMBER;
    begin
    SELECT COUNT(1) INTO v_count from person;
    if (v_count < 5) then
    DBMS_OUTPUT.PUT_LINE('小于5,共:' || v_count);
    Elsif (v_count < 10) then
    DBMS_OUTPUT.PUT_LINE('大于5 小于10,共:' || v_count);
    Else
    DBMS_OUTPUT.PUT_LINE('大于15,共:' || v_count);
    end if;
    end;

     6、循环

    ---判断person表中的记录数是否超过5条
    declare
    ---声明循环变量
    V_NUM NUMBER:=1;
    BEGIN
    --循环开始
    LOOP
    --退出条件
    EXIT WHEN V_NUM>10;
    DBMS_OUTPUT.PUT_LINE(V_NUM);
    --自增条件
    V_NUM:=V_NUM+1;
    --循环结束
    end LOOP;
    end;

    7、游标

     

    ---使用游标查询person中所有的的姓名和身高,并将其打印出来
    declare
    ---声明游标
    CURSOR C_PERSON is
    select NAME, AGE from PERSON;
    --声明变量接收游标中的数据
    v_NAME PERSON.NAME%TYPE;
    v_AGE PERSON.AGE%TYPE;
    BEGIN
    --打开游标
    OPEN C_PERSON;
    LOOP
    --获取游标中的数据
    FETCH C_PERSON INTO V_NAME, V_AGE;
    --如果没有指向的语句了,就退出
    EXIT WHEN C_PERSON%NOTFOUND;
    --打印输出
    DBMS_OUTPUT.put_line(V_NAME || '--' || V_AGE);
    END LOOP;
    --关闭游标
    CLOSE C_PERSON;
    end;

    8、带参数的游标

    ---使用游标查询person中【身高】为【1.68】的姓名和身高,并将其打印出来
    DECLARE
    ---声明游标
    CURSOR C_PERSON(V_HEIGHT person.height%type) is
    select NAME, AGE from PERSON where height = V_height;
    --声明变量接收游标中的数据
    v_NAME PERSON.NAME%TYPE;
    v_AGE PERSON.AGE%TYPE;
    BEGIN
    --打开游标
    OPEN C_PERSON(1.68);
    LOOP
    --获取游标中的数据
    FETCH C_PERSON
    INTO V_NAME, V_AGE;
    --如果没有指向的语句了,就退出
    EXIT WHEN C_PERSON%NOTFOUND;
    --打印输出
    DBMS_OUTPUT.put_line(V_NAME || '--' || V_AGE);
    END LOOP;
    --关闭游标
    CLOSE C_PERSON;
    END;

    9、存储过程

    以上是在TestWindow中执行的,可以进行调试

    如果写的是procedure,就不能调试了

    exec p_hello   用这个来在sqlplus调用存储过程。

    is as 是可以互相替换的。

    存储过程中没有declare关键字,decalre用在语句块中。

    10、带输入参数的存储过程

    create or replace procedure p_queryNameAgeHeight(v_name in person.name%type) as
    v_age person.age%type;
    v_height person.height%type;
    begin
    select age,height into v_age,v_height from person where person.name=v_name;
    dbms_output.put_line(v_name||'--'||v_age||'--'||v_height);
    end p_queryNameAgeHeight;

    执行

     exec p_querynameageheight('may');

    11、带输出参数的存储过程

    重新写一个带输出参数的存储过程

    通过testWindow写代码调用之

     存储过程和testWindow中的输出都显示在这里了。

    create or replace procedure p_queryNameAgeHeight(v_name in person.name%type,
    v_height in out person.height%type) as
    v_age person.age%type;

    begin
    select age, height
    into v_age, v_height
    from person
    where person.name = v_name;
    dbms_output.put_line(v_name || '--' || v_age || '--' || v_height);
    end p_queryNameAgeHeight;

    -- Created on 2019/11/14 by LENOVO
    declare
    v_height person.height%type;
    begin
    -- Test statements here
    p_querynameageheight('may',v_height);
    dbms_output.put_line(v_height);
    end;

    通常在程序中,使用方法调用存储过程。

    【存储函数】类似于 【存储过程】,唯一的区别是 【存储函数】必须有返回值,而【存储过程】没有返回值,但可以通过输出参数代替。

    目前大家调用的都是【存储过程】,因为相对灵活。

  • 相关阅读:
    打造绿色JRE
    AOSP(Android Open Source Project) Android开源项目
    SyncML协议简述
    诺基亚 索爱 低端手机及智能手机 与 QQ邮箱或MyTT 通讯录同步 介绍
    Android 的源代码结构
    recovery v1跟recovery v2的区别
    Android系统架构
    haoGOD6.6 修改自XDA的thedroidsector的kingkernel #8 04/22
    下一代Android或官方支持“App2sd”
    Android 中的微型云
  • 原文地址:https://www.cnblogs.com/adamgq/p/11858991.html
Copyright © 2011-2022 走看看