Oracle游标使用方法及语法大全
更新时间:2024-06-03 12:55:01 阅读量: 综合文库 文档下载
Oracle游标使用方法及语法大全
当查询返回结果超过一行时,就需要一个显式游标,此时用户不能使用select into语句。PL/SQL管理隐式游标,当查询开始时隐式游标打开,查询结束时隐式游标自动关闭。显式游标在PL/SQL块的声明部分声明,在执行部分或异常处理部分打开,取出数据,关闭。 使用游标语法:
例:
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_output.put_line(\\’Salary of Employee\\’||r_emp.ename||\\’is’\\) End loop; Close c_emp; End;
%ROWTYPE也可以用游标名来定义,这样的话就必须要首先声明游标:
For record_name IN(corsor_name[(parameter[,parameter]…)] |(query_difinition) loop Statements End loop;
下面我们用for循环重写上面的例子:
在游标FOR循环中使用查询
在游标FOR循环中可以定义查询,由于没有显式声明所以游标没有名字,记录名通过游标查询来定义。
游标中的子查询 语法如下:
可以看出与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操作。
语法:
在多表查询中,使用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 c1;
END LOOP; END
=====================================================
oracle 隐式游标,显示游标,游标循环 动态SELECT语句和动态游标,异常处理,自定义异常
游标的概念:
游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计
EXCEPTION
WHEN 错误1[OR 错误2] THEN 语句序列1;
WHEN 错误3[OR 错误4] THEN 语句序列2; WHEN OTHERS 语句序列n; END; 其中:
错误是在标准包中由系统预定义的标准错误,或是由用户在程序的说明部分自定义的错误,参见下一节系统预定义的错误类型。 语句序列就是不同分支的错误处理部分。
凡是出现在WHEN后面的错误都是可以捕捉到的错误,其他未被捕捉到的错误,将在WHEN OTHERS部分进行统一处理,OTHENS必须是EXCEPTION部分的最后一个错误处理分支。如要在该分支中进一步判断错误种类,可以通过使用预定义函数SQLCODE( )和SQLERRM( )来获得系统错误号和错误信息。
如果在程序的子块中发生了错误,但子块没有错误处理部分,则错误会传递到主程序中。 下面是由于查询编号错误而引起系统预定义异常的例子。 【训练1】 查询编号为1234的雇员名字。 Sql代码
1. SET SERVEROUTPUT ON 2. DECLARE
3. v_name VARCHAR2(10); 4. BEGIN 5. 6. 7. 8.
SELECT ename INTO v_name FROM emp
WHERE empno = 1234;
9. DBMS_OUTPUT.PUT_LINE('该雇员名字为:'|| v_name);
10. EXCEPTION
11. WHEN NO_DATA_FOUND THEN
12. DBMS_OUTPUT.PUT_LINE('编号错误,没有找到相应雇员!'); 13. WHEN OTHERS THEN
14. DBMS_OUTPUT.PUT_LINE('发生其他错误!'); 15. END;
执行结果为: Sql代码
1. 编号错误,没有找到相应雇员! 2. PL/SQL 过程已成功完成。
说明:在以上查询中,因为编号为1234的雇员不存在,所以将发生类型为“NO_DATA_ FOUND”的异常。“NO_DATA_FOUND”是系统预定义的错误类型,EXCEPTION部分下的WHEN语句将捕捉到该异常,并执行相应代码部分。在本例中,输出用户自定义的错误信息“编号错误,没有找到相应雇员!”。如果发生其他类型的错误,将执行OTHERS条件下的代码部分,显示“发生其他错误!”。
【训练2】 由程序代码显示系统错误。 Sql代码
1. SET SERVEROUTPUT ON 2. DECLARE
3. v_temp NUMBER(5):=1; 4. BEGIN
5. v_temp:=v_temp/0; 6. EXCEPTION
7. WHEN OTHERS THEN
8. DBMS_OUTPUT.PUT_LINE('发生系统错误!');
9. DBMS_OUTPUT.PUT_LINE('错误代码:'|| SQLCODE( )); 10. DBMS_OUTPUT.PUT_LINE('错误信息:' ||SQLERRM( )); 11. END;
执行结果为: Sql代码
1. 发生系统错误!
2. 错误代码:?1476
3. 错误信息:ORA-01476: 除数为 0 4. PL/SQL 过程已成功完成。
说明:程序运行中发生除零错误,由WHEN OTHERS捕捉到,执行用户自己的输出语句显示错误信息,然后正常结束。在错误处理部分使用了预定义函数SQLCODE( )和SQLERRM( )来进一步获得错误的代码和种类信息。
预定义错误
Oracle的系统错误很多,但只有一部分常见错误在标准包中予以定义。定义的错误可以在EXCEPTION部分通过标准的错误名来进行判断,并进行异常处理。常见的系统预定义异常如下所示。 Sql代码
1. 错 误 名 称 错误代码 错 误 含 义
2. CURSOR_ALREADY_OPEN ORA_06511 试图打开已经打开的游标 3. INVALID_CURSOR ORA_01001 试图使用没有打开的游标
4. DUP_VAL_ON_INDEX ORA_00001 保存重复值到惟一索引约束的列中 5. ZERO_DIVIDE ORA_01476 发生除数为零的除法错误
6. INVALID_NUMBER ORA_01722 试图对无效字符进行数值转换
7. ROWTYPE_MISMATCH ORA_06504 主变量和游标的类型不兼容 8. VALUE_ERROR ORA_06502 转换、截断或算术运算发生错误
9. TOO_MANY_ROWS ORA_01422 SELECT?INTO?语句返回多于一行的数据 10. NO_DATA_FOUND ORA_01403 SELECT?INTO?语句没有数据返回 11. TIMEOUT_ON_RESOURCE ORA_00051 等待资源时发生超时错误 12. TRANSACTION_BACKED_OUT ORA_00060 由于死锁,提交失败 13. STORAGE_ERROR ORA_06500 发生内存错误
14. PROGRAM_ERROR ORA_06501 发生PL/SQL内部错误 15. NOT_LOGGED_ON ORA_01012 试图操作未连接的数据库 16. LOGIN_DENIED ORA_01017 在连接时提供了无效用户名或口令
比如,如果程序向表的主键列插入重复值,则将发生DUP_VAL_ON_INDEX错误。 如果一个系统错误没有在标准包中定义,则需要在说明部分定义,语法如下: 错误名 EXCEPTION;
定义后使用PRAGMA EXCEPTION_INIT来将一个定义的错误同一个特别的Oracle错误代码相关联,就可以同系统预定义的错误一样使用了。语法如下: PRAGMA EXCEPTION_INIT(错误名,- 错误代码); 【训练1】 定义新的系统错误类型。 Sql代码
1. SET SERVEROUTPUT ON 2. DECLARE
3. V_ENAME VARCHAR2(10); 4. 5. 6. 7.
NULL_INSERT_ERROR EXCEPTION;
PRAGMA EXCEPTION_INIT(NULL_INSERT_ERROR,-1400); BEGIN
INSERT INTO EMP(EMPNO) VALUES(NULL);
8. EXCEPTION
9. WHEN NULL_INSERT_ERROR THEN
10. DBMS_OUTPUT.PUT_LINE('无法插入NULL值!'); 11. WHEN OTHERS THEN
12. DBMS_OUTPUT.PUT_LINE('发生其他系统错误!'); 13. END;
执行结果为: Sql代码
1. 无法插入NULL值!
2. PL/SQL 过程已成功完成。
说明:NULL_INSERT_ERROR是自定义异常,同系统错误1400相关联。
自定义异常
程序设计者可以利用引发异常的机制来进行程序设计,自己定义异常类型。可以在声明部分定义新的异常类型,定义的语法是: 错误名 EXCEPTION;
用户定义的错误不能由系统来触发,必须由程序显式地触发,触发的语法是:
RAISE 错误名;
RAISE也可以用来引发模拟系统错误,比如,RAISE ZERO_DIVIDE将引发模拟的除零错误。 使用RAISE_APPLICATION_ERROR函数也可以引发异常。该函数要传递两个参数,第一个是用户自定义的错误编号,第二个参数是用户自定义的错误信息。使用该函数引发的异常的编号应该在20 000和20 999之间选择。 自定义异常处理错误的方式同前。
【训练1】 插入新雇员,限定插入雇员的编号在7000~8000之间。 Java代码
1. SET SERVEROUTPUT ON
2. DECLARE
3. new_no NUMBER(10); 4. new_excp1 EXCEPTION; 5. new_excp2 EXCEPTION; 6. BEGIN
7. new_no:=6789;
8. INSERT INTO emp(empno,ename) 9. VALUES(new_no, '小郑'); 10. IF new_no<7000 THEN 11. RAISE new_excp1; 12. END IF;
13. IF new_no>8000 THEN 14. RAISE new_excp2; 15. END IF; 16. COMMIT;
17. EXCEPTION
18. WHEN new_excp1 THEN 19. ROLLBACK;
20. DBMS_OUTPUT.PUT_LINE('雇员编号小于7000的下限!'); 21. WHEN new_excp2 THEN 22. ROLLBACK;
23. DBMS_OUTPUT.PUT_LINE('雇员编号超过8000的上限!'); 24. END;
执行结果为:
雇员编号小于7000的下限! PL/SQL 过程已成功完成。
说明:在此例中,自定义了两个异常:new_excp1和new_excp2,分别代表编号小于7000和编号大于8000的错误。在程序中通过判断编号大小,产生对应的异常,并在异常处理部
分回退插入操作,然后显示相应的错误信息。
【训练2】 使用RAISE_APPLICATION_ERROR函数引发系统异常。 Sql代码
1. SET SERVEROUTPUT ON 2. DECLARE
3. New_no NUMBER(10); 4. BEGIN
5. New_no:=6789;
6. INSERT INTO emp(empno,ename) 7. VALUES(new_no, 'JAMES');
8. IF new_no<7000 THEN 9. ROLLBACK;
10. RAISE_APPLICATION_ERROR(-20001, '编号小于7000的下限!'); 11. END IF;
12. IF new_no>8000 THEN
13. ROLLBACK;
14. RAISE_APPLICATION_ERROR (-20002, '编号大于8000的下限!'); 15. END IF; 16. END;
执行结果为: Sql代码
1. DECLARE 2. *
3. ERROR 位于第 1 行:
4. ORA-20001: 编号小于7000的下限! 5. ORA-06512: 在line 9
说明:在本训练中,使用RAISE_APPLICATION_ERROR引发自定义异常,并以系统错误的方式进行显示。错误编号为20001和20002。
注意:同上一个训练比较,此种方法不需要事先定义异常,可直接引发。
可以参考下面的程序片断将出错信息记录到表中,其中,errors为记录错误信息的表,SQLCODE为发生异常的错误编号,SQLERRM为发生异常的错误信息。 DECLARE
v_error_code NUMBER;
v_error_message VARCHAR2(255); BEGIN ...
EXCEPTION ...
WHEN OTHERS THEN
v_error_code := SQLCODE ;
v_error_message := SQLERRM ; INSERT INTO errors
VALUES(v_error_code, v_error_message); END;
【练习1】修改雇员的工资,通过引发异常控制修改范围在600~6000之间。 阶段训练
【训练1】 将雇员从一个表复制到另一个表。 步骤1:创建一个结构同EMP表一样的新表EMP1:
CREATE TABLE emp1 AS SELECT * FROM SCOTT.EMP WHERE 1=2; 步骤2:通过指定雇员编号,将雇员由EMP表移动到EMP1表: Sql代码
1. SET SERVEROUTPUT ON 2. DECLARE
3. v_empno NUMBER(5):=7788; 4. emp_rec emp%ROWTYPE; 5. BEGIN
6. SELECT * INTO emp_rec FROM emp WHERE empno=v_empno; 7. DELETE FROM emp WHERE empno=v_empno; 8. INSERT INTO emp1 VALUES emp_rec; 9. IF SQL%FOUND THEN 10. COMMIT;
11. DBMS_OUTPUT.PUT_LINE('雇员复制成功!'); 12. ELSE
13. ROLLBACK;
14. DBMS_OUTPUT.PUT_LINE('雇员复制失败!'); 15. END IF; 16. END;
执行结果为: 雇员复制成功!
PL/SQL 过程已成功完成。
步骤2:显示复制结果:
SELECT empno,ename,job FROM emp1; 执行结果为: Sql代码
1. EMPNO ENAME JOB
2. ------------- -------------- ---------------- 3. 7788 SCOTT ANALYST
说明:emp_rec变量是根据emp表定义的记录变量,SELECT...INTO...语句将整个记录传给该变量。INSERT语句将整个记录变量插入emp1表,如果插入成功(SQL%FOUND为真),则提交事务,否则回滚撤销事务。试修改雇员编号为7902,重新执行以上程序。 【训练2】 输出雇员工资,雇员工资用不同高度的*表示。 输入并执行以下程序: Sql代码
1. SET SERVEROUTPUT ON 2. BEGIN
3. FOR re IN (SELECT ename,sal FROM EMP) LOOP
4. DBMS_OUTPUT.PUT_LINE(rpad(re.ename,12,' ')||rpad('*',re.sal/100,'*'));
5. END LOOP; 6. END;
输出结果为: Sql代码
1. SMITH ********
2. ALLEN **************** 3. WARD *************
4. JONES ****************************** 5. MARTIN *************
6. BLAKE *****************************
7. CLARK *****************************
8. SCOTT ******************************
9. KING ************************************************** 10. TURNER *************** 11. ADAMS *********** 12. JAMES **********
13. FORD ****************************** 14. MILLER ************* 15. 执行结果为:
16. PL/SQL 过程已成功完成。
说明:第一个rpad函数产生对齐效果,第二个rpad函数根据工资额产生不同数目的*。该程序采用了隐式的简略游标循环形式。
【训练3】 编写程序,格式化输出部门信息。 输入并执行如下程序: Sql代码:
1. SET SERVEROUTPUT ON
2. DECLARE 3. 4. 5. 6.
v_count number:=0;
CURSOR dept_cursor IS SELECT * FROM dept; BEGIN
DBMS_OUTPUT.PUT_LINE('部门列表');
7. DBMS_OUTPUT.PUT_LINE('---------------------------------'); 8. FOR Dept_record IN dept_cursor LOOP
9. DBMS_OUTPUT.PUT_LINE('部门编号:'|| Dept_record.deptno); 10. DBMS_OUTPUT.PUT_LINE('部门名称:'|| Dept_record.dname); 11. DBMS_OUTPUT.PUT_LINE('所在城市:'|| Dept_record.loc); 12. DBMS_OUTPUT.PUT_LINE('---------------------------------'); 13. v_count:= v_count+1;
14. END LOOP;
15. DBMS_OUTPUT.PUT_LINE('共有'||to_char(v_count)||'个部门!'); 16. END;
输出结果为: Sql代码
1. 部门列表
2. ------------------------------------ 3. 部门编号:10
4. 部门名称:ACCOUNTING 5. 所在城市:NEW YORK 6. 7. 8. 9.
------------------------------------ 部门编号:20
部门名称:RESEARCH 所在城市:DALLAS
10. ...
11. 共有4个部门!
12. PL/SQL 过程已成功完成。
说明:该程序中将字段内容垂直排列。V_count变量记录循环次数,即部门个数。 【训练4】 已知每个部门有一个经理,编写程序,统计输出部门名称、部门总人数、总工资和部门经理。
输入并执行如下程序: Sql代码
1. SET SERVEROUTPUT ON 2. DECLARE
3. v_deptno number(8); 4. v_count number(3); 5. v_sumsal number(6);
6. v_dname varchar2(15);
7. v_manager varchar2(15); 8. CURSOR list_cursor IS
9. SELECT deptno,count(*),sum(sal) FROM emp group by deptno; 10. BEGIN
11. OPEN list_cursor;
12. DBMS_OUTPUT.PUT_LINE('----------- 部 门 统 计 表 -----------'); 13. DBMS_OUTPUT.PUT_LINE('部门名称 总人数 总工资 部门经理'); 14. FETCH list_cursor INTO v_deptno,v_count,v_sumsal; 15. WHILE list_cursor%found LOOP 16. SELECT dname INTO v_dname FROM dept 17. WHERE deptno=v_deptno;
18. SELECT ename INTO v_manager FROM emp 19. WHERE deptno=v_deptno and job='MANAGER';
20. DBMS_OUTPUT.PUT_LINE(rpad(v_dname,13)||rpad(to_char(v_count),8) 21. ||rpad(to_char(v_sumsal),9)||v_manager);
22. FETCH list_cursor INTO v_deptno,v_count,v_sumsal; 23. END LOOP;
24. DBMS_OUTPUT.PUT_LINE('--------------------------------------');
25. CLOSE list_cursor; 26. END;
输出结果为: Sql代码
1. -------------------- 部 门 统 计 表 ----------------- 2. 部门名称 总人数 总工资 部门经理 3. ACCOUNTING 3 8750 CLARK 4. 5. 6. 7.
RESEARCH 5 10875 JONES
SALES 6 9400 BLAKE
------------------------------------------------------------- PL/SQL 过程已成功完成。
说明:游标中使用到了起分组功能的SELECT语句,统计出各部门的总人数和总工资。再根据部门编号和职务找到部门的经理。该程序假定每个部门有一个经理。
【训练5】 为雇员增加工资,从工资低的雇员开始,为每个人增加原工资的10%,限定所增加的工资总额为800元,显示增加工资的人数和余额。 输入并调试以下程序: Sql代码
1. SET SERVEROUTPUT ON 2. DECLARE
3. V_NAME CHAR(10); 4. 5. 6. 7.
V_EMPNO NUMBER(5); V_SAL NUMBER(8); V_SAL1 NUMBER(8);
V_TOTAL NUMBER(8) := 800; --增加工资的总额
8. V_NUM NUMBER(5):=0; --增加工资的人数 9. CURSOR emp_cursor IS
10. SELECT EMPNO,ENAME,SAL FROM EMP ORDER BY SAL ASC; 11. BEGIN
12. OPEN emp_cursor;
13. DBMS_OUTPUT.PUT_LINE('姓名 原工资 新工资'); 14. DBMS_OUTPUT.PUT_LINE('---------------------------'); 15. LOOP
16. FETCH emp_cursor INTO V_EMPNO,V_NAME,V_SAL; 17. EXIT WHEN emp_cursor%NOTFOUND; 18. V_SAL1:= V_SAL*0.1;
19. IF V_TOTAL>V_SAL1 THEN
20. V_TOTAL := V_TOTAL - V_SAL1; 21. V_NUM:=V_NUM+1;
22. DBMS_OUTPUT.PUT_LINE(V_NAME||TO_CHAR(V_SAL,'99999')|| 23. TO_CHAR(V_SAL+V_SAL1,'99999'));
24. UPDATE EMP SET SAL=SAL+V_SAL1 25. WHERE EMPNO=V_EMPNO; 26. ELSE
27. DBMS_OUTPUT.PUT_LINE(V_NAME||TO_CHAR(V_SAL,'99999')||TO_CHAR(V_SAL,'99999'));
28. END IF;
29. END LOOP;
30. DBMS_OUTPUT.PUT_LINE('---------------------------'); 31. DBMS_OUTPUT.PUT_LINE('增加工资人数:'||V_NUM||' 剩余工资:'||V_TOTAL);
32. CLOSE emp_cursor; 33. COMMIT; 34. END;
输出结果为: Sql代码
1. 姓名 原工资 新工资
2. --------------------------------------------- 3. SMITH 1289 1418 4. JAMES 1531 1684 5. MARTIN 1664 1830
6. MILLER 1730 1903
s_ip :=sys_context('USERENV','IP_ADDRESS');
delete from sc_print_syn where ip=s_ip and p_id=pd_id; commit;
--下面开始构造查询语句
sql2:='select distinct a.pbom_id from sc_mxk a';
sql3:=' where a.p_id=' || pd_id || ' and a.dept_code= ''' || p_dept_no || '''';
if p_pd_mxb_id >0 then sql2:=sql3 || ',mxk c ';
sql3:=sql3 || ' and c.m_mxb_id= ' || p_pd_mxb_id || ' and a.mxb_id = c.mxb_id'; end if;
if p1 is not null then
sql2:=sql2 || ',sc_p_gx_syn b';
sql3:=sql3 || ' and a.pbom_id=b.pbom_id and b.bz_code = ''' || p1 || ''''; end if;
if p2 is not null then
sql2:=sql2 || ',sc_p_gx_syn b';
sql3:=sql3 || ' and a.pbom_id=b.pbom_id and b.cjjc_code = ''' || p2 || '''';
end if;
if p3 is not null then
sql3:=sql3 || ' and a.warehouse_num = ''' || p3 || ''''; end if;
sql2:=sql2 || sql3;
--打开动态游标,再往下就都一样了 open c1 for sql2; loop
fetch c1 into r_c1; exit when c1%notfound; str1:=''; str2:='';
--打开工序表进行处理 open c2(r_c1.pbom_id); loop fetch c2 into r_c2;
exit when c2%notfound; --没有记录退出 if r_c2.cjjc_name is not null then
str1 :=str1 || to_char(r_c2.cjjc_name); end if;
if r_c2.bz_name is not null then
str2 := str2 || r_c2.bz_name || to_char(r_c2.dd_count); elsif r_c2.gx_name is not null then
str2 := str2 || to_char(r_c2.gx_name) || to_char(r_c2.dd_count); end if;
end loop; close c2;
insert into sc_print_syn(a,b,ip,p_id,r_id) values(str1,str2,s_ip,pd_id,r_c1.pbom_id); COMMIT; end loop; close c1; END mx_print_common;
当然,实现的方法一定很多,甚至可以用隐式游标。但是隐式游标中用动态查询语句也要费一些周折的。 评论:
#re: oracle动态游标的简单实现方法 2008-05-27 09:18 | xzc
----定义
type cursor_type is ref cursor; c1 cursor_type; ----使用
--打开动态游标,再往下就都一样了 open c1 for sql2; loop
fetch c1 into r_c1;
exit when c1%notfound; 回复更多评论
#re: oracle动态游标的简单实现方法 [未登录] 2008-05-27 11:43 | xzc
TYPE cursor_type IS REF CURSOR; c1 cursor_type; --
OPEN c1 FOR lc_sql; LOOP FETCH c1
INTO lc_source_column_pk_value, lc_source_column_npk_value; EXIT WHEN c1%NOTFOUND; null; END LOOP; <
CLOSE c1; 回复更多评论
#re: oracle动态游标的简单实现方法 [未登录] 2008-05-30 19:32 | xzc
DECLARE
v_cursor NUMBER; v_stat NUMBER; v_row NUMBER;
v_id NUMBER; v_no VARCHAR(100); v_date DATE; v_sql VARCHAR(200); s_id NUMBER; s_date DATE; BEGIN
s_id := 3000; s_date := SYSDATE;
v_sql := 'SELECT id,qan_no,sample_date FROM \WHERE id > :sid and sample_date < :sdate';
v_cursor := dbms_sql.open_cursor; --打开游标;
dbms_sql.parse(v_cursor, v_sql, dbms_sql.native); --解析动态SQL语句; dbms_sql.bind_variable(v_cursor, ':sid', s_id); --绑定输入参数; dbms_sql.bind_variable(v_cursor, ':sdate', s_date);
dbms_sql.define_column(v_cursor, 1, v_id); --定义列 dbms_sql.define_column(v_cursor, 2, v_no, 100); dbms_sql.define_column(v_cursor, 3, v_date);
v_stat := dbms_sql.execute(v_cursor); --执行动态SQL语句。 LOOP
EXIT WHEN dbms_sql.fetch_rows(v_cursor)<=0; --fetch_rows在结果集中移动游标,如果未抵达末尾,返回1。
dbms_sql.column_value(v_cursor, 1, v_id); --将当前行的查询结果写入上面定义的列中。
正在阅读:
Oracle游标使用方法及语法大全06-03
重型肝炎预后影响指标及预后模型01-12
17.2.1乘除法练习课导学案08-10
2011年春季学期建筑施工技术第三次作业10-07
小学数学人教版三年级下册教案22.7笔算除法第七课时04-18
人教版四年级数学《笔算除法》教学设计04-03
报警控制器联网系统应用说明06-19
人教版四年级数学《笔算除法》教学设计01-17
MO数据部分03-22
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 游标
- 使用方法
- 语法
- 大全
- Oracle
- 监理表式
- 小学四年级奥数100题(附答案)
- 一年级上册数学第九十单元测试题
- 2017年趣味生物知识竞赛题库120题附答案
- 行星运动螺旋式混合机设计
- 2018届高考文言文阅读精选10则
- 2017天津事业单位考试公共基础知识:社会存在和社会意识的辩证关
- 顶驱操作指导
- 2017智慧树选修课《职业生涯规划——体验式学习》课后练习答案
- WORD2010 习题汇总及答案
- 计算机网络实验四详细过程及参考解答
- 宏观经济学试卷5
- 关于执法文书填写中的常见错误问题
- 合伙人大会议事规则
- ZYJ7电液转辙机学习维护故障处理资料
- 中国木塑复合材料市场调研报告
- 住院医师规范化培训登记手册-内科正文1
- 富顺三桥2#墩钢板桩围堰计算-2015.1.14
- 单片机
- 李清照诗词研究成果报告 - 图文