【导语】“小男孩pabu”通过精心收集,向本站投稿了9篇再看数据库――(7)游标,下面就是小编给大家带来的再看数据库――(7)游标,希望能帮助到大家!
- 目录
篇1:再看数据库――(7)游标
背景:
其实《再看数据库》系列博客本没有计划写这么多,但最近确实接触数据库比较多,又接触了这些东西,在之前很少用到,因此就整理下,和大家分享.
简介:
游标,是一个数据缓冲区,用来存放SQL语句的执行结果.与一般的执行过程不同的是,游标是从结果集中每次提取一条记录.
与关系数据库的区别:
关系数据库――面向集合,一般执行结果都是一个集合,如果要选择其中一条或几条记录,就要用where子句,
游标 ――面向单条记录。游标可以对查询语句返回的结果集中的每一行进行相同或不同的操作。
因此说,
游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。
类型:
三种游标类型,包括:Transact_SQL游标,API服务器游标和客户游标。
服务器游标(后台游标)
1)Transact_SQL游标
主要在SQL脚本、存储过程、触发器中使用,不支持提取数据块或多行数据。
一般用在服务器上,由从客户端发送给服务器的SQL语句或批处理、存储过程、触发器中的Transact_SQL进行管理。
2)API服务器游标
主要用在服务器上,户端应用程序调用API 游标函数,MS SQL SEVER 的OLE DB提供者、ODBC驱动器或DB_library 的动态链接库(DLL) 都会将这些客户请求传送给服务器以对API游标进行处理,
客户端游标(前台游标)
3)客户游标
客户游标主要是当在客户机上缓存结果集时才使用。在客户游标中,有一个缺省的结果集被用来在客户机上缓存整个结果集。客户游标仅支持静态游标而非动态游标。
由于服务器游标并不支持所有的Transact-SQL语句或批处理,所以客户游标常常仅被用作服务器游标的辅助。因为在一般情况下,服务器游标能支持绝大多数的游标操作。
举例:
数据库表中的记录如下:
<?www.2cto.com/kf/ware/vc/“ target=”_blank“ class=”keylink“>vcD4KPHByZSBjbGFzcz0=”brush:sql;“>--定义游标DECLARE cursor_Test CURSOR SCROLL FOR SELECT FirstName,MiddleName,LastName FROM AdventureWorksDW2012.dbo.DimCustomer--打开游标OPEN cursor_Test--声明变量DECLARE @test1 VARCHAR(10)DECLARE @test2 VARCHAR(10)DECLARE @test3 VARCHAR(10)--取第一行记录FETCH FIRST FROM cursor_Test INTO @test1,@test2,@test3PRINT @test1 PRINT @test2 PRINT @test3--取下一行记录FETCH NEXT FROM cursor_Test INTO @test1,@test2,@test3PRINT @test1 PRINT @test2 PRINT @test3--关闭游标CLOSE cursor_TestDEALLOCATE cursor_Test执行结果:
总结:
不怕不知道,就怕不知道。有了游标,可以省去很多繁琐的工作,不再需要地手动一个一个的去对每行记录进行操作,节省了很多的工作时间。
篇2:Oracle数据库游标使用
SQL是用于访问ORACLE数据库的语言,PL/SQL扩展和加强了SQL的功能,它同时引入了更强的程序逻辑, PL/SQL支持DML命令和SQL的事务控制语句。DDL在PL/SQL中不被支持,这就意味作在PL/SQL程序块中不能创建表或其他任何对象。较好的PL/SQL程序设计是在PL/SQL块中使用象DBMS_SQL这样的内建包或执行EXECUTE IMMEDIATE命令建立动态SQL来执行DDL命令,PL/SQL编译器保证对象引用以及用户的权限。
下面我们将讨论各种用于访问ORACLE数据库的DDL和TCL语句。
查询
SELECT语句用于从数据库中查询数据,当在PL/SQL中使用SELECT语句时,要与INTO子句一起使用,查询的返回值被赋予INTO子句中的变量,变量的声明是在DELCARE中。SELECT INTO语法如下:
SELECT [DISTICT|ALL]{*|column[,column,...]}
INTO (variable[,variable,...] |record)
FROM {table|(sub-query)}[alias]
WHERE............
PL/SQL中SELECT语句只返回一行数据。如果超过一行数据,那么就要使用显式游标(对游标的讨论我们将在后面进行),INTO子句中要有与SELECT子句中相同列数量的变量。INTO子句中也可以是记录变量。
%TYPE属性
在PL/SQL中可以将变量和常量声明为内建或用户定义的数据类型,以引用一个列名,同时继承他的数据类型和大小。这种动态赋值方法是非常有用的,比如变量引用的列的数据类型和大小改变了,如果使用了%TYPE,那么用户就不必修改代码,否则就必须修改代码。
例:
v_empno SCOTT.EMP.EMPNO%TYPE;
v_salary EMP.SALARY%TYPE;
不但列名可以使用%TYPE,而且变量、游标、记录,或声明的常量都可以使用%TYPE。这对于定义相同数据类型的变量非常有用。
DELCARE
V_A NUMBER(5):=10;
V_B V_A%TYPE:=15;
V_C V_A%TYPE;
BEGIN
DBMS_OUTPUT.PUT_LINE
('V_A='||V_A||'V_B='||V_B||'V_C='||V_C);
END
SQL>/
V_A=10 V_B=15 V_C=
PL/SQL procedure successfully completed.
SQL>
其他DML语句
其它操作数据的DML语句是:INSERT、UPDATE、DELETE和LOCK TABLE,这些语句在PL/SQL中的语法与在SQL中的语法相同。我们在前面已经讨论过DML语句的使用这里就不再重复了。在DML语句中可以使用任何在DECLARE部分声明的变量,如果是嵌套块,那么要注意变量的作用范围。
例:
CREATE OR REPLACE PROCEDURE FIRE_EMPLOYEE (pempno in number)
AS
v_ename EMP.ENAME%TYPE;
BEGIN
SELECT ename INTO v_ename
FROM emp
WHERE empno=p_empno;
INSERT INTO FORMER_EMP(EMPNO,ENAME)
VALUES (p_empno,v_ename);
DELETE FROM emp
WHERE empno=p_empno;
UPDATE former_emp
SET date_deleted=SYSDATE
WHERE empno=p_empno;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Employee Number Not Found!');
END
DML语句的结果
当执行一条DML语句后,DML语句的结果保存在四个游标属性中,这些属性用于控制程序流程或者了解程序的状态。当运行DML语句时,PL/SQL打开一个内建游标并处理结果,游标是维护查询结果的内存中的一个区域,游标在运行DML语句时打开,完成后关闭。隐式游标只使用SQL%FOUND,SQL%NOTFOUND,SQL%ROWCOUNT三个属性.SQL%FOUND,SQL%NOTFOUND是布尔值,SQL%ROWCOUNT是整数值。
SQL%FOUND和SQL%NOTFOUND
在执行任何DML语句前SQL%FOUND和SQL%NOTFOUND的值都是NULL,在执行DML语句后,SQL%FOUND的属性值将是:
. TRUE :INSERT
. TRUE :DELETE和UPDATE,至少有一行被DELETE或UPDATE.
. TRUE :SELECT INTO至少返回一行
当SQL%FOUND为TRUE时,SQL%NOTFOUND为FALSE。
SQL%ROWCOUNT
在执行任何DML语句之前,SQL%ROWCOUNT的值都是NULL,对于SELECT INTO语句,如果执行成功,SQL%ROWCOUNT的值为1,如果没有成功,SQL%ROWCOUNT的值为0,同时产生一个异常NO_DATA_FOUND.
SQL%ISOPEN
SQL%ISOPEN是一个布尔值,如果游标打开,则为TRUE, 如果游标关闭,则为FALSE.对于隐式游标而言SQL%ISOPEN总是FALSE,这是因为隐式游标在DML语句执行时打开,结束时就立即关闭。
事务控制语句
事务是一个工作的逻辑单元可以包括一个或多个DML语句,事物控制帮助用户保证数据的一致性。如果事务控制逻辑单元中的任何一个DML语句失败,那么整个事务都将回滚,在PL/SQL中用户可以明确地使用COMMIT、ROLLBACK、SAVEPOINT以及SET TRANSACTION语句。
COMMIT语句终止事务,永久保存数据库的变化,同时释放所有LOCK,ROLLBACK终止现行事务释放所有LOCK,但不保存数据库的任何变化,SAVEPOINT用于设置中间点,当事务调用过多的数据库操作时,中间点是非常有用的,SET TRANSACTION用于设置事务属性,比如read-write和隔离级等。
显式游标
当查询返回结果超过一行时,就需要一个显式游标,此时用户不能使用select into语句。PL/SQL管理隐式游标,当查询开始时隐式游标打开,查询结束时隐式游标自动关闭。显式游标在PL/SQL块的声明部分声明,在执行部分或异常处理部分打开,取数据,关闭。下表显示了显式游标和隐式游标的差别:
表1 隐式游标和显式游标
隐式游标显式游标 PL/SQL维护,当执行查询时自动打开和关闭在程序中显式定义、打开、关闭,游标有一个名字。 游标属性前缀是SQL游标属性的前缀是游标名 属性%ISOPEN总是为FALSE%ISOPEN根据游标的状态确定值 SELECT语句带有INTO子串,只有一行数据被处理可以处理多行数据,在程序中设置循环,取出每一行数据。使用游标
这里要做一个声明,我们所说的游标通常是指显式游标,因此从现在起没有特别指明的情况,我们所说的游标都是指显式游标。要在程序中使用游标,必须首先声明游标。
声明游标
语法:
CURSOR cursor_name IS select_statement;
在PL/SQL中游标名是一个未声明变量,不能给游标名赋值或用于表达式中。
例:
DELCARE
CURSOR C_EMP IS SELECT empno,ename,salary
FROM emp
WHERE salary>2000
ORDER BY ename;
........
BEGIN
在游标定义中SELECT语句中不一定非要表可以是视图,也可以从多个表或视图中选择的列,甚至可以使用*来选择所有的列 。
打开游标
使用游标中的值之前应该首先打开游标,打开游标初始化查询处理。打开游标的语法是:
OPEN cursor_name
cursor_name是在声明部分定义的游标名。
例:
OPEN C_EMP;
关闭游标
语法:
CLOSE cursor_name
例:
CLOSE C_EMP;
从游标提取数据
从游标得到一行数据使用FETCH命令。每一次提取数据后,游标都指向结果集的下一行。语法如下:
FETCH cursor_name INTO variable[,variable,...]
对于SELECT定义的游标的每一列,FETCH变量列表都应该有一个变量与之相对应,变量的类型也要相同。
例:
SET SERVERIUTPUT ON
DECLARE
v_ename EMP.ENAME%TYPE;
v_salary EMP.SALARY%TYPE;
CURSOR c_emp IS SELECT ename,salary FROM emp;
BEGIN
OPEN c_emp;
FETCH c_emp INTO v_ename,v_salary;
DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename
||'is'|| v_salary);
FETCH c_emp INTO v_ename,v_salary;
DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename
||'is'|| v_salary);
FETCH c_emp INTO v_ename,v_salary;
DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename
||'is'|| v_salary);
CLOSE c_emp;
END
这段代码无疑是非常麻烦的,如果有多行返回结果,可以使用循环并用游标属性为结束循环的条件,以这种方式提取数据,程序的可读性和简洁性都大为提高,下面我们使用循环重新写上面的程序:
SET SERVERIUTPUT ON
DECLARE
v_ename EMP.ENAME%TYPE;
v_salary EMP.SALARY%TYPE;
CURSOR c_emp IS SELECT ename,salary FROM emp;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO v_ename,v_salary;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename
||'is'|| v_salary);
END
记录变量
定义一个记录变量使用TYPE命令和%ROWTYPE,关于%ROWsTYPE的更多信息请参阅相关资料,
记录变量用于从游标中提取数据行,当游标选择很多列的时候,那么使用记录比为每列声明一个变量要方便得多。---www.bianceng.cn
当在表上使用%ROWTYPE并将从游标中取出的值放入记录中时,如果要选择表中所有列,那么在SELECT子句中使用*比将所有列名列出来要安全得多。
例:
SET SERVERIUTPUT ON
DECLARE
R_emp EMP%ROWTYPE;
CURSOR c_emp IS SELECT * FROM emp;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO r_emp;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUT.PUT.PUT_LINE('Salary of Employee'||r_emp.ename||'is'|| r_emp.salary);
END LOOP;
CLOSE c_emp;
END;
%ROWTYPE也可以用游标名来定义,这样的话就必须要首先声明游标:
SET SERVERIUTPUT ON
DECLARE
CURSOR c_emp IS SELECT ename,salary FROM emp;
R_emp c_emp%ROWTYPE;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO r_emp;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUT.PUT.PUT_LINE('Salary of Employee'||r_emp.ename||'is'|| r_emp.salary);
END LOOP;
CLOSE c_emp;
END;
带参数的游标
与存储过程和函数相似,可以将参数传递给游标并在查询中使用。这对于处理在某种条件下打开游标的情况非常有用。它的语法如下:
CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement;
定义参数的语法如下:
Parameter_name [IN] data_type[{:=|DEFAULT} value]
与存储过程不同的是,游标只能接受传递的值,而不能返回值。参数只定义数据类型,没有大小。
另外可以给参数设定一个缺省值,当没有参数值传递给游标时,就使用缺省值。游标中定义的参数只是一个占位符,在别处引用该参数不一定可靠。
在打开游标时给参数赋值,语法如下:
OPEN cursor_name[value[,value]....];
参数值可以是文字或变量。
例:
DECALRE
CURSOR c_dept IS SELECT * FROM dept ORDER BY deptno;
CURSOR c_emp (p_dept VARACHAR2) IS
SELECT ename,salary
FROM emp
WHERE deptno=p_dept
ORDER BY ename
r_dept DEPT%ROWTYPE;
v_ename EMP.ENAME%TYPE;
v_salary EMP.SALARY%TYPE;
v_tot_salary EMP.SALARY%TYPE;
BEGIN
OPEN c_dept;
LOOP
FETCH c_dept INTO r_dept;
EXIT WHEN c_dept%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Department:'|| r_dept.deptno||'-'||r_dept.dname);
v_tot_salary:=0;
OPEN c_emp(r_dept.deptno);
LOOP
FETCH c_emp INTO v_ename,v_salary;
EXIT WHEN c_emp%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Name:'|| v_ename||' salary:'||v_salary);
v_tot_salary:=v_tot_salary+v_salary;
END LOOP;
CLOSE c_emp;
DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:'|| v_tot_salary);
END LOOP;
CLOSE c_dept;
END;
游标FOR循环
在大多数时候我们在设计程序的时候都遵循下面的步骤:
1、打开游标
2、开始循环
3、从游标中取值
4、检查那一行被返回
5、处理
6、关闭循环
7、关闭游标
可以简单的把这一类代码称为游标用于循环。但还有一种循环与这种类型不相同,这就是FOR循环,用于FOR循环的游标按照正常的声明方式声明,它的优点在于不需要显式的打开、关闭、取数据,测试数据的存在、定义存放数据的变量等等。游标FOR 循环的语法如下:
FOR record_name IN
(corsor_name[(parameter[,parameter]...)]
| (query_difinition)
LOOP
statements
END LOOP;
下面我们用for循环重写上面的例子:
DECALRE
CURSOR c_dept IS SELECT deptno,dname FROM dept ORDER BY deptno;
CURSOR c_emp (p_dept VARACHAR2) IS
SELECT ename,salary
FROM emp
WHERE deptno=p_dept
ORDER BY ename
v_tot_salary EMP.SALARY%TYPE;
BEGIN
FOR r_dept IN c_dept LOOP
DBMS_OUTPUT.PUT_LINE('Department:'|| r_dept.deptno||'-'||r_dept.dname);
v_tot_salary:=0;
FOR r_emp IN c_emp(r_dept.deptno) LOOP
DBMS_OUTPUT.PUT_LINE('Name:'|| v_ename||' salary:'||v_salary);
v_tot_salary:=v_tot_salary+v_salary;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:'|| v_tot_salary);
END LOOP;
END;
在游标FOR循环中使用查询
在游标FOR循环中可以定义查询,由于没有显式声明所以游标没有名字,记录名通过游标查询来定义。
DECALRE
v_tot_salary EMP.SALARY%TYPE;
BEGIN
FOR r_dept IN (SELECT deptno,dname FROM dept ORDER BY deptno) LOOP
DBMS_OUTPUT.PUT_LINE('Department:'|| r_dept.deptno||'-'||r_dept.dname);
v_tot_salary:=0;
FOR r_emp IN (SELECT ename,salary
FROM emp
WHERE deptno=p_dept
ORDER BY ename) LOOP
DBMS_OUTPUT.PUT_LINE('Name:'|| v_ename||' salary:'||v_salary);
v_tot_salary:=v_tot_salary+v_salary;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:'|| v_tot_salary);
END LOOP;
END;
游标中的子查询
语法如下:
CURSOR C1 IS SELECT * FROM emp
WHERE deptno NOT IN (SELECT deptno
FROM dept
WHERE dname!='ACCOUNTING');
可以看出与SQL中的子查询没有什么区别。
游标中的更新和删除
在PL/SQL中依然可以使用UPDATE和DELETE语句更新或删除数据行。显式游标只有在需要获得多行数据的情况下使用。PL/SQL提供了仅仅使用游标就可以执行删除或更新记录的方法。
UPDATE或DELETE语句中的WHERE CURRENT OF子串专门处理要执行UPDATE或DELETE操作的表中取出的最近的数据。要使用这个方法,在声明游标时必须使用FOR UPDATE子串,当对话使用FOR UPDATE子串打开一个游标时,所有返回集中的数据行都将处于行级(ROW-LEVEL)独占式锁定,其他对象只能查询这些数据行,不能进行UPDATE、DELETE或SELECT...FOR UPDATE操作。
语法:
FOR UPDATE [OF [schema.]table.column[,[schema.]table.column]..
[nowait]
在多表查询中,使用OF子句来锁定特定的表,如果忽略了OF子句,那么所有表中选择的数据行都将被锁定。如果这些数据行已经被其他会话锁定,那么正常情况下ORACLE将等待,直到数据行解锁。
在UPDATE和DELETE中使用WHERE CURRENT OF子串的语法如下:
WHERE{CURRENT OF cursor_name|search_condition}
例:
DELCARE
CURSOR c1 IS SELECT empno,salary
FROM emp
WHERE comm IS NULL
FOR UPDATE OF comm;
v_comm NUMBER(10,2);
BEGIN
FOR r1 IN c1 LOOP
IF r1.salary<500 THEN
v_comm:=r1.salary*0.25;
ELSEIF r1.salary<1000 THEN
v_comm:=r1.salary*0.20;
ELSEIF r1.salary<3000 THEN
v_comm:=r1.salary*0.15;
ELSE
v_comm:=r1.salary*0.12;
END IF;
UPDATE emp;
SET comm=v_comm
WHERE CURRENT OF c1l;
END LOOP;
END
篇3:游标代码举例数据库教程
游标
1.对低于当前平均价格的书,均提价50%
2对于高于或等于当前平均价格的书,均降价25%
代码如下:
declare title_update cursor
for select title_id,price from titles
for update
go
局部变量
declare @avg_price money,@title_id tid,@price money
open title_update
begin tran
计算平均书价
select @avg_price=avg(price) from titles holdlock
fetch title_update into @title_id,@price
while @@sqlstatus!=2
begin
if @@sqlstatus=1
begin
rollback tran
raiserror 21001 ”Fetch failed in cursor“
close title_update
deallocate cursor title_update
return
end
if @price<@avg_price
提价50%
update titles set price = price * $1.50
where current of title_update
else
降价25%
update titles set price = price * $.75
where current of title_update
if @@error!=0
begin
rollback tran
raiserror 22001 ”Update failed“
close title_update
deallocate cursor title_update
return
end
fetch title_update into @title_id,@price
end
commit
close title_update
deallocate cursor title_update
go
篇4:封装游标存储过程(Prexecsql2)数据库教程
存储过程|封装|游标
使用脚本自己可以执行自己的特性,封装游标操作存储过程如下:
CREATE PROCEDURE Pr_ExecSQL2
@Asqlstring VARCHAR(8000) --输入的SQL语句
AS
EXEC ('
--启动事务
BEGIN TRAN
DECLARE @ASql VARCHAR(8000)
DECLARE tnames_cursor CURSOR LOCAL FAST_FORWARD FOR '+ @asqlstring +'
OPEN tnames_cursor
FETCH NEXT FROM tnames_cursor INTO @ASql
WHILE (@@FETCH_STATUS=0)
BEGIN
print @ASql
EXEC (@ASql)
IF @@ERROR 0 GOTO FINALEXIT
FETCH NEXT FROM tnames_cursor INTO @ASql
END
CLOSE tnames_cursor
DEALLOCATE tnames_cursor
COMMIT TRAN
RETURN
FINALEXIT:
ROLLBACK TRAN
CLOSE tnames_cursor
DEALLOCATE tnames_cursor
')
使用方法:
declare @sql varchar(8000)
set @sql='select ''update a set a.a='' + b.a from b '
exec Pr_execsql2 @sql
篇5:什么是游标
1.游标的概念
游标是指向查询结果集的一个指针,它是一个通过定义语句与一条Select语句相关联的一组SQL语句,游标包含两方面的内容:
●游标结果集:执行其中的Select语句所得到的结果集;
●游标位置:一个指向游标结果集内的某一条记录的指针
利用游标可以单独操纵结果集中的每一行。游标在定义以后存在两种状态:关闭和打开。当游标关闭时,其查询结果集不存在;只有当游标打开时,才能按行读取或修改结果集中的数据。
2.使用游标
一个应用程序可以使用两种类型的游标:前端(客户)游标和后端(服务器)游标,它们是两个不同的概念。
无论使用哪一种游标,都需要经过如下几个步骤:
●定义游标
●打开游标
●从游标中操作数据
●关闭游标
下面讲述的是后端(服务器)游标。
(1)定义游标
在使用游标之前必须声明它。声明指定定义游标结果集的查询。通过使用for update或for read only关键词将游标显式定义成可更新的或只读的。
Declare cursor语法为:
For select_statement
[for{read only|update[of colum_name_list]}]
举例:
declare pubs_crsr cursor
for select pub_name,city,state
from publishers
for update of city,state
(2)打开游标
open的语法为:
open 游标名
在声明游标后,必须打开它以便用fetch,update,delete读取、修改、删除行。在打开一个游标后,它将被放在游标结果集的首行前,必须用fetch语句访问该首行。
(3)从游标中读取数据
在声明并打开一个游标后,可用fetch命令从游标结果集中获取数据行。
Fetch的语法为:
Fetch 游标名[into 变量列表]
举例:fetch pub_crsr into @name,@city,@state
SQL Server在每次读取后返回一个状态值,
可用@@sqlstatus访问该值,下表给出了可能的@@sqlstatus值及其意义。
值意 义
0Fetch语句成功
1Fetch语句导致一错误
2结果集没有更多的数据,当前位置位于结果集最后一行,而客户对该游标仍发出Fetch语句时。
若游标是可更新的,可用update和delete语句来更新和删除行。
删除游标当前行的语法为:
delete[from]表名
where current of 游标名
举例:delete from authors where current of authors_crsr
当游标删除一行后,SQL Server将游标置于被删除行的前一行上。
更新游标当前行的语法为:
update 表名
set column_name1={expression1|NULL|(select_statement)}
[,column_name2={expression2|NULL|(select_statement)}
[……]
where current of 游标名
举例:
update publishers
set city=”asadena”,state=”CA”
where current of pubs_crsr
(4)关闭游标
当结束一个游标结果集时,可用close关闭。该语法为:
close 游标名
关闭游标并不改变其定义,可用open再次打开。若想放弃游标,必须使用deallocate释放它,deallocater的语法为:
deallocater cursor 游标名
deallocater语句通知SQL Server释放Declare语句使用的共享内存,不再允许另一进程在其上执行Open操作。
篇6:再看《小鞋子》
再看《小鞋子》
再看《小鞋子》伊朗电影《小鞋子》我看了两遍,每一次看后心里总是百味,不过最多的还是感动。
家境贫寒的男孩阿里(AmirFarrokhHashemian)帮妹妹莎拉(BahareSeddiqi)取修补好的鞋子时,不慎将鞋子弄丢了。为了不让贫困的家庭增加负担,阿里央求莎拉暂时保密,两人协商替换着穿阿里的鞋子上学。阿里答应帮妹妹买一双新鞋子……故事就围绕鞋子展开了。莎拉穿着阿里大鞋子跑着回家把鞋子还给阿里,阿里再跑着去上学,不论阿里怎么努力地跑总是迟到,还差点被学校开除,幸好阿里品学兼优深受老师喜爱,才得以继续上学。从这也反映出伊朗还很注意孩子的培养,这个国度的风气还很淳朴。每次迟到,阿里那纯真的眼里总满含泪水,在他服里有深深地自责和无奈。阿里,他还是一个孩子,就已经独自承受着贫穷的压力,为了不让父亲为难,他一直在努力着,当看着阿里跑过一条条巷子,风景从身边一闪而过,心里总在为他默默加油,也被他的坚强感染着。
莎拉无意中发现了她的鞋子正穿在一位小姑娘脚上,那时候她应该很开心,似乎看到了她可以结束提心吊胆地穿着大鞋子去上学,也可以摆脱一路奔跑的日子了,但当她和阿里来到那小姑娘家门时,发现那小姑娘的父亲是盲人,他们打消了要回鞋子的念头。这时人性善良的光芒笼罩着他们无言的放弃,变得不平凡起来,放弃自己最需要的东西,只因为别人也需要。我试着慢慢放开手中的气球,看它飞上天空,摇曳而去,心中还是无比难舍,我真无法用语言描述那种伟大,那种平凡的高贵。也正是这样的善良,莎拉才找回了失而复得金属铅笔,当她的视线落在那双本属于她的小皮鞋时,她知道眼前的女孩正是那个盲人的孩子,她轻轻地笑了,在心里无比甜蜜。这正是导演马吉德・马吉迪的高明之处,从细微的角度剖析人生,把善良抬升到一个新的高度,在贫穷的尘埃里,人们依旧可以看到,感受到真心的温暖。他在呼吁善良,在给人们一双发现善良的眼睛。
就在兄妹俩为了鞋子的事苦恼时,生活又给了他们希望:父亲将带上阿里用教父给的园林护理工具去外面寻找工作赚钱。路上烈日炎炎,一路艰辛,终于到了富人居住区,从这也可以看出当时社会的贫富差距有多大。父亲按响门铃后却不知要说什么,显得惊慌失措,这时阿里挺身而出,说出了他们到来的目的,终于他们接到生意了。阿里陪着雇主家孩子玩耍,父亲兢兢业业地工作。最后雇主给了父亲丰厚的'报酬,阿里最后留恋地看了那孩子,眼中有朴质的友情,也许有丝丝羡慕,当生活教会他成熟,勇敢地面对现实。现实有时候稍微有些残酷。父亲由于兴奋过度,骑车速度过快,他们撞在树上,获得的报酬也化为乌有,原本以为可以劝父亲为妹妹买双新鞋的梦想也随之破灭。也许正是这样的一波一波的麻烦,让阿里必须面对最后一次机会。
在阿里再三请求下,体育老师才让早已错过报名时间的阿里参加马拉松比赛,这次比赛的二等奖是一双运动鞋。是的,阿里是为那双鞋而苦苦哀求参赛的。
比赛的时候,阿里很孤独,他们没有父母加油,也没有认识的人,他只有一个目的,获得第二名。在比赛快结束时,他快坚持不住了,一个孩子把他推翻在地,他没来得及揉一揉,就爆发出最后的力量,向前冲刺。整个画面放慢了速度,只有阿里气喘吁吁的声音,让人无不揪心,“快跑!加油!”心也呐喊着,为这个虽贫困却坚强的男孩加油。当阿里知道自己是第一名的时候流下了泪水,在周围愉悦的气氛中他显得很不和谐,没有喜悦,只有悔恨和无奈。他不该得第一?那双球鞋与他错身而过,妹妹莎拉还在盼他回家给她带回鞋子。
阿里回到家,迎上妹妹失望的眼神,他没有解释,只有抽动的嘴角,曾挂着泪水,脱下早已破得不成样子的鞋子,把满是血泡的双脚泡在水池里,游鱼轻吻他的脚,似在安慰,似在述说同情。阿里低着头……
这部电影没有奢华的场面,只有真实的街道;也没有浮夸的情节,只有浅浅而深深的情感。但从中我看到了人性的真实,看到一些充满在生活中却不易察觉的美,那是善良,是担当,是纯朴,是坚持……
生活就是这样。
篇7:游标和动态SQL
游标类别:静态游标(指在编译的时候,游标就与一个select语句进行了静态绑定的游标,这种游标只能作用于一个查询语句)和动态游标(就是希望我们的查询语句在运行的时候才跟游标绑定,为了使用动态游标,必须声明游标变量),
动态游标分两种,分别是强类型和弱类型。强类型的动态游标只能支持查询结果与他类型匹配的这种查询语句,弱类型的动态游标可以支持任何的查询语句。
静态游标分为两种,隐式游标和显示游标。显示游标是有用户声明和操作的一种游标。隐式游标是Oracle为所有的数据操作语句自动声明的一种游标。
在每个用户的会话中,我们可以同时打开多个游标,这个数量有数据库初始化参数文件中的OPEN CURSORS这个参数来定义。
显示游标的用法步骤:
1、声明显式游标,语法:CURSOR<游标名>ISSELECT<语句>;语句>游标名>
在声明游标的时候通常还要声明一些变量用来存放查询语句产生的查询结果。声明游标和变量都在declare中的。通常先声明变量,在声明游标。
2、打开游标,从打开游标开始,后面的步骤都是在begin和end中执行的。语法:open<游标名>;当打开游标后查询语句就开始执行了,查询结果放到Oracle的缓冲区中,然后游标指向了这个缓冲区中查询结果的第一行记录之前。游标名>
3、提取游标,通过提取游标,游标依次指向查询结果的每一行。语法:FETCH<游标名>INTO<变量列表>;变量列表>游标名>
4、关闭游标,语法:CLOSE<游标名>;游标名>
示例:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
declare
name varchar2(50); --定义变量存储employees表中的内容。
department_name varchar2(20); --定义变量存储departments表中的内容;
cursor emp_cur IS --定义游标emp_cur
select name,department_name --选出所有员工的姓名和所做部门。
from employees e,departments d
where e.department_id=d.department_id;
begin
open emp_cur; --打开游标
LOOP
FETCH emp_cur INTO name,depart_name; --将第一行数据放入变量中,游标后移,
EXIT WHEN emp_cur%NOTFOUND;
dbms_output.put_line(name||’在’||department_name);
END LOOP;
CLOSE emp_cur;
END;
游标的属性:%ISOPEN,游标是否打开;%FOUND,游标是否指向有效行;%NOTFOUND,游标是否没有指向有效行;%ROWCOUNT,游标抽取过的行数。语法:游标名%属性名。
例如:公司上市,决定给员工提高薪资,入职时间超过1年涨100,1000元封顶。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
declare
hire_date date; --存放员工入职日期
e_id number; --存放员工id
cursor emp_cur is --定义游标
select id,hire_date from employees;
begin
open emp_cur; --打开游标
loop
fetch emp_cur into e_id,hire_date --将数据逐条存入变量
exit when emp_cur%NOTFOUND;
if 100*(2014-to_char(hire_date,’yyyy’))<1000 then
update salary setsalaryvalue=salaryvalue+100*(2010-to_char(hire_date,’yyyy’)) where employee.id=e_id;
else
update salary setsalaryvalue=salaryvalue+1000 where employee.id=e_id;
end if;
end loop;
close emp_cur;
end
篇8:再看社戏抒情散文
再看社戏抒情散文
还是在书本上读过鲁迅先生的《社戏》,印象里,鲁迅先生的社戏很是热闹,我自己看到的却是给了我另外一种味道。
许是距离鲁迅先生的《社戏》时间太久远了,一种简单的文化层次,却少有人欣赏了。能近距离的欣赏真正的社戏艺术,还是在上个月的月初。我和一帮摄影的朋友驱车到了北京市昌平区长峪城村,一个远离城市喧嚣的山村,也就是在这,我欣赏了一场社戏。
长峪城,一个很古老的小村庄,说她小,是因为村里只有二百多户人家,说她古老,是存在的时间比较长远。长峪城,坐落于半山腰上,村口一个高高的城门楼,凸显着这个小村庄的历史的悠久。一群人行走于村内,只看到几个年龄稍大的老人,偶尔有几个孩童经过身边。问了问村里的老人,年轻人都出山打工了,留下来的`也就是走不动的老人还有孩子了。
说到社戏的地址,就在长峪城村的永兴寺,寺庙门前的大树在诉说着寺庙的沧桑。戏台搭在了寺庙正中央,戏台搭建的历史已是久远,但是却很简陋。我也是第一次进入戏台的后院,暂且称为化妆间,这化妆间和表演的前台只有一薄薄的墙壁相隔。化妆间的桌子上摆着几样简单的化妆工具,墙壁上挂满了戏剧所用的行头和服装,只是看起来有些陈旧,行头上落满了一层灰尘,貌似很长时间没有用过了。舞台顶部的房沿上,还在张贴着欢庆元宵佳节的白纸,只是元宵节已过了半年的时间,写字的白纸透着微微的灰黄。
观看的是一场赵匡胤救母的戏。一位年近五旬的大妈在给各位演员涂抹着水粉胭脂,那厚厚的水粉竟也掩盖了几位老者的年龄。一个个简单的妆饰,却也花费了很长的时间,可见几位老者对这次表演的认真。听着几位老者字正腔圆的表演,看着几位老者随着唢呐喇叭身体的旋转,我的眼睛有某种液体滑落。
台下的观众除了旅游团的几人,村里的几位老者,就剩下我和几位朋友了。我没看到鲁迅先生笔下社戏的繁华,也没听到戏曲表演老者欢快的步伐。我看到的听到的,似乎只剩下了沉重的叹息,这叹息里,有对社戏的尊重和无奈。
如果让我对这场社戏做一评价,暂且拿戏台两侧木桩上的对联做为对表演者的尊敬吧:你看我非我我看我我也非我,谁像谁谁装谁谁就像谁。
篇9:再看《西游记》作文
再看《西游记》作文
这个寒假实在太无聊了,我几乎都是坐在电视前度过的。放寒假后的十来天,我又和平常一样,打开电视。我一看,是孙悟空,就知道又是西游记。也不知怎么回事,就看起来了。
这次看的感觉和已前的不同了。以前看西游记,只看那些打斗场面,从不看细节,所以,看了也不了解人物什么感想,更别说感同身受了,看了和没看一样。
可现在不同了,长大了,理解能力强了,看的时候,有一种身临其境的'感觉,仿佛我就是那孙悟空,调皮捣蛋性子倔、英勇无畏正气重、大闹天本领强、有情有义真英雄。经历九九八十一难,取得真经,修成正果。
我也清楚了此时人物的心情,就拿今天演的《三打白骨精》说吧。
这一集在这部“西游记”中算是脍炙人口、老少皆宜的一集了,受到了中国很多小朋友的喜爱,我们就说说这一集。
一开场,就来到白骨精的洞穴,这儿阴森恐怖,到处都是骷髅,演员特意显出一副邪恶、狡猾的嘴脸,表现了白骨精的妖精本性。后来,得知唐僧来了,白骨精杀了三个人好照他们的模样变化出来骗唐僧,这里更加显露出妖怪那狡诈、阴险的一面。她先是变成了三人中的一个女子,使障眼法把蛤蟆和石头变成饭菜,送去给唐僧。八戒一见是美女,毫无防备之心,接过饭菜就打算吃,这儿演员用大量的表情演出了八戒的花心。孙悟空看见了,一棍子把她打“死”了。白骨精不服,又变成了三人中其余两人,也一一被孙悟空识破了。但这一切在唐僧的眼里都是罪孽,所以,他三番五次的念紧箍咒。白骨精知道了,假装观世音菩萨,写了一张退除书,唐僧还真信了。
这一集,充分体现了妖精的阴险、狡诈,也体现出了孙悟空的冲动和唐僧的不了解清楚就主观的判断。
再看西游记,我又从另一个角度理解它,有了不的看法,这就叫“温故而知新”。
再看数据库――(7)游标(整理9篇)




