1、PLSQL内部能够正常运行DML(insert、update、delete)DQL(select)语句,如果运行DDL(create、truncate、drop等)需要动态sql执行。
2、动态sql不但在PLSQL中可以运行DDL还可以运行DML、DQL
3、动态sql语法:
execute immdiate ‘sql语句’ 【into 变量】【using绑定变量】
案例1:动态sql执行DDL语句
--案例1:动态sql执行DDL语句
DECLARE
-- 将要执行的DDL语句用单引号包裹住,并赋值给一个变量,注意这个变量的长度要足够
V_SQL VARCHAR2(200) := 'CREATE TABLE A(
ID NUMBER PRIMARY KEY,
NAME VARCHAR2(30) NOT NULL
)';
BEGIN
EXECUTE IMMEDIATE V_SQL;
END;
查看结果:
表成功被创建出来。
执行truncate和drop
案例2:执行DML语句
--案例2:动态sql执行DML语句
BEGIN
-- EXECUTE IMMEDIATE
-- 'insert into A(id,name) values(1,''小明'')';
-- COMMIT;
--:1 第一个占位参数 :2 第二个占位参数
-- EXECUTE IMMEDIATE
-- 使用using给动态sql绑定参数
-- 'INSERT INTO A(ID,NAME) VALUES(:1,:2)' USING 2,'小王';
-- COMMIT;
EXECUTE IMMEDIATE
-- 只需要using后面的值和依次对应表中的字段即可,values中的占位符可以随意写
'insert into A(name,id) values(:a,:b)' USING '小马',5;
COMMIT;
END;
查看表内容
动态sql执行DQL语句
DECLARE
V_A A%ROWTYPE;
BEGIN
EXECUTE IMMEDIATE 'SELECT * FROM A WHERE ID > :ID'
INTO V_A
USING 3;
DBMS_OUTPUT.PUT_LINE(V_A.ID || ',' || V_A.NAME);
END;
查看输出结果:
改变一下参数,将id变量设置为1:
DECLARE
V_A A%ROWTYPE;
BEGIN
EXECUTE IMMEDIATE 'SELECT * FROM A WHERE ID > :ID'
INTO V_A
USING 1;
DBMS_OUTPUT.PUT_LINE(V_A.ID || ',' || V_A.NAME);
END;
执行之后报错:
原因是id>1的数据有多条,不能同时赋值给V_A变量。
所以:into变量不能返回多行