一:背景知识
1 sql执行分为静态sql和动态sql
1.1 静态sql:PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象
1.2 动态sql:PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作
2 DDL(data define lauguage) DML(data manipulation lauguage)
二:动态sql的实现
实现原理:sql语句的拼接
1 本地动态SQL 执行DDL 语句 略
2 dbms_sql包
2.1 步骤:
A、先将要执行的SQL语句或一个语句块放到一个字符串变量中。
B、使用DBMS_SQL包的 parse过程来分析该字符串。
C、使用DBMS_SQL包的bind_variable过程来绑定变量。
D、使用DBMS_SQL包的execute函数来执行语句。
代码:
PROCEDURE create_table(table_name IN VARCHAR2 , --表名 field_name1 IN VARCHAR2 , --字段名 datatype1 IN VARCHAR2 , --字段类型 field_name2 IN VARCHAR2 , --字段名 datatype2 IN VARCHAR2 --字段类型 ) AS v_cursor NUMBER; --定义光标 v_string VARCHAR2(200); --字符串变量 v_row NUMBER; --行数 BEGIN --1:打开游标 v_cursor := dbms_sql.open_cursor; --2.sql语句拼接 --2.1 不需要绑定变量 v_string := 'create TABLE ' || table_name || '(' || field_name1 || ' ' || datatype1 || ' ,' || field_name2 || ' ' || datatype2 || ') '; --3.1parse解析 dbms_sql.parse(v_cursor ,v_string ,dbms_sql.native); --2.2 绑定变量DBMS_SQL.bind_variable 主要针对where语句 v_string := ’update dinya_test2 a SET a.name = :p_name WHERE a.id = :p_id’; dbms_sql.parse(v_cursor ,v_string ,dbms_sql.native); --分析语句 --3.2parse解析 dbms_sql.parse(v_cursor ,v_string ,dbms_sql.native); dbms_sql.bind_variable(v_cursor ,’ :p_name’ ,NAME); --绑定变量 dbms_sql.bind_variable(v_cursor ,’ :p_id’ ,id); --绑定变量 --4.execute执行 v_row := dbms_sql.execute(v_cursor); --5.--关闭光标 dbms_sql.close_cursor(v_cursor); EXCEPTION WHEN OTHERS THEN dbms_sql.close_cursor(v_cursor); --关闭光标 END;