Oracle备忘录(十二)--存储过程,数据字典,触发器,jdbc调用存储过程

计算机考研考博经典考题汇总(一次刷新世界观-我相信VIP总是有原因的) 操作系统 操作系统的特点? – 共享:资源可被多个并发执行的进程使用 – 并发:可以在同一时间间隔处理多个进程,需要硬件支持 – 虚拟:将物理实体映射成为多个虚拟设备 – 异步:进程执行走走停停,每次进程执行速度可能不同,但OS需保证进程每次执行结果相同 进程的三个组成部分? 程序段、数据段、PCB(Process Control Block) 并发与并行区别? 并发:同一间隔 并行:同一时刻 进程切换的过程? 保持处理机上下文 -> 更新PCB -> 把PCB移入相应队列(就绪、阻塞) -&g 阅读详情
------***********----数据字典----********-------------
--表分两种:
--用户表:包含商业数据,用户自己维护
--数据字典:管理员维护(用户只能查,不能改)

--数据字典命名规则:
--USER  用户自己的
--ALL   用户可以访问到的
--DBA   管理员视图(管理员用户才能看到)
--V$    性能相关的设置(数据)


select * from dictionary;


--创建一个注释:
comment on table emp is '这是员工信息表';
--查看注释
select *from user_tab_comments where table_name='emp';


select * from session_privs; --查看用户有的权限





-------**********-----触发器-----***********---------
/*
成功插入员工后,自动输出“成功插入一个新员工”
   CREATE  [or REPLACE] TRIGGER  触发器名
   {BEFORE | AFTER}
   {DELETE | INSERT | UPDATE [OF 列名]}
   ON  表名
   PLSQL 块

*/
create or replace trigger sayNewEmp
after insert
on emp
begin
  dbms_output.put_line('成功插入一个新员工');
end;
/


/*
--实施复杂的安全性检查

--禁止在非工作时间 往emp表中插入数据
--   CREATE  [or REPLACE] TRIGGER  触发器名
--   {BEFORE | AFTER}
--   {DELETE | INSERT | UPDATE [OF 列名]}
--   ON  表名
--   PLSQL 块

--周末:to_char(sysdate,'day') in ('星期六','星期日')
--上班前 下班后: to_number(to_char(sysdate,'hh24')) not between 9 and 18
*/
create or replace trigger securityEmp
before insert
on emp
begin
  if to_char(sysdate,'day') in ('星期六','星期日') or 
      to_number(to_char(sysdate,'hh24')) not between 9 and 18 then 
      
    raise_application_error(-20001,'不能在非工作时间插入数据');

  end if;
end;
/


/*
--数据确认

--涨后的薪水不能少于涨前的薪水
--   CREATE  [or REPLACE] TRIGGER  触发器名
--   {BEFORE | AFTER}
--   {DELETE | INSERT | UPDATE [OF 列名]}
--   ON  表名
--   [FOR EACH ROW [WHEN(条件) ] ]
--   PLSQL 块(begin  ...  end; )
*/
create or replace trigger checksal
before update
on emp
--在一次操作表的语句中,每操作成功一行就会触发一次;
--不写的话,表示是表级触发器,则无论操作多少行,都只触发一次
for each row
begin
    --if 涨后的薪水< 涨前的薪水 then 
    if :new.sal < :old.sal then   
      raise_application_error(-20002,'涨后的薪水不能少于涨前的薪水.涨前:'||:old.sal||'  涨后:'||:new.sal);
    end if;
end;
/


--:NEW 和:OLD使用方法和意义:
--new 只出现在insert和update时,
--old只出现在update和delete时。
--在insert时new表示新插入的行数据,update时new表示要替换的新数据。
--old表示要被更改的原来的数据行,delete时old表示要被删除的数据。 



