加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

Oracle 存储过程—为数传递变量

发布时间:2020-12-31 20:06:28 所属栏目:站长百科 来源:网络整理
导读:oracle 存储过程的基本语法 create or replace procedure proc1( p_para1 varchar2, p_para2 out varchar2, p_para3 in out varchar2 )as v_name varchar2(20); begin v_name := ‘张三丰‘; p_para3 := v_name; dbms_output.put_line(‘p_para3:‘||p_para3
副标题[/!--empirenews.page--]

oracle 存储过程的基本语法
create or replace procedure proc1(
p_para1 varchar2,
p_para2 out varchar2,
p_para3 in out varchar2
)as
v_name varchar2(20);
begin
v_name := ‘张三丰‘;
p_para3 := v_name;
dbms_output.put_line(‘p_para3:‘||p_para3);
end;
注:创建语句:create or replace procedure 存储过程名,如果没有or replace语句,则仅仅是新建一个存储过程。如果系统存在该存储过程,则会报错。Create or replace procedure 如果系统中没有此存储过程就新建一个,如果系统中有此存储过程则把原来删除掉,重新创建一个存储过程。?
存储过程名定义:包括存储过程名和参数列表。参数名和参数类型。参数名不能重复, 参数传递方式:IN,OUT,IN OUT?
IN 表示输入参数,按值传递方式。?
OUT 表示输出参数,可以理解为按引用传递方式。可以作为存储过程的输出结果,供外部调用者使用。?
IN OUT 即可作输入参数,也可作输出参数。?
参数的数据类型只需要指明类型名即可,不需要指定宽度。?
参数的宽度由外部调用者决定。?
过程可以有参数,也可以没有参数?
变量声明块:紧跟着的as (is )关键字,可以理解为pl/sql的declare关键字,用于声明变量。?
变量声明块用于声明该存储过程需要用到的变量,它的作用域为该存储过程。另外这里声明的变量必须指定宽度。遵循PL/SQL的变量声明规范。?
过程语句块:从 begin 关键字开始为过程的语句块。存储过程的具体逻辑在这里来实现。?
异常处理块:关键字为exception ,为处理语句产生的异常。该部分为可选?
结束块:由end关键字结果。

示例:

create or replace procedure sp_name (
-- 入参、出参列表, 逗号分隔。
uid in varchar2,-- 不能带长度信息
startDate in date,-- 第二个输入参数
defaultVar in varchar2 default "",-- 默认参数,如果不传,要注意参数的顺序
isok out number,-- 输出参数
result out varchar2 -- 第二个输出参数
)
as
-- 变量声明,每个声明用分号结束,可以在声明的同时初始化
var1 varchar2(11);
var2 number(2) := 123;

begin
-- 字符串拼接用 ||
dbms_output.put_line(‘isok:‘ || ‘abc‘);

-- 调用其他存储过程
sub_sp_name(param1,prarm2,outParam1,outParam2);

end; -- 存储过程结束
---------------------

--1. 语句块的定义

declare
  -- 变量声明
  var1 number(2); -- 仅声明
  var2 char(2) := ‘var2‘; -- 在声明的同时初始化

begin
  -- 语句
end; -- 语句块结束

--2. if语句

?

if a = 1 or b = 2 then
  
elsif c = 3 then

else
  
end if;

?

?

?

?

?

--3.? case分支控制语句

这里的dbms_output.put_line() 是输出的方法,在dos里需要在这之前输入set serveroutput on;才会输出相应的信息

?

declare
num number(10) := 11;
begin
    case 
        when num = 10 then dbms_output.put_line( ‘我是10‘);
        when num = 11 then dbms_output.put_line( ‘我是11‘);
        else  dbms_output.put_line( ‘我不知道我是谁了‘);
    end case;
    
    case num
        when 0 then dbms_output.put_line( ‘我是10‘);
        when 1 then dbms_output.put_line( ‘我是11‘);
        else  dbms_output.put_line( ‘我不知道我是谁了‘);
    end case;
end;

?

?

?

?

?

--4. for 循环?
--for循环主要有两个用处。

--4.1、 循环一个范围
  declare
    i number(2);
  begin
    for i in 0 .. 9 loop
      dbms_output.put_line(‘i:‘ || i);
    end loop;
  end;

-- 4.2、遍历隐式游标

 --隐式游标的好处是不需要手动关闭,方便

BEGIN
 FOR re IN (SELECT username FROM userinfo)  LOOP
  DBMS_OUTPUT.PUT_LINE(re.username);
 END LOOP;
END;


二、下面是存储过程的使用:

我这里创建了一个表userinfo,

-- Create table创建表
create table userinfo
(
  id       varchar2(32) not null,username varchar2(20),password varchar2(20),sex      varchar2(2),sal number(20),insertdate date default sysdate
)
;
-- Add comments to the columns 
comment on column userinfo.id
  is ‘id‘;
comment on column userinfo.username
  is ‘用户名‘;
comment on column userinfo.password
  is ‘密码‘;
comment on column userinfo.sex
  is ‘性别‘;
  comment on column userinfo.sal
  is ‘工资‘;
  comment on column userinfo.insertdate
  is ‘插入时间‘;

?

2.1创建插入数据的存储过程并调用

?

CREATE OR REPLACE
--创建存储过程,如果存在就更新,不存在就创建,插入一条数据
procedure proc_test(e_id       in varchar,e_username in varchar,e_password in varchar,e_sex      in varchar,e_sal      in number)
--这里的参数不要限定长度,否则会错误
 is
begin
  insert into userinfo
    (id,username,password,sex,sal)
  values
    (e_id,e_username,e_password,e_sex,e_sal);
end;

  --调用1
DECLARE
  id       varchar(32);
  username varchar(20);
  password varchar(20);
  sex      varchar(2);
  sal      number(20);
BEGIN
  id       := ‘asdfasdfa‘;
  username := ‘text11‘;
  password := ‘pas‘;
  sex      := ‘男‘;
  sal      := 2000;
  proc_test(e_id       => id,e_username => username,e_password => password,e_sex      => sex,e_sal =>sal);
  commit;
END;

select * from userinfo;--查看数据插入成功

?

?

?

?

?

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读