首页 > 数据库 >Oracle数据库学习笔记四——存储过程的值传递和引用传递

Oracle数据库学习笔记四——存储过程的值传递和引用传递

时间:2022-12-07 21:37:34浏览次数:46  
标签:sequence -- 数据库 value 传递 user sql Oracle id


编程语言中的4种子例程:
由两种行为定义,即形式值是否返回以及参数列表是值传递还是引用传递。
如果返回输出,子例程就是函数,如果不返回,就是过程。
所以4中子例程为:
1.值传递函数
2.引用传递函数
3.值传递过程
4.引用传递过程


pl/sql值传递过程由下列5条规则定义:
1.所有形参必须使用in模式定义为只写变量。(只能传入,不能传出)
2.所有形参必须是局部作用域的变量,不能再过程执行期间改变。(不能给in模式的参数赋值)
3.所有形参可使用任意有效的sql或pl/sql数据类型
4.所有形参可以有默认的初值
5.任何从sql查询到函数的系统引用游标类型的强制转换都是不可写的,因此必须通过in模式参数进行传递。

  这包括哪些作为显示游标变量传递的以及使用cursor函数的强制转换。



--值传递:调用时接受值的副本,不返回输出变量。 
--使用值传递过程跨单个事务作用域管理多个DML语句。

create or replace procedure add_user(
username varchar2,
age number,
address varchar2,
street_address varchar2
) is
v_id number;

--声明内部函数(内部pl/sql块) 从指定序列中获得下一个值,使用了本地动态sql
function get_sequence_value(sequence_name varchar2) return number is
pragma autonomous_transaction;
id_value number;
statement varchar2(2000);
begin
statement :='begin' ||chr(10)
||' select '||sequence_name||'.nextval'||chr(10)
||' into :id_value' ||chr(10)
||' from dual;' ||chr(10)
||'end;';
execute immediate statement using out id_value;
return id_value;
end get_sequence_value;
begin
savepoint add_user; --设置保存点

v_id :=get_sequence_value('SQ_USER');

insert into tb_user(userid,name,age) values(v_id,username,age);

if address is not null then
--向地址表中插入值
if street_address is not null then
--向街道表中插入值
end if;
end if;

exception
when others then
rollback to add_user; --回滚到保存点
raise_application_error(-20001,sqlerrm); --抛出异常
end add_user;


--引用传递过程


--被调用时接受值的副本,不返回输出变量,可改变实参的值。返回实参引用给调用程序单元。


pl/sql引用传递过程由下列5条规则定义:


1.必须至少有一个形参通过使用out或in out模式定义。


2.所有形参在过程操作中可更改的局部作用域变量。


3.所有形参可使用任意有效的sql或pl/sql数据类型。


4.所有in模式形参可以有默认的初值。


5.任何从sql查询到过程的系统引用游标类型的强制转换都是不可写的,因此必须通过in模式参数进行传递。


  (即作为参数的系统引用游标不能再写入数据,只能是in模式的参数)



--例:引用传递过程
function get_sequence_value(sequence_name varchar2) return number is
pragma autonomous_transaction;
id_value number;
statement varchar2(2000);
begin
statement :='begin' ||chr(10)
||' select '||sequence_name||'.nextval'||chr(10)
||' into :id_value' ||chr(10)
||' from dual;' ||chr(10)
||'end;';
execute immediate statement using out id_value;
return id_value;
end get_sequence_value;


create or replace procedure add_user(
username varchar2,
age number,
userid out number, --输出参数(引用传递)
) is
v_id number;
begin
savepoint add_user; --设置保存点

userid :=get_sequence_value('SQ_USER'); --为输出参数赋值

insert into tb_user(userid,name,age) values(userid,username,age);

exception
when others then
rollback to add_user; --回滚到保存点
raise_application_error(-20001,sqlerrm); --抛出异常
end add_user;




标签:sequence,--,数据库,value,传递,user,sql,Oracle,id
From: https://blog.51cto.com/u_15905482/5920099

相关文章

  • mysql数据库导入导出
    1源数据库导出数据 这一步将导出结构和数据到一个.sql文件中2导入到空数据库中将上一步导出的.sql文件传到要服务器某路径下,比如/data/sqldata/devself.sql然后在......
  • ChatGPT 加图数据库 NebulaGraph 预测 2022 世界杯冠军球队
    一次利用ChatGPT给出数据抓取代码,借助NebulaGraph图数据库与图算法预测体坛赛事的尝试。作者:古思为蹭ChatGPT热度最近因为世界杯正在进行,我受到这篇Cambridge......
  • 云数据库FinOps实战复盘
    历时三个多月的HBase成本优化项目按照预期交付了,HBase云数据库月度成本下降了32.5%,超出预期达成目标。我们对本次HBase成本优化项目进行深度复盘,并进一步尝试总结云数据库......
  • MongoDB数据库的基础特性
    MongoDB是全球领先的NoSQL数据库,是一个可扩展、开源、表结构自由,用C++语言编写且面向文档的高性能分布式数据库。 MongoDB在持续演进中,不断优化自己的特色功能,保证了数据......
  • Oracle误删除数据的恢复
    Oracle误删除数据的恢复在平时操作数据库时,难免会误删数据,或者表格,这时候不用慌张,按照如下步骤进行恢复:删除的操作有三种:DELETE和TRUNCATE只删除数据,DROP则删除整个表(......
  • oracle 中的 DB_NAME、DB_DOMAIN、DB_UNIQUE_NAME--转
    ......
  • 25万全国地形数据库说明(转)
    转自:https://www.cnblogs.com/xiexiaokui/archive/2006/11/18/564649.html总况1、数据库构成全国1:25万数据库,是国家基础地理信息系统三个全国性空间数据库之一。它由......
  • 针对数据库逻辑删除操作简单实现方案
    数据库逻辑删除定义逻辑删除是指在删除数据库的某条记录时,并不是真正的将该条记录删除,而是通过某个字段来标识其状态为“删除”,在接下来的查询等操作时,根据此字段来过滤......
  • Oracle备份方式
    数据库备份与恢复命令导出/导入(Export/Import);冷备份;热备份;rman数据备份与恢复命令导入导出imp/exp冷备份冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提......
  • 【mysql】误删除了自带的mysql数据库后该怎么恢复?
    前言如果mysql数据库系统自带的mysql数据库被误删了,应该如何恢复?其实操作方法比较简答,今天用实验的方式分享一下1、实验环境信息实验环境信息:mysql版本5.7......