cari
Rumahpangkalan datatutorial mysqlsqlserver游标概念与实例全面解说

sqlserver游标概念与实例全面解说

Jun 07, 2016 pm 03:51 PM
sqlservermenyeluruhContohkonsepkursorMasuk

欢迎进入Windows社区论坛,与300万技术人员互动交流 >>进入 引言 我们先不讲游标的什么概念,步骤及语法,先来看一个例子: 表一 OriginSalary 表二 AddSalary 现在有2张表,一张是OriginSalary表--工资表,有三个字段0_ID 员工号(NVARCHAR)、O_Name员工姓名

欢迎进入Windows社区论坛,与300万技术人员互动交流 >>进入

  引言

  我们先不讲游标的什么概念,步骤及语法,先来看一个例子:

sqlserver游标概念与实例全面解说
sqlserver游标概念与实例全面解说

  表一 OriginSalary 表二 AddSalary

  现在有2张表,一张是OriginSalary表--工资表,有三个字段0_ID 员工号(NVARCHAR)、O_Name员工姓名(NVARCHAR)、O_Salary工资(FLOAT)。

  另一张表AddSalary表―加薪表。有2个字段,O_ID员工号、A_Salary增加工资。两张表的O_ID是一一对应的,现在求将加薪的工资+原来的工资=现在的工资,也就是O_Salary=O_Salary+A_Salary,修改表OriginSalary的工资字段。

  对于一些不熟悉游标的程序员来说,这个并不是什么很难的问题,这个问题用程序来实现可能也很简单。我先说说,用ASP.NET程序解决这个问题的思路:

  1. 先获得表OriginSalary的记录数,写个循环。

  2. 写SQL语句“select * from dbo.OriginSalary as A left join dbo.AddSalary as B on A.O_ID=B.O_ID”获得视图。

  3. 使用Dataset获得O_Salary=O_Salary+A_Salary。

  4. 写UPDATE语句“update OriginSalary set O_Salary=”相加的值” where O_ID=”获得值”

  5. 循环3次,完成此功能。

  还有一种方法就是写存储过程,在这里我就不列出来了。

  我想大家在学习游标之前好好想想这个问题,及一些批量处理的例子。可能有的人会说:“难道数据库不能一行一行的处理数据吗?将表AddSalary的数据逐行的取出,然后表 OriginSalary数据逐行的修改?”答案当然是肯定。这就是游标概念。接下来的一章我们会好好的讲讲什么是游标?我会用游标来解决刚才留给大家的问题。

  1.1游标的概念

  游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集。使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。

  1.2 游标的优点

  从游标定义可以得到游标的如下优点,这些优点使游标在实际应用中发挥了重要作用:

  1)允许程序对由查询语句select返回的行集合中的每一行执行相同或不同的操作,而不是对整个行集合执行同一个操作。

  2)提供对基于游标位置的表中的行进行删除和更新的能力。

  3)游标实际上作为面向集合的数据库管理系统(RDBMS)和面向行的程序设计之间的桥梁,使这两种处理方式通过游标沟通起来。

  1.3 游标的使用

  讲了这个多游标的优点,现在我们就亲自来揭开游标的神秘的面纱。

  使用游标的顺序: 声名游标、打开游标、读取数据、关闭游标、删除游标。

  1.3.1声明游标

  最简单游标声明:DECLARE CURSOR FOR;

  其中select语句可以是简单查询,也可以是复杂的接连查询和嵌套查询

  例子:[已表2 AddSalary为例子]

  Declare mycursor cursor for select * from AddSalary

  这样我就对表AddSalary申明了一个游标mycursor

  【高级备注】

  DECLARE [INSENSITIVE] [SCROLL] CURSORFOR

  这里我说一下游标中级应用中的[INSENSITIVE]和[SCROLL]

  INSENSITIVE

  表明MS SQL SERVER 会将游标定义所选取出来的数据记录存放在一临时表内(建立在tempdb 数据库下)。对该游标的读取操作皆由临时表来应答。因此,对基本表的修改并不影响游标提取的数据,即游标不会随着基本表内容的改变而改变,同时也无法通过游标来更新基本表。如果不使用该保留字,那么对基本表的更新、删除都会反映到游标中。

  另外应该指出,当遇到以下情况发生时,游标将自动设定INSENSITIVE 选项。

  a.在SELECT 语句中使用DISTINCT、 GROUP BY、 HAVING UNION 语句;

  b.使用OUTER JOIN;

  c.所选取的任意表没有索引;

  d.将实数值当作选取的列。

  SCROLL

  表明所有的提取操作(如FIRST、 LAST、 PRIOR、 NEXT、 RELATIVE、 ABSOLUTE)都可用。如果不使用该保留字,那么只能进行NEXT 提取操作。由此可见,SCROLL 极大地增加了提取数据的灵活性,可以随意读取结果集中的任一行数据记录,而不必关闭再

  重开游标。

  1.3.2 打开游标

  非常简单,我们就打开刚才我们声明的游标mycursor

  OPEN mycursor

  1.3.3读取数据

  FETCH [ NEXT | PRIOR | FIRST | LAST] FROM { 游标名 | @游标变量名 } [ INTO @变量名 [,…] ]

  参数说明:

  NEXT 取下一行的数据,并把下一行作为当前行(递增)。由于打开游标后,行指针是指向该游标第1行之前,所以第一次执行FETCH NEXT操作将取得游标集中的第1行数据。NEXT为默认的游标提取选项。

  INTO @变量名[,…] 把提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列数据类型所支持的隐性转换。变量的数目必须与游标选择列表中的列的数目一致。

  现在我们就取出mycursor游标的数据吧!

  当游标被打开时,行指针将指向该游标集第1行之前,如果要读取游标集中的第1行数据,必须移动行指针使其指向第1行。就本例而言,可以使用下列操作读取第1行数据:

  Eg: Fetch next from mycursor 或则 Fetch first from mycursor

  这样我就取出了游标里的数据,但是光光这样可不够,我们还需要将取出的数据赋给变量

  //声明2个变量

  declare @O_ID NVARCHAR(20)

  declare @A_Salary float

  //将取出的值传入刚才声明的2个变量

  Fetch next from mycursor into @ O_ID,@ A_Salary

  1.3.4关闭游标

  CLOSE mycursor

  1.3.5删除游标

  DEALLOCATE mycursor

  1.3.6 实例训练

  如上我介绍完了游标使用的5个步骤,那现在我们就来上上手,练习用游标取出表2 AddSalary的数据。

  为了运行我们自己创建的游标,我们将游标写在存储过程里,方便我们看到游标的整个使用过程。

  在sqlserver2000中新建一个存储过程:

  CREATE PROCEDURE PK_Test

  AS

  //声明2个变量

  declare @O_ID nvarchar(20)

  declare @A_Salary float

  //声明一个游标mycursor,select语句中参数的个数必须要和从游标取出的变量名相同

  declare mycursor cursor for select O_ID,A_Salary from AddSalary

  //打开游标

  open mycursor

  //从游标里取出数据赋值到我们刚才声明的2个变量中

  fetch next from mycursor into @O_ID,@A_Salary

  //判断游标的状态

  //0 fetch语句成功

  //-1 fetch语句失败或此行不在结果集中

  //-2被提取的行不存在

  while (@@fetch_status=0)

  begin

  //显示出我们每次用游标取出的值

  print '游标成功取出一条数据'

  print @O_ID

  print @A_Salary

  //用游标去取下一条记录

  fetch next from mycursor into @O_ID,@A_Salary

  end

  //关闭游标

  close mycursor

  //撤销游标

  deallocate mycursor

  GO

  通过上面的注释,我想大家都明白了整个游标的创建过程了吧。但是我们现在还是一个抽象的了解,我们学任何知识,都要用于实践,这样才能使抽象的东西变的具体。