------**********-------存储过程---------************------
--1.存储过程可以使得程序执行效率更高、安全性更好,
--  因为过程建立之后 已经编译并且储存到数据库,
--  直接写sql就需要先分析再执行因此过程效率更高,
--  直接写sql语句会带来安全性问题,如:sql注入 


--2.建立过程不会很耗系统资源,因为过程只是在调用才执行。
--3.存储过程可以用于降低网络流量,存储过程代码直接存储于数据库中,
--  所以不会产生大量T-sql语句的代码流量。
--4.使用存储过程使您能够增强对执行计划的重复使用

/*
create [or replace] PROCEDURE 过程名(参数列表)  
AS 
        PLSQL子程序体;

打印Hello World

调用存储过程
1. exec sayHelloWorld();
2. begin
      sayHelloWorld();
      sayHelloWorld();
   end;
   /
*/

create or replace procedure sayHelloWorld
as
  --说明部分
begin
  dbms_output.put_line('Hello World');
end;
/

/*
create [or replace] PROCEDURE 过程名(参数列表)  
AS 
        PLSQL子程序体;

--为指定的员工涨100块钱  并打印涨前和涨后的薪水
*/
create or replace procedure raiseSalary(eno in number)
as
  psal emp.sal%type;
begin
  --涨前薪水
  select sal into psal from emp where empno=eno;
  
  --涨100
  update emp set sal=sal+100 where empno=eno;
  
  --要不要commit???
  dbms_output.put_line('涨前:'||psal||'   涨后:'||(psal+100));
end;
/


-----------------带out参数的调用-------------------
create or replace
procedure p1(pno in number,pname out varchar2)
as
begin
select ename into pname from emp where empno=pno;
dbms_output.put_line(pname||'              '||pno);


end;
/


方法一:
set serveroutput on
var a varchar2(20);
exec P1(7566,:a);


 
方法二:
set serveroutput on
declare
pname varchar2(20);
begin
p1(&pno,pname);
end;
/


------------------------
/*
--用java程序调用
create [or replace] PROCEDURE 过程名(参数列表)  
AS 
        PLSQL子程序体;
--查询并返回某个员工的姓名 月薪和职位
*/
create or replace procedure queryEmpInfo(eno in number,
                                         pename out varchar2,
                                         psal   out number,
                                         pjob   out varchar2)
as
begin
  select ename,sal,empjob into pename,psal,pjob from emp where empno=eno;
end;
/


------************存储函数-------------**********---
--oracle中的Function有两种:
--一种是系统内置的函数(直接拿来用就行)。
--一种是自定义的(自己写的完成特定功能的)。
--function可以在DML语句中执行。
--如select upper('AaBbCcDd') '大写' from dual 
--其中upper就是系统自带的函数,是把参数中的字符串变成大写字符。

/**
CREATE [OR REPLACE] FUNCTION 函数名(参数列表) 
 RETURN  函数值类型
AS
PLSQL子程序体;

--查询某个员工的年收入

*/
create or replace function queryEmpIncome(eno in number)
return number
as
  psal emp.sal%type;
  pcomm emp.comm%type;
begin
  select sal,comm into psal,pcomm from emp where empno=eno;
  return psal*12+nvl(pcomm,0);
end;
/


调用一:select   函数名  from  dual;


------------******package*****--------------
解决的问题:返回值是一个集合

查询某个部门中 所有员工的所有信息

包头
CREATE OR REPLACE PACKAGE MYPACKAGE AS 

  type empcursor is ref cursor;
  procedure queryEmpList(dno in number,empList out empcursor);

END MYPACKAGE;


包体
CREATE OR REPLACE PACKAGE BODY MYPACKAGE AS

  procedure queryEmpList(dno in number,empList out empcursor) AS
  BEGIN
   
    open empList for select * from emp where deptno=dno;
   
  END queryEmpList;

END MYPACKAGE;


package demo.test;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;
import org.junit.Test;
import demo.utils.JDBCUtils;

