Oracle 存储过程—为数传递变量
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;--查看数据插入成功
---调用2
begin
proc_test(e_id => 'dd', e_username => 'A',e_password => 'aa', e_sex => 'd',e_sal => 1000);
commit;
end;
--调用3
call proc_test(e_id => 'dd', e_username => 'A',e_password => 'aa', e_sex => 'd',e_sal => 1000);
commit;
java中的调用:
public static void insert() throws ClassNotFoundException, SQLException {
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String name = "user2";
String pwd = "user2";
String Drivername = "oracle.jdbc.driver.OracleDriver";
Class.forName(Drivername);
Connection connection = DriverManager.getConnection(url, name, pwd);
CallableStatement call = connection
.prepareCall("call PROc_TEST(e_id => 'dd', e_username => 'A',e_password => 'aa', e_sex => 'd',e_sal => 1000)");
// 执行存储过程
boolean b = call.execute();
if (b = true) {
System.out.println("插入成功!");
}
connection.close();
}
--2. 创建带返回参数的
--in是输入入的参数,out是输出的参数
CREATE OR REPLACE procedure proc_test1(t in varchar,
r out varchar) as
begin select count(*) into r from userinfo where username like t;
end;
--调用,
--在dos里执行多行语句是以'/'表示结束
DECLARE outobj VARCHAR2(4);
BEGIN
proc_test1(t => 'A',r => outobj );
dbms_output.put_line('outobj = ' || outobj);
END;
java中的调用:
public static void one() throws ClassNotFoundException, SQLException {
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String name = "user2";
String pwd = "user2";
String Drivername = "oracle.jdbc.driver.OracleDriver";
Class.forName(Drivername);
Connection conn = DriverManager.getConnection(url, name, pwd);
CallableStatement proc = conn
.prepareCall("{ call PROC_TEST1(?,?) }"); // 存储过程
proc.setString(1, "%A%");// 设置第一个参数输入参数
proc.registerOutParameter(2, Types.VARCHAR);// 第二个参数输出参数,是VARCHAR类型的
proc.execute();// 执行
String testPrint = proc.getString(2);// 获得输出参数
System.out.println("=用户名包含A的个数为=" + testPrint);
conn.close();
}
--3.创建带查询结果的
--3. 由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分, --3.1, 建一个程序包。如下:
create or replace package testpackage as
type test_cursor is ref cursor;
end; --3.2,建立存储过程,存储过程为:
create or replace procedure testc(p_cursor out testpackage.test_cursor) is
begin
open p_cursor for
select * from userinfo;
end;
java中的调用:
public static void select() throws ClassNotFoundException, SQLException {
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String name = "user2";
String pwd = "user2";
String Drivername = "oracle.jdbc.driver.OracleDriver";
Class.forName(Drivername);
Connection conn = DriverManager.getConnection(url, name, pwd);
CallableStatement proc = conn.prepareCall(" call testc(?) "); // 存储过程
proc.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);// 设置输出参数是一个游标.第一个参数,游标类型
proc.execute();// 执行
ResultSet rs = (ResultSet) proc.getObject(1); // 获得第一个参数是一个游标,转化成ResultSet类型
while (rs.next()) // 获得数据
{
System.out.println("id:" + rs.getString("id") + "\tusername:"
+ rs.getString("username") + "\tinsertdate:"
+ rs.getString("insertdate"));
}
}
4.创建可以调用其他存储过程的存储过程
-------------------------- 3.实例
create or replace procedure sp_name(defaultVar in varchar2 default 'A') -- 默认参数,如果不传,要注意参数的顺序
as
-- 变量声明,每个声明用分号结束。可以在声明的同时初始化
robj varchar2(4);
var2 number(20) := 123; begin
-- 字符串拼接用 ||
dbms_output.put_line('isok:' || 'abc'); -- 调用其他存储过程
proc_test1(T => 'A', R => robj);
dbms_output.put_line('R = ' || R); end; -- 存储过程结束 --调用 begin
sp_name('A'); end;
Oracle 存储过程—为数传递变量的更多相关文章
- oracle存储过程、声明变量、for循环|转|
oracle存储过程.声明变量.for循环 1.创建存储过程 create or replace procedure test(var_name_1 in type,var_name_2 out ty ...
- oracle存储过程、声明变量、for循环(转)
oracle存储过程.声明变量.for循环 1.创建存储过程 create or replace procedure test(var_name_1 in type,var_name_2 out ty ...
- [转]oracle存储过程、声明变量、for循环
oracle存储过程.声明变量.for循环 1.创建存储过程 create or replace procedure test(var_name_1 in type,var_name_2 out ty ...
- oracle存储过程、声明变量、for循环
oracle存储过程.声明变量.for循环 1.创建存储过程 create or replace procedure test(var_name_1 in type,var_name_2 out t ...
- java 实现往oracle存储过程中传递array数组类型的参数
注:本文来源于 < java 实现往oracle存储过程中传递array数组类型的参数 >最近项目中遇到通过往存储过程传递数组参数的问题, 浪费了N多个小时,终于有点头绪. 具体的代码 ...
- HIbernate Oracle存储过程
之前为了实现基于Hibernate+Oracle的存储过程调用,发现了一个又一个坑,然后一个一个的尝试解决. 需求:使用Hibernate调用Oracle的存储过程,需要支持的有动态表名.存储过程变量 ...
- oracle 存储过程 变量的声明和赋值的3种方式
oracle 存储过程 变量的声明和赋值的3种方式 CreationTime--2018年8月31日16点00分 Author:Marydon 1.声明变量的3种方式 按照数据类型的声明方式进行区 ...
- [转]Oracle存储过程给变量赋值的方法
原文地址:http://blog.csdn.net/drbing/article/details/51821262 截止到目前我发现有三种方法可以在存储过程中给变量进行赋值:1.直接法 := ...
- Oracle存储过程给变量赋值的方法
截止到目前我发现有三种方法可以在存储过程中给变量进行赋值: 1.直接法 := 如:v_flag := 0; 2.select into 如:假设变量名为v_flag,select count( ...
随机推荐
- python接口自动化1-requests-html支持JavaScript渲染页面
前言 requests虽好,但有个遗憾,它无法加载JavaScript,当访问一个url地址的时候,不能像selenium一样渲染整个html页面出来.requests-html终于可以支持JavaS ...
- Python使用jieba分词
# -*- coding: utf-8 -*- # Spyder (python 3.7) import pandas as pd import jieba import jieba.analyse ...
- Spring Cloud 之 全局配置
在微服务架构中,全局配置的重要性不言而喻.SpringCloud的全局配置存储主要基于 Git 来实现,即配置信息存储在Git服务器,以统一的方式对外提供访问.在使用上分为 ConfigServer和 ...
- mniGraffle常用快捷键
OmniGraffle 是 Mac 上的绘图利器.Graffle 在很多方面对标 Windows 系统上的 Microsoft Visio,是制作各种文档的绝妙工具. 变换移动 放大:Cmd+Shif ...
- ES6 解构赋值详解
解构赋值是对赋值运算符的扩展,可以将属性/值从对象/数组中取出,赋值给其他变量. 一.数组的解构赋值 1.基本用法 只要等号两边的模式相同,左边的变量就会被赋予对应的值. let [a, [[b], ...
- WebService操作
webservice是一种服务器通信技术,封装了socket.
- Laravel $request 常用方法
request的方法 描述 input('key','default-value') 此方法可以获取get请求所带来的特定参数的值,如果没有该参数可以提供默认值 all() 此方法获取get请求的所有 ...
- bzoj 4240: 有趣的家庭菜园 树状数组+贪心
有一个小性质:就是一个下标排列的最小移动次数就是逆序对数. 我们发现最终形态一定是一个波峰. 那么我们求的就是形成波峰的下标最少逆序对数. 考虑将元素从小到大依次插入. 那么,对于第 $i$ 个元素, ...
- surprise库官方文档分析(三):搭建自己的预测算法
1.基础 创建自己的预测算法非常简单:算法只不过是一个派生自AlgoBase具有estimate 方法的类.这是该方法调用的predict()方法.它接受内部用户ID,内部项ID,并返回估计评级r f ...
- 10月清北学堂培训 Day 7
今天是黄致焕老师的讲授~ 历年真题选讲 NOIP 2012 开车旅行 小 A 和小 B 决定外出旅行,他们将想去的城市从 1 到 n 编号,且编号较小的城市在编号较大的城市的西边.记城市 i 的海拔高 ...