[1] [2] 

sqlserver游标概念与实例全面解说

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Terangkan peranan log redo innoDB dan membatalkan log.Terangkan peranan log redo innoDB dan membatalkan log.Apr 15, 2025 am 12:16 AM

InnoDB menggunakan redolog dan undologs untuk memastikan konsistensi dan kebolehpercayaan data. 1. Pengubahsuaian halaman data rekod untuk memastikan pemulihan kemalangan dan kegigihan transaksi. 2.UNDOLOGS merekodkan nilai data asal dan menyokong penggantian transaksi dan MVCC.

Apakah metrik utama untuk dicari dalam output yang dijelaskan (jenis, kunci, baris, tambahan)?Apakah metrik utama untuk dicari dalam output yang dijelaskan (jenis, kunci, baris, tambahan)?Apr 15, 2025 am 12:15 AM

Metrik utama untuk menjelaskan arahan termasuk jenis, kunci, baris, dan tambahan. 1) Jenis mencerminkan jenis akses pertanyaan. Semakin tinggi nilai, semakin tinggi kecekapan, seperti const adalah lebih baik daripada semua. 2) Kunci memaparkan indeks yang digunakan, dan null menunjukkan tiada indeks. 3) Baris menganggarkan bilangan baris yang diimbas, yang mempengaruhi prestasi pertanyaan. 4) Tambahan memberikan maklumat tambahan, seperti menggunakanFilesort meminta bahawa ia perlu dioptimumkan.

Apakah status sementara dalam menjelaskan dan bagaimana untuk mengelakkannya?Apakah status sementara dalam menjelaskan dan bagaimana untuk mengelakkannya?Apr 15, 2025 am 12:14 AM

MenggunakanTemary menunjukkan bahawa keperluan untuk membuat jadual sementara dalam pertanyaan MySQL, yang biasanya dijumpai di Orderby menggunakan lajur yang berbeza, GroupBy, atau tidak diindeks. Anda boleh mengelakkan berlakunya indeks dan menulis semula pertanyaan dan meningkatkan prestasi pertanyaan. Khususnya, apabila menggunakan pembelian muncul dalam menjelaskan output, ini bermakna MySQL perlu membuat jadual sementara untuk mengendalikan pertanyaan. Ini biasanya berlaku apabila: 1) deduplikasi atau pengelompokan apabila menggunakan yang berbeza atau kumpulan; 2) Susun apabila Orderby mengandungi lajur bukan indeks; 3) Gunakan subquery kompleks atau menyertai operasi. Kaedah Pengoptimuman termasuk: 1) Orderby dan GroupB