public class TestOracle {
/*
 * create or replace procedure queryEmpInfo(eno in number,
                                         pename out varchar2,
                                         psal   out number,
                                         pjob   out varchar2)
 */
	@Test
	public void testProcedure(){
		//{call <procedure-name>[(<arg1>,<arg2>, ...)]}
		String sql = "{call queryEmpInfo(?,?,?,?)}";
		
		Connection conn = null;
		CallableStatement call = null;
		try {
			conn = JDBCUtils.getConnection();
			call = conn.prepareCall(sql);
			
			//对于in参数,赋值
			call.setInt(1, 7839);
			
			//对于out参数,申明
			call.registerOutParameter(2, OracleTypes.VARCHAR);
			call.registerOutParameter(3, OracleTypes.NUMBER);
			call.registerOutParameter(4, OracleTypes.VARCHAR);
			
			//执行
			call.execute();
			
			//取出结果
			String name = call.getString(2);
			double sal = call.getDouble(3);
			String job = call.getString(4);
			
			System.out.println(name);
			System.out.println(sal);
			System.out.println(job);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			JDBCUtils.release(conn, call, null);
		}
	}

/*
 * create or replace function queryEmpIncome(eno in number)
return number
 */
	@Test
	public void testFunction(){
		// {?= call <procedure-name>[(<arg1>,<arg2>, ...)]}
		String sql = "{?=call queryEmpIncome(?)}";
		
		Connection conn = null;
		CallableStatement call = null;
		try {
			conn = JDBCUtils.getConnection();
			call = conn.prepareCall(sql);

			//对于out参数,申明
			call.registerOutParameter(1, OracleTypes.NUMBER);			
			
			//对于in参数,赋值
			call.setInt(2, 7839);
			
			//执行
			call.execute();
			
			//取出结果
			double income = call.getDouble(1);
			System.out.println(income);
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			JDBCUtils.release(conn, call, null);
		}
	}	


	@Test
	public void testCursor(){
		String sql = "{call MYPACKAGE.queryEmpList(?,?)}";
		
		Connection conn = null;
		CallableStatement call = null;
		ResultSet rs = null;
		try {
			conn = JDBCUtils.getConnection();
			call = conn.prepareCall(sql);
			
			//对于in参数,赋值
			call.setInt(1, 20);
			
			//对于out参数,申明
			call.registerOutParameter(2, OracleTypes.CURSOR);
			
			//执行
			call.execute();
			
			//取出结果
			rs = ((OracleCallableStatement)call).getCursor(2);
			while(rs.next()){
				String name = rs.getString("ename");
				double sal = rs.getDouble("sal");
				
				System.out.println(name+"的薪水是"+sal);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			JDBCUtils.release(conn, call, rs);
		}
	}
}



FT601Q芯片深度解析:从USB3.0引脚定义到FPGA FIFO协议实战选型 本文深入解析FT601Q芯片在USB3.0接口设计与FPGA协议栈开发中的应用,详细介绍了USB3.0引脚定义、FT601Q芯片架构、245同步FIFO模式及硬件设计要点,帮助工程师实现高速数据传输系统。 阅读详情

相关推荐

傅里叶变换实战:用Python手把手教你分析音频频谱(附完整代码)

本文详细介绍了如何使用Python实现傅里叶变换进行音频频谱分析,涵盖音频加载、预处理、FFT应用、频谱可视化及特征提取等关键步骤。通过实战案例和完整代码,帮助开发者掌握数字信号处理技术,特别适合音频分析和音乐信息检索领域的应用。

weixin_29090677的博客 150

使用Oracle数据字典视图分析程序包、函数、存储过程

