如果你对大数据开发充满好奇,但苦于零基础不知从何入手,这系列文章就是为你量身定制的!
零门槛入门:无需编程经验,从最基础的SQL查询讲起,手把手带你理解数据操作的核心逻辑。
实战为王:每章附赠真实场景练习题,边学边练,拒绝纸上谈兵。
转行利器:内容直击企业高频需求(数据清洗、分析、可视化),搭配职场避坑指南,助你快速构建“可迁移技能”。
系统进阶:从数据类型到复杂查询,从运算符到执行顺序,层层递进,帮你搭建扎实的大数据地基。
无论你是学生、职场新人,还是想跨界转行的探索者,跟着这份指南,用一杯伯牙绝弦的时间,迈出大数据开发的第一步!
致亲爱的读者朋友们:
放心追更!本系列文章每日三篇干货更新,助你稳扎稳打!
配套视频解说正在全力打磨中,即将震撼上线——
关注收藏不迷路,精彩内容绝不辜负!
背景与语法
示例:动态 SQL 基础用法
动态 SQL 与存储过程
常见问题:单引号处理
练习与实战案例
实际工作案例:批量删除表
总结
面试题
当 SQL 语句以字符串形式存在(如拼接变量或参数化查询),或需要执行 DDL 语句(如 TRUNCATE
、DROP
)时,必须使用动态 SQL。
sql
execute immediate 'SQL语句字符串' [into 变量];
作用:将字符串作为 SQL 语句执行,并通过 into
接收查询结果(仅适用于有返回值的语句)。
sql
declare
v_deptno emp.deptno%type := &input;
v_sal emp.sal%type;
v_sql varchar2(100);
begin
v_sql := 'select avg(sal) from emp where deptno = ' || v_deptno;
execute immediate v_sql into v_sal;
dbms_output.put_line(v_sal);
end;
sql
-- 创建存储过程清空并同步表
create or replace procedure p_emp_1128 is
begin
execute immediate 'truncate table emp_1128'; -- 动态执行 DDL
insert into emp_1128 select * from emp;
commit;
end;
sql
create or replace procedure p_emp_1129(p_empno emp.empno%type) is
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
execute immediate 'select ename, sal from emp where empno = ' || p_empno
into v_ename, v_sal;
dbms_output.put_line(v_ename || ':' || v_sal);
insert into emp_1129 values (v_ename, v_sal);
commit;
end;
动态 SQL 中拼接字符串时,需正确处理单引号:
方法 1:使用 chr(39)
(ASCII 码为单引号)。
方法 2:使用两个单引号 ''
转义。
sql
declare
v_ename emp.ename%type := 'SCOTT';
v_sql varchar2(200);
begin
v_sql := 'select ename from emp where ename = ' || chr(39) || v_ename || chr(39);
-- 或写为:'select ename from emp where ename = ''' || v_ename || ''''
execute immediate v_sql into v_ename;
end;
需求:入参员工编号,将姓名、薪资、部门名称同步到 emp_1130
表。
sql
create table emp_1130 (ename varchar2(100), sal number, deptname varchar2(100));
declare
v_empno emp.empno%type := &input;
v_ename emp.ename%type;
v_sal emp.sal%type;
v_dname dept.dname%type;
begin
execute immediate '
select e.ename, e.sal, d.dname
from emp e join dept d on e.deptno = d.deptno
where e.empno = ' || v_empno
into v_ename, v_sal, v_dname;
insert into emp_1130 values (v_ename, v_sal, v_dname);
commit;
end;
需求:删除命名规则为 emppp_1
到 emppp_49
的表。
sql
create or replace procedure p_drop_emp(p_n number) is
begin
for i in 1..p_n loop
execute immediate 'drop table emppp_' || i;
end loop;
exception
when others then null; -- 忽略异常
end;
使用场景:
SQL 语句包含变量或参数。
需要执行 DDL 操作(如 TRUNCATE
)。
语法要点:
execute immediate
执行字符串形式的 SQL。
有返回值时用 into
接收。
注意事项:
DDL 语句必须使用动态 SQL。
单引号需转义(chr(39)
或 ''
)。
问题:动态 SQL 和静态 SQL 的区别是什么?
答:静态 SQL 在编译时固定,动态 SQL 在运行时拼接字符串执行,适用于参数化或 DDL 场景。
问题:如何防止动态 SQL 中的 SQL 注入?
答:使用绑定变量(如 USING
子句),避免直接拼接用户输入。
问题:为什么 TRUNCATE
必须用动态 SQL,而 DELETE
可以直接执行?
答:TRUNCATE
是 DDL 语句,PL/SQL 中不允许直接执行 DDL,需通过动态 SQL 实现。
文档说明:本文档适用于 PL/SQL 开发者,重点讲解动态 SQL 的使用场景、语法及实战案例。