Huraikan tahap pengasingan urus niaga SQL yang berbeza (baca yang tidak komited, baca bacaan yang komited, berulang, bersiri) dan implikasinya dalam MySQL/InnoDB.Huraikan tahap pengasingan urus niaga SQL yang berbeza (baca yang tidak komited, baca bacaan yang komited, berulang, bersiri) dan implikasinya dalam MySQL/InnoDB.Apr 15, 2025 am 12:11 AM

MySQL/InnoDB menyokong empat tahap pengasingan transaksi: ReadUncommitted, ReadCommitted, RepeatableRead dan Serializable. 1. ReadoMuncommitted membolehkan membaca data yang tidak komited, yang boleh menyebabkan bacaan kotor. 2. 3.RepeatableRead adalah tahap lalai, mengelakkan bacaan kotor dan bacaan yang tidak boleh diulang, tetapi bacaan hantu mungkin berlaku. 4. Serializable mengelakkan semua masalah konkurensi tetapi mengurangkan kesesuaian. Memilih tahap pengasingan yang sesuai memerlukan keseimbangan data konsistensi dan keperluan prestasi.

MySQL vs Pangkalan Data Lain: Membandingkan PilihanMySQL vs Pangkalan Data Lain: Membandingkan PilihanApr 15, 2025 am 12:08 AM

MySQL sesuai untuk aplikasi web dan sistem pengurusan kandungan dan popular untuk sumber terbuka, prestasi tinggi dan kemudahan penggunaan. 1) Berbanding dengan PostgreSQL, MySQL melakukan lebih baik dalam pertanyaan mudah dan operasi membaca serentak yang tinggi. 2) Berbanding dengan Oracle, MySQL lebih popular di kalangan perusahaan kecil dan sederhana kerana sumber terbuka dan kos rendah. 3) Berbanding dengan Microsoft SQL Server, MySQL lebih sesuai untuk aplikasi silang platform. 4) Tidak seperti MongoDB, MySQL lebih sesuai untuk data berstruktur dan pemprosesan transaksi.

Bagaimanakah kardinaliti indeks MySQL mempengaruhi prestasi pertanyaan?Bagaimanakah kardinaliti indeks MySQL mempengaruhi prestasi pertanyaan?Apr 14, 2025 am 12:18 AM

Cardinality Indeks MySQL mempunyai kesan yang signifikan terhadap prestasi pertanyaan: 1. Indeks kardinaliti yang tinggi dapat lebih berkesan menyempitkan julat data dan meningkatkan kecekapan pertanyaan; 2. Indeks kardinaliti yang rendah boleh membawa kepada pengimbasan jadual penuh dan mengurangkan prestasi pertanyaan; 3. Dalam indeks bersama, urutan kardinaliti yang tinggi harus diletakkan di depan untuk mengoptimumkan pertanyaan.

MySQL: Sumber dan Tutorial untuk Pengguna BaruMySQL: Sumber dan Tutorial untuk Pengguna BaruApr 14, 2025 am 12:16 AM

Laluan pembelajaran MySQL termasuk pengetahuan asas, konsep teras, contoh penggunaan, dan teknik pengoptimuman. 1) Memahami konsep asas seperti jadual, baris, lajur, dan pertanyaan SQL. 2) Ketahui definisi, prinsip kerja dan kelebihan MySQL. 3) menguasai operasi CRUD asas dan penggunaan lanjutan, seperti indeks dan prosedur yang disimpan. 4) Biasa dengan debugging kesilapan biasa dan cadangan pengoptimuman prestasi, seperti penggunaan rasional indeks dan pertanyaan pengoptimuman. Melalui langkah -langkah ini, anda akan memahami sepenuhnya penggunaan dan pengoptimuman MySQL.

Mysql dunia nyata: Contoh dan kes penggunaanMysql dunia nyata: Contoh dan kes penggunaanApr 14, 2025 am 12:15 AM

Aplikasi dunia nyata MySQL termasuk reka bentuk pangkalan data asas dan pengoptimuman pertanyaan kompleks. 1) Penggunaan Asas: Digunakan untuk menyimpan dan mengurus data pengguna, seperti memasukkan, menanyakan, mengemas kini dan memadam maklumat pengguna. 2) Penggunaan lanjutan: Mengendalikan logik perniagaan yang kompleks, seperti perintah dan pengurusan inventori platform e-dagang. 3) Pengoptimuman Prestasi: Meningkatkan prestasi dengan menggunakan indeks, jadual partisi dan cache pertanyaan.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Dreamweaver Mac版

Dreamweaver Mac版

Alat pembangunan web visual

mPDF

mPDF

mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular