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变量不能返回多行
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/36203.html