游标

Oracle(三)存储过程与游标

喜欢而已 提交于 2019-11-27 14:03:19
--创建或修改存储过程,存储过程名为findclass,输入参数为classId,输出className create or replace procedure findclass(classId in int,classStudents out sys_refcursor,className out varchar2) as --定义一个游标的方式有多种,可以显示定义CURSOR cursor_name is select * from table,也可以定义动态游标,游标关键词CURSOR TYPE ref_cursor_type IS REF CURSOR; --定义一个动态游标 students ref_cursor_type; --定义班级集合为一个游标类型 student_row student%rowtype; --定义班级类型,类型为student表行类型 --存储过程开始 begin --把查询出来的class_name 赋值给输出变量className,查询条件为classId select class_name into className from class where id = classId; --打开游标并赋值 open students for select * from student where fk_class =classId; -

SQL中的循环、for循环、游标

大兔子大兔子 提交于 2019-11-27 12:20:15
我们使用SQL语句处理数据时,可能会碰到一些需要循环遍历某个表并对其进行相应的操作(添加、修改、删除),这时我们就需要用到咱们在编程中常常用的for或foreach,但是在SQL中写循环往往显得那么吃力,翻遍网上的资料,找不到几个正确的并能执行的循环处理数据的方法,在这里,我来给大家分享一下! 要SQL中写类似for循环,我这里使用的是SQL中的游标来实现,当然SQL中也有for loop、while do等,我这里仅以使用游标方式来进行示例,其它的方式大家有兴趣可以研究一下,成功的同学可以在下面回复一下并把代码贴出来,与大家分享! 闲话少说,上示例: 1. 利用游标循环更新、删除MemberAccount表中的数据 DECLARE My_Cursor CURSOR --定义游标FOR (SELECT * FROM dbo.MemberAccount) --查出需要的集合放到游标中OPEN My_Cursor; --打开游标FETCH NEXT FROM My_Cursor ; --读取第一行数据WHILE @@FETCH_STATUS = 0 BEGIN --UPDATE dbo.MemberAccount SET UserName = UserName + 'A' WHERE CURRENT OF My_Cursor; --更新 --DELETE FROM dbo

【编程漫谈】程序的运行流程

谁说我不能喝 提交于 2019-11-27 12:03:53
当我们看到一个程序流程图的时候,这时程序在我们的脑子里是立体的。一条条箭头就像一根根导管,程序就像流水,向着规定的地方流动。程序就像一个自动分拣系统,不同的数据会导致不一样的结果。但无论是哪种系统,都是安照人类的意志,直到结束。 再举个下棋的例子。下棋的过程就是一个程序执行的过程,你在决定下一步怎么走的时候,脑子里有很多条件的输入和输出,我走哪个棋会产生哪个结果,对方走哪个棋会产生什么样结果。传统上我们将怎么走棋归于个人的经验,实际是人的大脑在模拟电脑的演算过程。 上边的流程图中,我们可以把A、B、C……相像成棋子子,不同判定表示你决定下一步怎么走棋。所以宏观上理解一个程序运行过程,其实就是这个样子的。 程序的执行流程也有点像走迷宫,迷宫只有一个入口,一个出口,走迷宫就是在迷宫里不停地找出口的过程。程序其实也是这样,从程序入口进入,经过各种判定、跳转最后到程序结束。 但实际上一个应用程序没有相像中那拥有具象,程序实际上一堆线性数据。下图中就是某个程序内容,它们按顺序存放,每一行可能是一条指令或是一条数据。 这个静态的顺序数据,就像展开的六面体。同样我们也给六面体编上号,然后安装顺序折起来,于是就得到一个六面体。程序也是这样的,只是六面的展开图还是二维的,而程序的线性表是一维的。 为了方便理解这些十六进制表示的二进制数据,我们可以将这些内容转换成汇编程序。

T-SQL查询进阶-10分钟理解游标