        Oracle数据库提供了一组视图 - 统称为数据字典,能够使用SQL 和 PL / SQL语言获取对PL/SQL代码的疑问。 数据字典基础         数据字典由数据库实例创建的众多表和视图组成。用户模式通常对这些表没有特权; Oracle数据库仅授予视图的SELECT访问权限。         大多数数据字典视图有三个版本:         USER视图:有关您所连接...

为何生存 1367

自绘CListCtrl时发现ON_WM_MEASUREITEM_REFLECT和DrawItem(LPDRAWITEMSTRUCT lpMeasureItemStruct) 无响应

自绘CListCtrl时发现ON_WM_MEASUREITEM_REFLECT和DrawItem(LPDRAWITEMSTRUCT lpMeasureItemStruct) 无响应 一般情况下,我们都是在 dialog 里面 放一个 list 控件,然后 用自己的类绑定自己的自绘对象,如同下面: 1.  在 dialog 里面 加一个 list 列表 2. 然后 绑定这个列表 哈哈...

mfreesky的专栏 2170

oracle查询存储过程依赖的表,查看存储过程依赖的表

DECLARE @procname NVARCHAR(100) = 'dbo.test_tbl'SELECT DISTINCT @procname procname,SCHEMA_NAME(t.[schema_id]) + '.' + OBJECT_NAME(referenced_major_id)AS tblname,referenced_major_idFROM sys.sql_...

weixin_32027779的博客 1497

免费升级哨兵2号分辨率!用SRCNN深度学习模型实现10米→2.5米超分重建

本文详细介绍了如何利用SRCNN深度学习模型,将哨兵2号遥感影像的分辨率从10米免费提升至2.5米。文章提供了从数据准备、模型训练到部署应用的全流程实战指南,旨在通过AI应用技术,为农业监测、城市规划等领域提供更高精度的影像数据支持。

coffee的博客 523

系统回溯信息:遇到严重错误。已将回溯写入...PTC... raceback.log请将其发送给|技术支持|。

一、问题分析 这种问题一旦遇上了,如果忘了保存,直接心态爆炸。 该问题一般是显卡驱动的问题。ProE/Creo对显卡的基本要求是:支持Open_GL的3D显卡,分辨率为1024×768像素以上,推荐使用64位独立显卡,显存512MB以上。如若显卡性能太低,打开软件后易自动退出。 二、解决方法 <1>有一个非常简单的方法是:在config.pro文件中,改变图形配置graphics为” win32_gdi”而不是默认的“...

幕光倾城的博客 2万+

mysql 备忘录

文章目录DDLDML DDL 建库:create database test_db charset utf8mb4; 建表:create table t( id bigint unsigned primary key auto_increment, a varchar(10),index(a)); DML 新增:insert into t values (null,'a'),(null,'b'); show create table t\G 执行计划:explain select a from

AntHub的博客 842

【突变检验方法一】MATLAB实现Pettitt突变检验

MATLAB实现Pettitt突变检验及贝叶斯突变检测等

WW、forever的博客 1万+

数据字典

