Oracle学习笔记第十三天

Oracle学习笔记第十三天

静态SQL和动态SQL

  1. 静态SQL
    • 需要在编写PL/SQL程序时就确定的SQL语句
  2. 动态SQL
    • 动态 SQL 是指在PL/SQL程序执行时生成的 SQL 语句
    • DDL 语句命令和会话控制语句不能在PL/SQL 中直接使用,但是可以通过动态 SQL 来执行
    • 编译程序对动态 SQL 不做处理,而是在程序运行时动态构造语句、对语句进行语法分析并执行

注意:DDL和DCL语句不能直接用在静态SQL,如果要用,可以用在动态SQL。

动态SQL实现方法:

方法1:

  • 本地动态SQL:EXECUTE IMMEDIATE 语句执行

    可以执行单行SQL,不能执行多行。

  • 通过游标实现

    可以执行多行SQL

方法2:DBMS_SQL程序包

方法详解:

  1. EXECUTE IMMEDIATE 语句

    -- 语法
    	EXECUTE IMMEDIATE dynamic_sql_string 
    	    [INTO define_variable_list]
    		[USING bind_argument_list];
    
    解释:
    	dynamic_sql_string 是动态SQL 语句字符串
    	INTO 子句用于接受SELECT语句选择的记录值
    	USING 子句用于绑定输入参数变量
    
    -- 举例
    -- 方式一
    set serveroutput on;
    declare
        v_sql varchar2(200) := 'drop table emp2';
    begin    
        execute immediate v_sql;   
    end;
    /
    
    -- 方式二
    set serveroutput on;
    declare
    begin    
        execute immediate 'drop table emp2';   
    end;
    /
    
    set serveroutput on;
    declare
        v_sql varchar2(200) := 'select sal from emp where empno = :empno';
        v_sal emp.sal%type;   --保存查询结果
    begin
        --into指定用来保存查询结果的变量
        --using用来给绑定变量赋值
        execute immediate  v_sql 
        into  v_sal
        using &工号;
        
        dbms_output.put_line('查询到的工资为:'||v_sal);
    end;
    /
    

    注意点:在定义这个变量SQL时,: 表示占位符,后面跟自己定义的变量名,格式甚至可以是:‘ :1 ’ ,执行语句中into是保存执行后的结果。

  2. 通过游标实现动态SQL

    -- 语法
    TYPE type_cursor IS REF CURSOR
    [RETURN return_type];
    cursor_name type_cursor;
    
    OPEN cursor_name FOR dynamic_sql_string
        [USING bind_argument_list];
    
    解释:
    dynamic_sql_string 是动态SQL 语句字符串
    USING 子句用于绑定输入参数变量
    
    -- 举例
    set serveroutput on;
    declare
        --定义引用游标类型
        type c_emp_type is ref cursor;
        --定义游标变量
        c_emp c_emp_type;
        --定义变量保存查询sql
        v_sql varchar(200);
        --定义变量保存用户输入的部门编号
        v_deptno number(4)  := &部门编号;
        --定义变量保存查询结果
        v_emp emp%rowtype;
    begin
        --确定查询sql
        v_sql := 'select * from emp where deptno = :deptno';
        --打开游标
        open c_emp for v_sql using v_deptno;
        
        loop
            fetch c_emp into v_emp;
            exit when c_emp%notfound;
            
            dbms_output.put_line('工号:'||v_emp.empno||
                                 '姓名:'||v_emp.ename||
                                 '工资:'||v_emp.sal||
                                 '部门编号:'||v_emp.deptno);
        end loop;
        
        --关闭游标
        close c_emp;
    end;
    /
    
  3. 通过DBMS_SQL程序包

    实现步骤:
    1. 将要执行的SQL 语句或一个语句块放到一个字符串变量中
    2. 打开光标(游标)
    3. 使用DBMS_SQL包的parse 过程来分析该字符串
    4. 使用DBMS_SQL包的bind_variable 过程来绑定变量
    5. 使用DBMS_SQL包的execute 函数来执行语句
    6. 关闭光标(游标)
    

    这个用的少,而且没有上面的方法直接,所以暂不介绍。

猜你喜欢

转载自blog.csdn.net/xxydzyr/article/details/85223785