关于PLSQL中的一些问题总结:在PLSQL中书写DDL等
关于问题前导,使用的数据表中涉及到的字段和类型:

在PLSQL中create、drop、truncate等DDL是没有办法直接执行的。
必须要使用:
Execute immediate ‘DDL语句’
但是我发现这样并不能执行!后面查阅发现,oracle中执行DDL语句需要使用变量的形式:
即 所谓的动态SQL语句
首先在declare中声明变量( 例如:sql varchar2(200):= ‘create table tmp(name varchar2(20), age number(3))’ ),再在begin和end之间 execute immediate才可以!
DML
关于DML insert、delete、update是可以直接执行的,而且通过SQL对象会返回受到影响的行数。
但是这里需要注意的是:如果你是在同一个PLSQL中创建了表,同时想在这个PLSQL中insert数据的话,就必须要小心了!!!
也要使用:executeimmediate的方式来执行:注意,最好也是通过变量的形式执行:
直接把语句通过 executeimmediate引在后面当然可以,但是这样的话,数据就必须得写死

而且有varchar和varchar2类型的时候,就很麻烦了:
引号就会冲突;
通过变量声明的方式


就更显得灵活了!
因为execute这种形式,是加载进来的时候,就会做判断的,最开始insert的话,如果检测到表不存在!就会报错!
所以为了保证和create统一加载,忽略oracle的报错(我的理解这个和java反射类似,弱引用一样),就要统一为execute immediate
DQL
但是关于select的话,不能单独执行,除非后面有into语句,才有执行意义,才不会报错!
最后需求的是查出这样的一个表结构:

