时间:2021-07-01 10:21:17 帮助过:16人阅读
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;
通常在程序中,使用方法调用存储过程。
【存储函数】类似于 【存储过程】,唯一的区别是 【存储函数】必须有返回值,而【存储过程】没有返回值,但可以通过输出参数代替。
目前大家调用的都是【存储过程】,因为相对灵活。
oracle学习1 基于oracle数据库的PLSQL编程以及存储过程的创建和使用视频
标签:serve 打开 不能 变量赋值 声明 open int 接收 测试