2012年6月18日星期一

oracle(dynamic query)动态查询用法

Oracle动态查询语句是一类特殊的查询语句,下面就为您详细介绍Oracle动态查询语句的语法,如果您对Oracle动态查询方面感兴趣的话,不妨一看。

1. 当使用EXECUTE IMMEDIATE语句处理单行查询时,需要使用INTO子句接受返回数据:
    DECLARE 
    query_stat VARCHAR2(100):='SELECT * FROM emp'||'WHERE empno=:eno'; 
    emp_record emp%ROWTYPE; 
    BEGIN 
    EXECUTE IMMEDIATE query_stat INTO emp_record USING &eno; 
    dbms_output.put_line('姓名:'||emp_record.ename||',岗位:'||emp_record.job); 
    END; 

2. EXECUTE IMMEDIATE只能用于处理单行查询,为了动态处理SELECT语句所返回的多行数据,需要定义游标变量,并使用OPEN-FOR, FETCH, CLOSE语句共同完成。具体步骤如下:
#1 定义游标变量:因为动态处理多行查询需要使用游标变量完成,所以需要在定义部分定义游标变量,语法如下:
    TYPE cursortype IS REF CURSOR; 
                    cursor_variable cursortype; 
#2 打开游标变量:打开游标变量会执行游标变量所对应的动态SELECT语句,并将查询结果存放到游标结果集。语法如下:
    OPEN cursor_variable FOR dynamic_string  
                                 [USING bind_argument]; 

#3 提取数据:提取数据用于将结果集中的行数据存放到PL/SQL变量,语法如下:                    
    FETCH cursor_variable INTO {VAR1};
#4 关闭游标变量:关闭游标变量用于释放游标结果集,语法如下:
    CLOSE cursor_variable;
实例如下:
    DECLARE 
        TYPE empcurtyp IS REF CURSOR; 
        emp_cv empcurtyp; 
        emp_record emp%ROWTYPE; 
        sql_stat VARCHAR2(100); 
    BEGIN 
         sql_stat :='SELECT * FROM emp WHERE deptno=:dno'; 
         OPEN emp_cv FOR sql_stat USING &dno; 
         LOOP 
            FETCH emp_cv INTO emp_record; 
            EXIT WHEN emp_cv%NOTFOUND; 
            dbms_output.put_line('雇员名:'||emp_record.ename||',工资:'||emp_record.sal); 
         END LOOP; 
         CLOSE emp_cv; 
    END; 


没有评论:

发表评论