二次信任 提交于 2019-11-27 11:20:53
概述 游标是邪恶的! 在关系数据库中,我们对于查询的思考是面向集合的。而游标打破了这一规则,游标使得我们思考方式变为逐行进行.对于类C的开发人员来着,这样的思考方式会更加舒服。 正常面向集合的思维方式是: 而对于游标来说: 这也是为什么游标是邪恶的,它会使开发人员变懒,懒得去想用面向集合的查询方式实现某些功能. 同样的,在性能上,游标会吃更多的内存,减少可用的并发,占用宽带,锁定资源,当然还有更多的代码量…… 从游标对数据库的读取方式来说,不难看出游标为什么占用更多的资源,打个比方: 当你从ATM取钱的时候,是一次取1000效率更高呢,还是取10次100? 既然游标这么“邪恶”,为什么还要学习游标 我个人认为存在既是合理.归结来说,学习游标原因我归纳为以下2点 1.现存系统有一些游标,我们查询必须通过游标来实现 2.作为一个备用方式,当我们穷尽了while循环,子查询,临时表,表变量,自建函数或其他方式扔来无法实现某些查询的时候,使用游标实现. T-SQL中游标的生命周期以及实现 在T-SQL中,游标的生命周期由5部分组成 1.定义一个游标 在T-SQL中,定义一个游标可以是非常简单,也可以相对复杂,取决于游标的参数.而游标的参数设置取决于你对游标原理的了解程度. 游标其实可以理解成一个定义在特定 数据集 上的指针,我们可以控制这个指针遍历 数据集 ,或者仅仅是指向特定的行

E-SQL

随声附和 提交于 2019-11-27 11:01:58
E-SQL 1.学会用嵌入式SQL对数据库进行增、删、改、查操作。 2.多行查询使用游标和STATE 3.SQL事物操作 4. 集群和模式 1:以SQL嵌入C语言为例说明实现嵌入式SQL的方法 1.1声明:通信的变量就是SQL与C语言进行数据传递 C语言和SQL语言之间是通过共享变量来进行数据的传送。 (1)EXEC SQL BEGIN DECLARE SECTION; char name[20]; Int age; char sex[4]; EXEC SQL END DECLARE SECTION; (2)声明使用共享变量 嵌入式SQL在执行的时候需要在前面添加EXEC SQL 插入语句:inset into table_name(,,,)values(:xx,:ss) 插入语句的格式为: EXEC SQL INSERT INTO Student (id, name) VALUES (:s_id, :s_name); :后面的变量需要在开始的时候进行声明。 1.2、执行SQL 插入语句: 插入语句的格式为: EXEC SQL INSERT INTO Student (StudentNo, StudentName) VALUES (:sno, :sname); 修改语句: 修改语句的格式为: update table_name set age = 12 where Id = 12

Redis集合(set)的命令操作

旧街凉风 提交于 2019-11-27 10:10:35
redis 对set集合的命令操作 redis的set集合是String类型的无序集合,集合元素是唯一的, sadd key value1 value2 作用:对key添加一个value或多个value 返回值:被添加到集合中的新元素的数量,不包括被忽略的元素。   scard key 作用:获取key对应的所有元素个数 返回值:不存在是返回0。存在时返回集合的数量   sismember key member 作用:查看member元素是不是key集合的成员 返回值:是的话返回1,不是或key集合不存在返回0   smembers key 作用:获取集合key的所有成员数量 返回值:集合中的所有成员 , 不存在时返回 (empty list or set)   smove source destination member 作用:将 member 元素从 source 集合移动到 destination 集合 返回值:如果 source 集合不存在或不包含指定的 member 元素,则 smove 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。 当 destination 集合已经包含 member 元素时, smove 命令只是简单地将 source 集合中的 member 元素删除。 当

使用pymysql操作数据库

亡梦爱人 提交于 2019-11-27 08:11:01
学习如何使用python的pymysql模块来操作mysql数据库 这里的基本用法主要借鉴了该篇博客: https://www.cnblogs.com/woider/p/5926744.html 因为这个作者总结的很全面,也很简洁,看完很容易上手 一.pymysql的主要方法 pymysql.connect()参数说明:(连接数据库时需要添加的参数) host(str): MySQL服务器地址 port(int): MySQL服务器端口号 user(str): 用户名 passwd(str): 密码 db(str): 数据库名称 charset(str): 连接编码 connect()对象支持的方法: cursor() 使用该连接创建并返回游标 commit() 提交当前事务 rollback() 回滚当前事务 close() 关闭连接 cursor对象支持的方法: execute(op) 执行一个数据库的查询命令 fetchone() 取得结果集的下一行 fetchmany(size) 获取结果集的下几行 fetchall() 获取结果集中的所有行 rowcount() 返回数据条数或影响行数 close() 关闭游标对象 二.常用操作 1.查询数据 # coding: utf-8 # author: hmk import pymysql.cursors # 连接数据库 conn