以下代码纯属PLSQL、存储过程练手:
1.创建一个传入系名进行查询平均成绩的存储过程
create or replace procedure in_dname_out_avg_grade(
i_dname in dep.dname%type,
o_agrade out number
)
as
begin
select avg(grade) agrade into o_agrade
from
(
select course.cname, dep.dname, sc.grade
from course
inner join sc on course.cno = sc.cno
inner join student on sc.sno = student.sno
inner join dep on dep.dno = student.dno
where course.cname = '大学物理' and dep.dname = i_dname
);
end;
2.创建一个传入系名查询不及格人数的存储过程
create or replace procedure in_dname_out_grade_low(
i_dname in dep.dname%type,
o_num out number
)
as
begin
select count(student.sno) into o_num
from course
inner join sc on course.cno = sc.cno
inner join student on sc.sno = student.sno
inner join dep on dep.dno = student.dno
where course.cname = '大学物理' and dep.dname = i_dname and sc.grade < 60;
end;
3.创建一个传入系名查询 60-85分人数的存储过程
create or replace procedure in_dname_out_grade_mid(
i_dname in dep.dname%type,
o_num out number
)
as
begin
select count(student.sno) into o_num
from course
inner join sc on course.cno = sc.cno
inner join student on sc.sno = student.sno
inner join dep on dep.dno = student.dno
where course.cname = '大学物理' and dep.dname = i_dname and sc.grade >=60 and sc.grade < 85;
end;
4.创建一个传入系名查询 85分以上人数的存储过程
create or replace procedure in_dname_out_grade_hig(
i_dname in dep.dname%type,
o_num out number
)
as
begin
select count(student.sno) into o_num
from course
inner join sc on course.cno = sc.cno
inner join student on sc.sno = student.sno
inner join dep on dep.dno = student.dno
where course.cname = '大学物理' and dep.dname = i_dname and sc.grade >=85;
end;
补充注意:
存储过程不能有declare声明!!!
如果要声明变量的话直接,如下:
create or replace procedure createTable_procedure
as
-- declare 存储过程不能有声明!!
v_DDL varchar2(200) :=
'create table tmp(
t_cname varchar2(20),
t_dname varchar2(20),
grade_low number,
grade_mid number,
grade_hig number,
grade_avg number
)';
begin
execute immediate v_DDL;
end;
最后得出结果表的PLSQL,注意要用到上面的存储过程:
declare
cursor dname_cursor is
select distinct dep.dname
from student
inner join sc on student.sno = sc.sno
inner join dep on dep.dno = student.dno
where sc.cno = (
select course.cno
from course
where course.cname = '大学物理'
);
type dnameContain is table of dep.dname%type
index by binary_integer;
contain dnameContain;
m_cname course.cname%type := '大学物理';
m_dname dep.dname%type;
m_low number;
m_mid number;
m_hig number;
m_avg number(3);
i number := 0;
v_DDL varchar2(200) :=
'create table tmp(
t_cname varchar2(20),
t_dname varchar2(20),
grade_low number,
grade_mid number,
grade_hig number,
grade_avg number
)';
v_DML varchar2(100) :=
'insert into tmp values(:1, :2, :3, :4, :5, :6)';
begin
execute immediate ' drop table tmp';
exception when others then
null;
-- 为什么在一个PL/SQL中不能创建表后面就用
-- dbms_utility.exec_ddl_statement(v_DDL);
execute immediate v_DDL;
-- commit;
open dname_cursor;
loop
fetch dname_cursor into contain(i);
if i>0 then
-- dbms_output.put_line(contain(i-1));
m_dname := contain(i-1);
dbms_output.put_line(m_dname);
in_dname_out_grade_low(m_dname, m_low);
in_dname_out_grade_mid(m_dname, m_mid);
in_dname_out_grade_hig(m_dname, m_hig);
in_dname_out_avg_grade(m_dname, m_avg);
dbms_output.put_line(m_mid||', '||m_hig||', '||m_avg);
-- insert into tmp values(m_cname, m_dname, m_low, m_mid, m_hig, m_avg);
execute immediate v_DML using m_cname, m_dname, m_low, m_mid, m_hig, m_avg;
end if;
i := i+1;
exit when dname_cursor%notfound;
end loop;
close dname_cursor;
commit;
end;
注意:commit在PLSQL中可以直接写的!!!
关于PLSQL中的一些问题总结:在PLSQL中书写DDL等的更多相关文章
- excel中的数据粘贴不全到plsql中,excel 粘贴后空白,Excel复制粘贴内容不全
http://zhidao.baidu.com/link?url=pHZQvfWJzI-lQjl4uP86q4GLcpYHu4o-fdjiYegJS0Cy5HEq5oz0YrUye3iHjmv5CJ3 ...
- plsql oracle client没有正确安装(plsql连接远程数据库)
plsql oracle client没有正确安装(plsql连接远程数据库) CreateTime--2018年4月23日16:55:11 Author:Marydon 1.情景再现 2.问题解 ...
- Android中自定义样式与View的构造函数中的第三个参数defStyle的意义
零.序 一.自定义Style 二.在XML中为属性声明属性值 1. 在layout中定义属性 2. 设置Style 3. 通过Theme指定 三.在运行时获取属性值 1. View的第三个构造函数的第 ...
- Asp.net中存储过程拖拽至dbml文件中,提示无法获得返回值
Asp.net中存储过程拖拽至dbml文件中,提示无法获得返回值,去属性表中设置这时候会提示你去属性表中更改返回类型. 其实存储过程返回的也是一张表,只不过有时候存储过程有点复杂或者写法不规范的话不能 ...
- 如何将Eclipse中的项目迁移到Android Studio 中
如何将Eclipse中的项目迁移到Android Studio 中 如果你之前有用Eclipse做过安卓开发,现在想要把Eclipse中的项目导入到Android Studio的环境中,那么首先要做的 ...
- 在C#代码中应用Log4Net(三)Log4Net中配置文件的解释
一个完整的配置文件的例子如下所示,这个是”在C#代码中应用Log4Net(二)”中使用的配置文件. <log4net> <!-- 错误日志类--> <logger nam ...
- ASP.NET MVC搭建项目后台UI框架—8、将View中选择的数据行中的部分数据传入到Controller中
目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...
- golang中的slice翻转存在以及map中的key判断
//slice翻转 func stringReverse(src []string){ if src == nil { panic(fmt.Errorf("the src can't be ...
- java中的反射机制在Android开发中的用处
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...
- ui-router中的锚点问题(angular中的锚点问题)
angular.module('anchorScrollExample', []) .controller('ScrollController', ['$scope', '$location', '$ ...
随机推荐
- Spring RestTemplate 之exchange方法
●exchange方法提供统一的方法模板进行四种请求:POST,PUT,DELETE,GET (1)POST请求 String reqJsonStr = "{\"code\&quo ...
- 【并查集模板】并查集模板 luogu-3367
题目描述 简单的并查集模板 输入描述 第一行包含两个整数N.M,表示共有N个元素和M个操作. 接下来M行,每行包含三个整数Zi.Xi.Yi 当Zi=1时,将Xi与Yi所在的集合合并 当Zi=2时,输出 ...
- Lniux上的tomcat部署web项目路径问题
一.项目路径及部署.启动位置 1.在tomcat下部署应用,部署路径:一般直接部署在tomcat/webapps/ROOT下即可.2.默认访问路径:tomcat的默认访问路径为webapps/ROOT ...
- K8S系列第三篇(Docker网络)
目录 docker 网络 Docker 的四种网络模 一.网络基础 1.网络名称空间介绍 2.创建一个命名空间 1)Veth设备对 2)Veth设备操作 1> 创建Veth设备对 2> 绑 ...
- gos-log高性能大日志检索中台
gos-log 基于Go语言的轻量级高性能的大日志检索系统 开源地址 gos-log https://gitee.com/dianjiu/gos-log https://github.com/dian ...
- STEVE JOBS: Stanford Commencement【Stay Hungry. Stay Foolish.】
In 2005, a year after he was first diagnosed with cancer, Apple CEO Steve Jobs made a candid speech ...
- Windows API 简介
操作系统的作用之一就是屏蔽一些复杂的直接对硬件操作,并提供给用户一个简单明确的应用接口,类外对于一些基本的或常用的操作也以API的形式提供给用户,比如内存管理.文件管理等. 消息传递机制 消息循环是一 ...
- TS中 使用deprecated 实现对方法的迭代弃用
在日常开发中,我们会定义大量方法函数来提供给业务调用,可随着时间与业务的推进, 有些方法可能不切合当下需求, 或将被逐步废弃并替换到新的方法中, 例如 框架中 部分生命周期的废弃. 此时作为开发者就很 ...
- docker上运行mysql服务器
1.搜索MySQL镜像 $ docker search mysql INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.i ...
- EF中数据修改时动态更新其他数据
场景 利用.net core开发时,经常会遇到使用EF(Entity Framework),但是今天在开发过程中发现一个值莫名其妙的自己变了,我怀疑是EF的问题. 主要代码如下: 1 // 最近一条告 ...