【PL/SQL系列】Oracle存储过程使用动态SQL
Oracle存储过程相信大家都比较了解,下面就为您介绍Oracle存储过程使用动态SQL的方法,希望对您能够有所帮助。
CREATE OR REPLACE PROCEDURE P_STAT_SCORE01
(
PARA_EXAMGUID VARCHAR2, -- 考试ID A9093AE714AC47758A367B8813B99D1D,3216885E3B3148E3904908BD30BF9413,F8254D3E50F64819A996D1E369BBF053
CUR OUT SYS_REFCURSOR
) /****************************************************************************
名称:P_STAT_SCORE02
功能描述:根据考试ID,取出班级,考试科目信息 修订记录:
版本号 编辑时间 编辑人 修改描述
1.0.0 2016-4-7 CHEQNP 1.创建此存储过程,修改动态SQL语句,主要包括变量的使用和WHERE语句的书写 注释 入参出参描述:
PARA_EXAMGUID 考试ID
CUR 输出游标 *****************************************************************************/ AS
-- 定义变量
VAR_SQL CLOB; -- 拼接SQL
VAR_TEACHER_SQL CLOB; -- 科任老师
VAR_COURSENAME VARCHAR(200); -- 科目名称 BEGIN VAR_SQL := 'SELECT
(CASE WHEN CLASSROOM_NAME IS NULL THEN ''合计'' ELSE MIN(CLASSROOM_NAME) END) AS 班级 '; -- 取应考人数,实考人数
VAR_SQL := VAR_SQL || ' ,NVL2(CLASSROOM_NAME,
(SELECT COUNT(1) FROM TPRG_STUDENT a
LEFT JOIN TPRG_CLASSROOM b
ON a.CLASSROOM_ID = b.CLASSROOM_ID
WHERE b.CLASSROOM_NAME = T.CLASSROOM_NAME ),
(SELECT COUNT(1) FROM TPRG_STUDENT
WHERE CLASSROOM_ID
IN (SELECT CLASSROOM_ID
FROM V_FULL_SCORE
WHERE EXAMGUID = '''||PARA_EXAMGUID||'''
GROUP BY CLASSROOM_ID))) 应考人数
,COUNT(DISTINCT STUDID) AS 实考人数 '; -- 定义游标myCusor
-- 根据考试ID查询考试科目,并按照COURSEID生成科目顺序
DECLARE CURSOR myCusor IS SELECT COURSENAME FROM V_FULL_SCORE WHERE EXAMGUID = ''||PARA_EXAMGUID||''
GROUP BY COURSEID,COURSENAME
ORDER BY COURSEID ASC;
-- 开始使用游标取数据
BEGIN
OPEN myCusor;
LOOP
FETCH myCusor INTO VAR_COURSENAME;
-- 游标取不到数据则退出
EXIT WHEN myCusor%NOTFOUND; -- 动态拼接各科目SQL语句
VAR_SQL := VAR_SQL || ' , ROUND(SUM(CASE COURSENAME WHEN '''||VAR_COURSENAME||''' THEN SCORE_SUM ELSE 0 END) / SUM(CASE COURSENAME WHEN '''||VAR_COURSENAME||''' THEN 1 ELSE NULL END),2) '||VAR_COURSENAME||'平均分
, MAX(CASE COURSENAME WHEN '''||VAR_COURSENAME||''' THEN SCORE_SUM ELSE 0 END) '||VAR_COURSENAME||'最高分
, SUM(CASE WHEN COURSENAME = '''||VAR_COURSENAME||''' AND SCORE_SUM >= FULLSCORE_SUM * 0.6 THEN 1 ELSE 0 END) '||VAR_COURSENAME||'_及格人数
, ROUND(SUM(CASE WHEN COURSENAME = '''||VAR_COURSENAME||''' AND SCORE_SUM >= FULLSCORE_SUM * 0.6 THEN 1 ELSE 0 END) / SUM(CASE COURSENAME WHEN '''||VAR_COURSENAME||''' THEN 1 ELSE NULL END) * 100,2) '||VAR_COURSENAME||'_及格率
, SUM(CASE WHEN COURSENAME = '''||VAR_COURSENAME||''' AND SCORE_SUM >= FULLSCORE_SUM * 0.8 THEN 1 ELSE 0 END) '||VAR_COURSENAME||'_优分人数
, ROUND(SUM(CASE WHEN COURSENAME = '''||VAR_COURSENAME||''' AND SCORE_SUM >= FULLSCORE_SUM * 0.8 THEN 1 ELSE 0 END) / SUM(CASE COURSENAME WHEN '''||VAR_COURSENAME||''' THEN 1 ELSE NULL END) * 100,2) '||VAR_COURSENAME||'_优分率'; VAR_TEACHER_SQL := VAR_TEACHER_SQL || ' NULL AS ' || VAR_COURSENAME||'_科任老师 , '; END LOOP;
CLOSE myCusor;
END; -- 科任教师部分字符串去掉逗号
VAR_TEACHER_SQL := SUBSTR(TRIM(VAR_TEACHER_SQL),1,LENGTH(TRIM(VAR_TEACHER_SQL))-1); -- 拼接科任教师部分
VAR_SQL := VAR_SQL || ',' || VAR_TEACHER_SQL; -- 按照班级名称,科目名称,学生得到每个学生总分
-- 根据班级进行分组
VAR_SQL := VAR_SQL || ' FROM (
SELECT CLASSROOM_NAME
,COURSENAME
,STUDID
,STUD_NAME
,SUM(SCORE) AS SCORE_SUM
,SUM(FULLSCORE) AS FULLSCORE_SUM
FROM V_FULL_SCORE
WHERE EXAMGUID = '''||PARA_EXAMGUID||'''
GROUP BY
CLASSROOM_NAME
,COURSENAME
,STUDID
,STUD_NAME) T
GROUP BY ROLLUP(CLASSROOM_NAME)'; DBMS_OUTPUT.PUT_LINE(VAR_SQL); OPEN CUR FOR VAR_SQL; END ;
【PL/SQL系列】Oracle存储过程使用动态SQL的更多相关文章
- oracle 存储过程 调用动态sql
oracle 存储过程 调用动态sql CreationTime--2018年8月16日11点25分 Author:Marydon 1.错误实现方式 --开始时间拼接' 00:00:00' V_S ...
- oracle 存储过程使用动态sql
Oracle存储过程使用动态SQL 有两种写法:用 DBMS_SQL 或 execute immediate,建议使用后者. DDL和DML (注意DDL中可以用拼接字符串的方法用来create ta ...
- Oracle 存储过程,临时表,动态SQL测试
--创建事务级别的结果临时表 create global temporary table tmp_yshy( c1 ), c2 ) )on commit delete rows; --创建事务级别的存 ...
- ORACLE数据库之PL/SQL触发器、rownum、动态SQL、数据库之视图与索引
WHEN子句说明触发约束条件.Condition为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL函数.WHEN子句指定的触发约束条件只能用在BEFORE和AFTER行 ...
- 在Oracle中执行动态SQL的几种方法
转载:在Oracle中执行动态SQL的几种方法 以下为内容留存: 在Oracle中执行动态SQL的几种方法 在一般的sql操作中,sql语句基本上都是固定的,如:SELECT t.empno,t.en ...
- Oracle数据库之动态SQL
Oracle数据库之动态SQL 1. 静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:一种为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大 ...
- mybatis基础系列(三)——动态sql
本文是Mybatis基础系列的第三篇文章,点击下面链接可以查看前面的文章: mybatis基础系列(二)--基础语法.别名.输入映射.输出映射 mybatis基础系列(一)--mybatis入门 动态 ...
- Mybatis 系列9-强大的动态sql 语句
[Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...
- SQL Server-聚焦深入理解动态SQL查询(三十二)
前言 之前有园友一直关注着我快点出SQL Server性能优化系列,博主我也对性能优化系列也有点小期待,本来打算利用周末写死锁以及避免死锁系列的接着进入SQL Server优化系列,但是在工作中长时间 ...
随机推荐
- ssh增加密匙登录
使用要创建登录密匙的账号登录 生成密匙 #ssh-keygen -t rsa 生成时提示输入密码,如果不输入,则直接回车即可,如果输入,将在无密匙登陆时要求输入该密码 进入生成目录.ssh #cd ~ ...
- 如何获取imageView中当前内容的相关信息并比较?
public class MainActivity extends Activity implements OnClickListener{ private Button button; privat ...
- 超简易静态Web服务器
使用 HttpListener 写的一个超简易静态Web服务器 开发环境:VS2010 + .NET2.0 http://files.cnblogs.com/zjfree/EasyIIS.rar
- java取整和java四舍五入方法 BigDecimal.setScale()方法详解
import java.math.BigDecimal; public class TestGetInt { public static void main(String[] args) { doub ...
- 大商创 sql追踪 卖家入驻
' ' ' ', '', '', '') ' Query ' Query ' Query ' Query ' Query ' Query ' Query ' Query ' Query ' Query ...
- MVC过滤器详解 面向切面编程(AOP)
面向切面编程:Aspect Oriented Programming(AOP),面向切面编程,是一个比较热门的话题.AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个 ...
- Java基础之在窗口中绘图——渐变填充(GradientApplet 1)
Applet程序. import javax.swing.*; import java.awt.*; import java.awt.geom.*; @SuppressWarnings("s ...
- LaTeX插入图表方法 Lists of tables and figures
Lists of tables and figures A list of the tables and figures keep the information organized and prov ...
- 三大框架-Hibernate
概念 持久化框架 把对象保存到数据库中,对数据的CURD操作 ORM框架 ORM对象关系映射 类<->表 属性<->字段 对象<->表中的记录 实现方法 创建持久化 ...
- 在Unity中如何取得一个Box的Bounds
private BoxCollider mCollider; // Use this for initialization void Start () { mCollider = GetCompone ...