存储过程游标循环赋值返回为NULL

怎甘沉沦 提交于 2019-11-27 06:51:57
存储过程的整体思路是查询 dwd_cms_c_cons, 得到cons_no , 再根据cons_no查询 dwd_cms_arc_e_cons_snap ,得到calc_id结果集,循环calc_id结果集拼接成逗号隔开的字符串,再用结果去查询 dwd_cms_arc_e_consprc_tactic_snap ,同样的方法处理结果集,再同样去查 dwd_cms_arc_e_mp_para_snap CREATE PROCEDURE `test1`(IN time VARCHAR(6)) BEGIN DECLARE calc_ids VARCHAR(64) DEFAULT(0); DECLARE prc_tactic_snap_ids VARCHAR(64) DEFAULT(0); DECLARE mp_para_snap_ids VARCHAR(64) DEFAULT(0); -- 定义一个局部变量接受客户编号数据集 DECLARE s_region VARCHAR(16); DECLARE done INT DEFAULT(0); -- 定义一个动态游标 DECLARE cur REF CURSOR; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; -- 操作器 /**查询客户号**/ -- OPEN

大话数据结构读后感(一)线性表栈与队列

℡╲_俬逩灬. 提交于 2019-11-27 06:16:13
3.2 线性表的定义 3.3 线性表的抽象数据类型行:创建,销毁,增删改查等等操作 3.4 线性表之顺序存储 :顺序表 3.5 顺序表的插入和删除:相当于数组的插入和删除;然后把当前length +(-) 1;   顺序表的优点:无须为表示表中的元素之间的逻辑关系而添加额外的存储空间;可以快速地访问存取表中的任意位置子的元素;   缺点:插入和删除操作需要移动大量的元素;当线性表长度变化较大时,难以确定存储空间的容量;造成存储空间的碎片; 3.6 线性表的链式存储结构:链表 解决了顺序表的增删需要移动大量元素的问题; 3.7 单链表的读取:next指针遍历; 3.8 单链表的插入和删除:插入s : s->next=p->next; p->next=s; 删除s:s=q; p->next=s->next; free(s); 3.9 单链表的整表创建:(插入) 头插和尾插:尾插最后指向NULL; 3.10 单链表的整表删除:挨个删除 : p=head->next; while(p!=NULL) { q=p->next; free(p) ; p=q; } 3.11 单链表结构与顺序结构存储结构优缺点: 存储分配方式:顺序表存储单元连续,线性表任意存储位置; 时间性能:顺序表方便查找;单链表适合插入和删除; 空间性能:顺序表需预先分配存储空间,分大了浪费,分小了容易上溢;

sql server 游标和with as使用

泄露秘密 提交于 2019-11-27 06:15:02
DECLARE @userid INT , @gameid NVARCHAR(50) --声明变量,需要读取的数据 DECLARE cur CURSOR --去掉STATIC关键字即可 FOR WITH Emp AS (SELECT acc.* FROM GXSpreadDB.dbo.gxs_account acc LEFT JOIN RYAccountsDB.dbo.AccountsInfo Account ON acc.userid=Account.userid WHERE parentuserid=7213 AND Account.AgentID=0 UNION ALL SELECT d.* FROM Emp ,GXSpreadDB.dbo.gxs_account d WHERE d.parentuserid =Emp.userid ) select userid,gameid from Emp OPEN cur --打开游标 FETCH NEXT FROM cur INTO @userid, @gameid --取数据 WHILE ( @@fetch_status = 0 ) --判断是否还有数据 BEGIN SELECT '数据: ' + RTRIM(@userid)+';' + @gameid --UPDATE #T SET name='测试' WHERE id=4 -