  什么叫数据字典? 数据字典指的是描述数据的数据。 举个例子: 1、我们在数据库里面创建了一个表 这个表位于哪个数据文件 这个表有哪些列 这个表的每一个列的数据类型 这个表的约束 等等 这些信息都是描述这个表的,这些信息也存放在一些表中,这些表就是数据字典,数据字典中的数据描述的是整个数据库的各种各样的信息。 数据库要能够访问,数据字典必须能够被访问。 数据字典 1、数...

weixin_34148456的博客 681

宇树G1机器人遥控器音频控制实战

本文介绍了宇树G1人形机器人遥控器控制音频播放的核心实现方案。通过DDS消息订阅获取遥控器输入,采用非阻塞的subprocess调用aplay命令控制外接音响设备。系统支持播放、暂停和重播功能,采用50ms轮询间隔实现实时响应。关键点包括遥控器初始化、音频进程管理(Popen)、退出机制。文章还提供了设备配置指南、遥控器按键说明和常见问题解决方案。该方案从复杂音频播放器中提炼出核心控制逻辑,可作为机器人交互开发的参考模板。

m0_47999117的博客 542

【YOLOv11】070、YOLOv11异常检测:正常数据训练下的异常目标识别

本文探讨了如何利用YOLOv11模型进行工业异常检测,重点介绍了仅使用正常样本训练模型的创新方法。文章首先通过产线误报案例引出异常检测的核心问题,阐述了YOLOv11作为特征提取器的改造思路,包括正常数据训练、特征空间构建和异常度量等关键步骤。实战部分提供了精简代码示例,强调数据增强控制、特征层选择和自编码器应用等技巧。作者还总结了容易出错的细节,如特征选择、阈值设定和计算效率优化等,并给出实用建议:从简单方法入手、重视可视化、确保数据质量、部署时设置复核机制等。最后指出该方法虽能减少对异常样本的依赖,但需

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 235

Oracle中常用的三种数据字典表

1.user_tables    表的字典表,查看命令: desc user_tables; select * from user_tables; 2.user_views   视图的字典表,查看命令: desc user——views; select * from user_tables; 3.user_constrants   约束条件字典表,查看命令: desc user

fengdl123的博客 1930

基于DNN神经网络的多输入多输出数据回归预测(附带Matlab代码)

假设我们的输入数据包含n个特征,输出数据包含m个特征。在本文中,我们将介绍如何使用DNN(深度神经网络)实现多输入多输出数据回归预测,并提供相应的Matlab代码。需要注意的是,上述代码中的DNN模型是一个简化的示例,您可以根据实际任务的复杂程度和要求进行相应的调整和优化。综上所述,我们介绍了如何使用DNN神经网络实现多输入多输出数据回归预测,并提供了相应的Matlab代码。函数对DNN模型进行训练,其中输入数据需要转置,以适应网络的输入要求。最后,我们使用训练好的模型对测试数据进行预测,并打印预测结果。

DevWizard的博客 1067

java八股文极速版

时间和空间的权衡 值越高空间开销小但是增加了查找开销服务于从Key映射到index的Hash算法,在性能和内存的使用上取平衡,实现一个尽量均匀分布的Hash函数,选取16,是通过位运算的方法进行求取的。线程安全:当多线程执行同一段程序的时候,如果发生了和预期结果不一致的情况,就是线程不安全的,如果和预期结果一致就是线程安全的,可以加锁解决(把并行运行的线程变成串行化执行)。1.加锁 利用Synchronized或者ReenTrantLock来对不安全对象进行加锁。

PassionAnytime的博客 382

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

从数据字典中查询存储过程, 函数, 包

--查询存储过程 --select * from user_source order by name; clear; select * from user_source where name = 'ADD_USER_INFORMATION'; --查询函数: --var sname = upper('get_sal'); --select * from user_source where name = 'GET_SAL'; select * from user_source where

叮当小马的专栏 2239

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Oralce数据库之存储过程、存储函数、触发器和数据字典

Oracle数据库总结 Oracle数据库之集合运算 Oracle数据库之数据处理 Oracle数据库之建表和管理表 Oracle数据库之对象视图、索引、序列、同义词 一、存储过程和存储函数 1、概念 存储在数据库中供所有用户程序调用的子程序,称为存储过程或者存储函数 2、存储过程语法 create [or replace] procedure 过程名(参数列表) as ...

好好学java 437

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Oracle 体系结构(37)—— Oracle 的数据字典之(十一):使用数据字典查看存储过程信息

Oracle 体系结构(37)—— Oracle 的数据字典之(十一):使用数据字典查看存储过程信息 一、使用 USER_PROCEDURES 查看当前用户的存储过程信息 1、数据字典的结构 SQL> DESC USER_PROCEDURES; Name Null? Type ----------------------------------------------------------------------------------- OBJECT_NAME

睿思达DBA 1288

备忘录系统——数据库篇

Person In Your Note 数据库(MySQL) MySQL是关系型数据库,Redis是非关系型数库 MySQL主要用于存放持久化数据,将数据存储在硬盘当中,读取速度比较慢 Redis是缓存数据库,将数据存储在缓存当中,读取速度较快,能够大大提高运行效率,但是保存时间有限 为了将你备忘录内容长期保存到本地当中,所以采用MySQL 数据库设计 创建一个数据库 create datab...

qq_41595735的博客 1131

COMSOL仿真表面等离子体激元(SPP)的完整指南

表面等离子体激元(SPP)是纳米光子学中的重要现象,由电磁波与金属表面自由电子耦合形成。这种特殊电磁模式在生物传感和超材料领域具有独特应用价值。通过多物理场仿真软件如COMSOL,可以精确模拟SPP的激发与传播特性。仿真过程涉及电磁场计算、材料建模和边界条件设置等关键技术,其中散射曲线分析是验证SPP特性的核心方法。最新COMSOL 6.4版本针对纳米尺度电磁耦合问题进行了专项优化,显著提升了SPP仿真的精度和效率。掌握这些仿真技术对开发新型光子器件和传感器具有重要意义。

weixin_33981932的博客 498

struts2+Hibernate 读取oracle blob 字段中的图片

之前存入数据库中的图片都是图片的链接,今天直接向数据库中存入图片,遇到很多问题:查阅了很多资料,看过的一篇资料是这样映射文,这样处理图片字段:private byte[] image; &lt;property name="image" type="oracle.sql.BLOB"&gt;              &lt;column name="IMAGE" /&gt;  &lt;/prope...

nano-dhh 1333

Oracle备忘录(十)--序列,索引

--视图 -- 虚表 (逻辑上存在) --主要目的是为了简化数据的查询,可以将复杂查询的结果放入到 --视图当中,方便日后查询。 --可以对视图进行增删改(很多约束条件),但是不建议这么做 SQL&gt; create view empview 2 as 3 select e.empno,e.ename,e.sal,e.sal*12 annlsal,d.dname 4 from...

nano-dhh 902

Oracle备忘录(十一)--游标,异常,PL/SQL

PL/SQL 是面向对象的语言 是操作数据库最快的语言 操作数据库(增删改查) 写成pl/sql,提高性能 而不是写在jdbc中 光标(游标)--&gt;相当于是ResultSet show parameters cursor --查看带有cursor字样的参数 -------**********------pl/sql输入------*************-------- --判...

nano-dhh 874

oracle备忘录(四)--分组函数

组函数类型 avg count max min sun 组函数都会自动滤空 group by 子句 在select 列表中所有 未包含在组函数 中的列都必须包含在 group by 字句中 select a,b,c,组函数(d) from *** group by a,b,c select 后面的字段必须要在group by后面 反过来不成立。 having 和 where...

nano-dhh 838

Oracle备忘录(六)--集合运算和子查询

SQL&gt;---------******---集合运算----------******------- SQL&gt; /* SQL&gt; 查询部门号是10和20的员工信息 SQL&gt; 1. select * from emp where deptno in (10,20); SQL&gt; 2. select * from emp where deptno=10 or deptno=20...

nano-dhh 724

oracle备忘录(二)--基础知识基本语法

------********-----where条件----******---- SQL&gt; --字符大小写敏感 SQL&gt; select * 2 from emp 3 where ename = 'KING'; SQL&gt; --日期格式敏感: 查询入职日期为17-11月-81的员工 SQL&gt; select * 2 from emp 3 where hi...

nano-dhh 723

oracle备忘录(三)--函数

SQL&gt; --字符函数 SQL&gt; select lower('Hello WORLd') 转小写,upper('Hello WORLd') 转大写, 2 initcap('hello world') 首字母大写 3 from dual; 转小写 转大写 首字母大写 ...

nano-dhh 719
上一篇: Oracle备忘录(十一)--游标,异常,PL/SQL
下一篇: jquery从数据库中获取数据装换成json数据实现三级联动
wive
博客等级 码龄14年 33粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值