学习大数据DAY15 PLSQL基础语法4

目录

动态SQL

execute immediate语句

带参数使用

作业

动态游标

动态游标类型声明

动态游标使用

强类型游标

作业2

遗忘点复习


动态SQL

plsql里面只能执行 select insert update delete ,想执行create怎么办?其他复杂功能?

使用动态sql,不能加分号,单引号实现转义功能''''

在Oracle数据库开发PL/SQL块中我们使用的SQL分为:静态SQL语句和动态SQL语句。所谓静态SQL指在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。而动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作。编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句。Oracle中动态SQL可以通过本地动态SQL来执行,也可以通过DBMS_SQL包来执行。本地动态SQL是使用EXECUTE IMMEDIATE语句来实现的。 

execute immediate语句

execute immediate sql语句(字符串,也可以是字符串变量) [into(只有在执行查询时使用)变量,...] [using 参数,...];

--不能执行语句,原有能执行的语句也可以放在里面

declare

v_sql varchar2(1000);

begin

v_sql :=

'create table stest(sno varchar(20),sdate date)';

dbms_output.put_line(v_sql);

execute immediate v_sql;

end;

--增删改查也可以使用动态sql,查询需要使用into

declare

v_sql varchar2(200);

v emp%rowtype;

begin

v_sql := 'select * from emp where empno=7369';

execute immediate v_sql into v;

dbms_output.put_line(v.empno||v.ename);

end;

--带输入且判断的复杂动态sql

declare

v_sql varchar2(200);

v emp%rowtype;

eno varchar(4):='&请输入编号';

begin

v_sql := 'select * from emp ';

if eno is not null then

v_sql:=v_sql||' where empno='||eno;

else

v_sql:=v_sql||' where rownum=1';

end if;

execute immediate v_sql into v;

dbms_output.put_line(v.empno||v.ename);

end;

--输入课程编号,如果不输入则显示所有数据第一条,如果输入显示当前课程的第一条

select * from sc where cno='c002' and rownum=1

select * from sc where rownum=1

declare

dsql varchar2(1000);

sc1 sc%rowtype;

cnoin varchar2(10):='&请输入课程编号';

begin

dsql:='select * from sc where ';

if cnoin is null then

dsql:=dsql||'rownum=1';

else

dsql:=dsql||'cno='''||cnoin||''' and rownum=1';

end if;

dbms_output.put_line(dsql);

execute immediate dsql into sc1;

dbms_output.put_line(sc1.sno||' '||sc1.cno||' '||sc1.score);

end;

带参数使用

declare

-- 声名一个变量保存sql语句

v_sql varchar2(255);

-- 声名一个rowtype类型变量保存一条员工信息

v emp%rowtype;

-- 声名一个变量接收从键盘输入的员工编号

v_empno emp.empno%type:='&empno';

begin

v_sql:='select * from emp where empno=:1';

dbms_output.put_line(v_sql);

execute immediate v_sql into v using v_empno;

-- execute immediate v_sql into v using v_empno;

-- 打印变量v的值

dbms_output.put_line(v.empno||v.ename);

execute immediate v_sql into v using 7839;

-- execute immediate v_sql into v using v_empno;

-- 打印变量v的值

dbms_output.put_line(v.empno||v.ename);

end;

作业

/*1、使用动态sql实现输入员工编号查询员工信息,如果不输入则显示所有员工的第一条,显示员工姓名和工资*/declaredsql varchar2(1000):='select ename,sal from emp where empno=';dsqldefault varchar2(1000):='select ename,sal from emp where rownum=1';v_empno varchar2(10):='&输入员工编号';type names is record(ename emp.ename%type,sal emp.sal%type);v names;beginif v_empno is not null thenexecute immediate concat(dsql,v_empno) into v;elseexecute immediate dsqldefault into v;end if;dbms_output.put_line(v.ename||'  '||v.sal);  end;/*2、搜索一个员工信息,输入工资和工作岗位,如果输入为空则显示不带条件的第一条;如果不为空则显示带条件的第一条,显示员工姓名和工资提示:1000为测试的输入工资,SALESMAN为测试的输入工作岗位select * from emp where sal>1000 and job = 'SALESMAN' and rownum=1select * from emp where sal>1000 and rownum=1select * from emp where job = 'SALESMAN' and rownum=1select * from emp where rownum=1*/declaredsql varchar2(2000);type names is record(ename emp.ename%type,sal emp.sal%type);v names;v_sal varchar2(10):='&输入工资';v_job varchar2(20):='&输入工作岗位';beginif v_sal is  not null and v_job is  not null thendsql:='select ename,sal from emp where sal=''||v_sal||''and job='||v_job;elsif v_sal is not  null and v_job is null thendsql:='select ename,sal from emp where sal='||v_sal;elsif v_sal is null and v_job is not null thendsql:='select ename,sal from emp where job='||v_job;else dsql:='select ename,sal from emp where rownum=1';end if;execute immediate dsql into v;dbms_output.put_line(v.ename||'   '||v.sal); end;

  

动态游标

在程序运行过程中,把一个游标变量在不同时刻关联不同的查询语句,也就是使用一个游标变量可以获取多个不同的结果集。通过把动态游标作为参数传递给另一个过程或函数使用,通过这种方式达到共享结果集的目的,把一个游标的内容(结果集)赋值给另外一个游标变量。

动态游标声明步骤:

●声明动态游标类型

●声明动态游标名称

动态游标类型声明

弱类型动态游标系统自带了一个直接使用即可: sys_refcursor

强类型动态游标只能配合静态sql语句使用,无法和动态sql配合使用。

弱类型动态游标能够执行动态sql 以及配合绑定变量。

示例:

refcur_emp sys_refcursor;

动态游标使用

使用 open 打开动态游标并给其绑定结果集

open 动态游标名 for sql语句;

动态游标无法使用for循环打开。 

--没有返回类型的弱类型,一般用sys_refcursor,可以省略步骤,为了返回类型铺垫

declare

cursor cur1 is select * from emp where empno=7499;

emp1 emp%rowtype;

emp2 emp%rowtype;

n1 number(4):=5;

type newcur is ref cursor;--弱类型游标类型

cur2 newcur;--游标变量

begin

open cur2 for select * from emp where empno=7499;

fetch cur2 into emp2;

dbms_output.put_line(emp2.ename);

close cur2;

dbms_output.put_line(n1);

n1:=6;

dbms_output.put_line(n1);

open cur1;

fetch cur1 into emp1;

dbms_output.put_line(emp1.ename);

close cur1;

end;

--弱类型动态游标

declare

emp2 emp%rowtype;

cur2 sys_refcursor;--游标变量

begin

open cur2 for select * from emp where empno=7499;

fetch cur2 into emp2;

dbms_output.put_line(emp2.ename);

close cur2;

end;

--动态游标可以随时换查询结果集

declare

emp2 emp%rowtype;

cur2 sys_refcursor;--游标变量

dept2 dept%rowtype;

begin

open cur2 for select * from emp where empno=7499;

fetch cur2 into emp2;

dbms_output.put_line(emp2.ename);

close cur2;

open cur2 for select * from dept where deptno=20;

fetch cur2 into dept2;

dbms_output.put_line(dept2.dname);

close cur2;

end;

--while循环

declare

emp2 emp%rowtype;

cur2 sys_refcursor;--游标变量

begin

open cur2 for select * from emp;

fetch cur2 into emp2;

while cur2%found

loop

dbms_output.put_line(emp2.ename);

fetch cur2 into emp2;

end loop;

close cur2;

end;

--动态sql弱类型动态游标,输入部门编号,不输入代表所有

declare

dsql varchar2(1000);

dno varchar2(10):='&请输入部门编号';

ename1 varchar2(10);

job1 varchar2(10);

cur1 sys_refcursor;

begin

dsql:='select ename,job from emp ';

if dno is not null then

dsql:=dsql||'where deptno='||dno;

end if;

dbms_output.put_line(dsql);

open cur1 for dsql;

fetch cur1 into ename1,job1;

while cur1%found

loop

dbms_output.put_line(ename1||job1);

fetch cur1 into ename1,job1;

end loop;

close cur1;

end; 

--二重循环动态游标显示

declare

cur1 sys_refcursor;

cur2 sys_refcursor;

dept1 dept%rowtype;

emp1 emp%rowtype;

begin

open cur1 for select * from dept;

fetch cur1 into dept1;

while cur1%found

loop

dbms_output.put_line(dept1.deptno||dept1.dname);

open cur2 for select * from emp where deptno=dept1.deptno;

fetch cur2 into emp1;

while cur2%found

loop

dbms_output.put_line(' '||emp1.deptno||emp1.ename);

fetch cur2 into emp1;

end loop;

close cur2;

fetch cur1 into dept1;

end loop;

close cur1;

end;

强类型游标

declare

type names is record(

ename varchar2(10),

dname varchar2(10)

);

zs names;

type curtype is ref cursor return names;

cur1 curtype;

begin

open cur1 for select dname,ename from emp inner join dept on emp.deptno=dept.deptno;

fetch cur1 into zs;

while cur1%found

loop

dbms_output.put_line(zs.name1||zs.name2);

fetch cur1 into zs;

end loop;

close cur1;

end;

作业2

--1、弱类型动态游标,显示所有员工名称,工作declarerlx sys_refcursor;type names is record(ename emp.ename%type,job emp.job%type);ej names;beginopen rlx for select ename,job from emp;fetch rlx into ej;while rlx%foundloopdbms_output.put_line(ej.ename||'  '||ej.job);fetch rlx into ej;end loop;close rlx;end;/*2、根据输入的部门编号显示员工编号,工作,若没有输入部门编号则显示所有,使用动态sql+弱类型动态游标实现*/declaredsql varchar2(2000);rlx sys_refcursor;v_deptno varchar2(3):='&输入部门编号显示员工编号和工作';type names is record(empno emp.empno%type,job emp.job%type); v_ej names;beginif v_deptno is null thendsql:='select empno,job from emp';open rlx for dsql;fetch rlx into v_ej;while rlx%foundloopdbms_output.put_line(v_ej.empno||'   '||v_ej.job);fetch rlx into v_ej;end loop;close rlx;else dsql:='select empno,job from emp where deptno='||v_deptno;open rlx for dsql;fetch rlx into v_ej;while rlx%foundloopdbms_output.put_line(v_ej.empno||'   '||v_ej.job);fetch rlx into v_ej;end loop;close rlx;end if;end;/*3、根据输入显示学员姓名、课程编号及课程成绩,输入学号不输入课程号直接显示学员姓名和所有课程编号和成绩,输入学号和课程号显示对应课程成绩,使用动态sql+弱类型动态游标实现*/declaretype names is record(cno sc.cno%type,score sc.score%type);sc2 names;v_name student.sname%type;v_score sc.score%type;dsql varchar2(2000);rlx sys_refcursor;v_sno sc.sno%type:='&输入学号';v_cno sc.cno%type:='&输入课程号';beginif v_sno is not null and v_cno is null thenselect sname into v_name from student where sno=v_sno;dsql:='select cno,score from sc where sno='''||v_sno||'''';dbms_output.put_line(v_name);open rlx for dsql;fetch rlx into sc2;while rlx%foundloopdbms_output.put_line(sc2.cno||'    '||sc2.score);fetch rlx into sc2;end loop;close rlx; elsif v_sno is not null and v_cno is not null thenselect score into v_score from sc where sno=v_sno and cno=v_cno;dbms_output.put_line(v_score); end if; end;--4、通过teacher表显示各个课程信息,二重循环弱类型游标,同上机练习7.2的效果图declarerlx sys_refcursor;rlx2 sys_refcursor;v_teacher teacher%rowtype;v_course course%rowtype;beginopen rlx for select * from teacher;fetch rlx into v_teacher;while rlx%foundloopdbms_output.put_line(v_teacher.tno||'---'||v_teacher.tname);fetch rlx into v_teacher;open rlx2 for select * from course where tno=v_teacher.tno;fetch rlx2 into v_course;while rlx2%foundloopdbms_output.put_line('     '||v_course.cno||'-----'||v_course.cname||'-----'||v_course.tno); fetch rlx2 into v_course;end loop;close rlx2;end loop;close rlx;end;--5、使用强类型游标显示教师姓名及所教课程名称declaretype names is record(tname teacher.tname%type,cname course.cname%type);t names;type cur is ref cursor return names;A cur;beginopen A for select tname,cnamefrom teacher left join course on teacher.tno=course.tno;fetch A into t;while A%foundloopdbms_output.put_line(t.tname||'-----'||t.cname); fetch A into t;end loop;close A;end;

遗忘点复习

number类型不能为空。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/45618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot中@Async注解的使用及原理 + 常见问题及解决方案

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

Xcode Playgrounds:探索Swift编程的交互式乐园

Xcode Playgrounds:探索Swift编程的交互式乐园 Xcode是苹果公司为macOS开发的集成开发环境(IDE),它提供了一套完整的工具集,用于开发macOS、iOS、watchOS和tvOS应用。在Xcode中,Playgrounds是一个革命性的…

简述linux通知链机制

notifier chain概述 Linux内核中各个子系统相互依赖,当其中某个子系统状态发生改变时,有时需要使用一定的机制告知使用其服务的其他子系统,以便其他子系统采取相应的措施。为满足这样的需求,内核实现了事件通知链机制&#xff08…

IPython:提升Python编程效率的实用技巧与案例

引言 IPython,作为Python的一个交互式计算环境,极大地提升了编程、数据分析和科学计算的效率。它不仅提供了增强的交互式Shell,还集成了丰富的工具和功能,如魔术命令、自动补全、内嵌图形显示等。本文将整理一系列IPython的使用技…

VMWare 下给Centos扩容

目录 参考文档背景介绍扩容查看当前文件磁盘信息增加一个存储分区创建物理卷把物理卷添加到卷组查看卷组名把物理卷并入卷组 对文件系统进行扩容搞定 参考文档 1、百度经验 2、CSDN 3、掘金 背景介绍 测试环境用VMWare 安装centos7,几年下来磁盘空间不够用了&…

【前端项目笔记】10 项目优化上线

项目优化上线 目标:优化Vue项目部署Vue项目(上线提供使用) 项目优化 项目优化策略: 生成打包报告:根据生成的报告发现问题并解决第三方库启用CDN:提高首屏页面的加载效率Element-UI组件按需加载路由懒加…

数据结构4.0——串的定义和基本操作

串的定义(逻辑结构) 串,即字符串(String)是由零个或多个字符组成的有序数列。 一般记为Sa1a2....an(n>0) 其中,S是串名,单引号括起来的字符序列是串的值;ai可以是字母、数字或其他字符;串中字符的个数n称为串的长度。n0时的…

unity 2020版本packManager没有AssetBundles

1.Packages->manifest.json打开manifest.json文件 2.添加"com.unity.assetbundlebrowser": "1.7.0", 保存即可

以数据编织,重构数据管理新范式

大数据产业创新服务媒体 ——聚焦数据 改变商业 人工智能几乎统一了全球最顶尖科技公司的认知:这个时代,除了AI,没有第二条路可走。 人工智能的技术逻辑颇有一种“暴力美学”,它依托于海量大数据和超高算力的训练和推理&#xff…

医疗健康信息的安全挑战与隐私保护最佳实践

医疗健康信息的安全挑战 医疗健康信息的安全挑战主要包括数据规模庞大、管理困难、数据类型多样导致的安全风险高、以及法律法规与伦理约束带来的挑战。随着医疗信息化的发展,医疗健康数据呈现出爆炸式的增长,医院信息系统、电子病历、健康管理等产生了海…

Spring Boot与MyBatis完美集成指南

Spring Boot与MyBatis完美集成指南 在当今软件开发领域,Spring Boot和MyBatis作为两大流行框架,分别以其简洁高效和灵活易用的特点,在快速构建和数据库交互方面展现了显著优势。本文将深入探讨Spring Boot与MyBatis的基本概念、特点、优势&a…

Xcode依赖管理大师:精通项目依赖的艺术与实践

Xcode依赖管理大师:精通项目依赖的艺术与实践 在现代软件开发中,项目依赖管理是确保项目顺利进行的关键环节。Xcode,作为苹果官方的集成开发环境(IDE),提供了一套强大的工具来管理项目依赖。本文将深入探讨…

SpringBoot新手快速入门系列教程十一:基于Docker Compose部署一个最简单分布式服务项目

我的教程都是亲自测试可行才发布的,如果有任何问题欢迎留言或者来群里我每天都会解答。 如果您还对于Docker或者Docker Compose不甚了解,可以劳烦移步到我之前的教程: SpringBoot新手快速入门系列教程九:基于docker容器&#xff…

218.贪心算法:分发糖果(力扣)

核心思想 初始化每个学生的糖果数为1: 确保每个学生至少有一颗糖果。从左到右遍历: 如果当前学生的评分高于前一个学生,则当前学生的糖果数应比前一个学生多一颗。从右到左遍历: 如果当前学生的评分高于后一个学生,则…

Hadoop3:HDFS-通过配置黑白名单对集群进行扩缩容,并实现数据均衡(实用)

一、集群情况介绍 我的本地虚拟机,一共有三个节点,hadoop102、hadoop103、hadoop104 二、白名单 创建白名单文件whitelist,通过白名单的配置,只允许集群包含102和103两台机器可以存储数据,104无法存储数据。 需求 …

react学习——29react之useState使用

useState 是 React Hooks 中的一个重要函数,它用于在函数组件中添加状态。在类组件中,我们通常使用 this.state 和 this.setState 来管理组件的状态,而在函数组件中,我们可以使用 useState 来达到同样的目的。 1、导入 useState&…

C语言 判断素数

写一个判素数的函数,在主函数输入一个整数,输出是否为素数的信息。 #include <stdio.h> #include <stdbool.h>// 判断是否为素数 bool is_prime(int num) {if (num < 1) return false;for (int i 2; i < num / 2; i) {if (num % i 0) return false;}retur…

修改留言板

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>备忘录</title><!-- <link rel"…

Netty Websocket SpringBoot Starter

netty websocket starter Quick Start Demo 项目 添加依赖 <!--添加源--> <repository><id>github</id><url>https://maven.pkg.github.com</url><snapshots><enabled>true</enabled></snapshots> </reposit…

SchedulerLock分布式定时任务锁

1.pom中引入依赖&#xff0c;这里使用redis作为锁 <dependency><groupId>net.javacrumbs.shedlock</groupId><artifactId>shedlock-spring</artifactId><version>4.12.0</version></dependency><dependency><groupId…