大数据开发必备技能_第二阶段08_动态 SQL 技术分享文档

如果你对大数据开发充满好奇,但苦于零基础不知从何入手,这系列文章就是为你量身定制的!

零门槛入门:无需编程经验,从最基础的SQL查询讲起,手把手带你理解数据操作的核心逻辑。

实战为王:每章附赠真实场景练习题,边学边练,拒绝纸上谈兵。

转行利器:内容直击企业高频需求(数据清洗、分析、可视化),搭配职场避坑指南,助你快速构建“可迁移技能”。

系统进阶:从数据类型到复杂查询,从运算符到执行顺序,层层递进,帮你搭建扎实的大数据地基。

无论你是学生、职场新人,还是想跨界转行的探索者,跟着这份指南,用一杯伯牙绝弦的时间,迈出大数据开发的第一步!

致亲爱的读者朋友们:
放心追更!本系列文章每日三篇干货更新,助你稳扎稳打!
配套视频解说正在全力打磨中,即将震撼上线——
关注收藏不迷路,精彩内容绝不辜负!

目录

  1. 背景与语法

  2. 示例:动态 SQL 基础用法

  3. 动态 SQL 与存储过程

  4. 常见问题:单引号处理

  5. 练习与实战案例

  6. 实际工作案例:批量删除表

  7. 总结

  8. 面试题


1. 背景与语法

背景

当 SQL 语句以字符串形式存在(如拼接变量或参数化查询),或需要执行 DDL 语句(如 TRUNCATEDROP)时,必须使用动态 SQL。

语法

sql

execute immediate 'SQL语句字符串' [into 变量];
 
  
  • 作用:将字符串作为 SQL 语句执行,并通过 into 接收查询结果(仅适用于有返回值的语句)。


2. 示例:动态 SQL 基础用法

示例 1:计算部门平均薪资

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;
 
  

示例 2:同步表数据(DDL 必须使用动态 SQL)

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;
 
  

3. 动态 SQL 与存储过程

示例:根据员工编号查询信息

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;
 
  

4. 常见问题:单引号处理

动态 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;
 
  

5. 练习与实战案例

练习 1:同步员工信息到新表

需求:入参员工编号,将姓名、薪资、部门名称同步到 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;
 
  

6. 实际工作案例:批量删除表

需求:删除命名规则为 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;
 
  

7. 总结

  1. 使用场景

    • SQL 语句包含变量或参数。

    • 需要执行 DDL 操作(如 TRUNCATE)。

  2. 语法要点

    • execute immediate 执行字符串形式的 SQL。

    • 有返回值时用 into 接收。

  3. 注意事项

    • DDL 语句必须使用动态 SQL。

    • 单引号需转义(chr(39) 或 '')。


8. 面试题

  1. 问题:动态 SQL 和静态 SQL 的区别是什么?
    :静态 SQL 在编译时固定,动态 SQL 在运行时拼接字符串执行,适用于参数化或 DDL 场景。

  2. 问题:如何防止动态 SQL 中的 SQL 注入?
    :使用绑定变量(如 USING 子句),避免直接拼接用户输入。

  3. 问题:为什么 TRUNCATE 必须用动态 SQL,而 DELETE 可以直接执行?
    TRUNCATE 是 DDL 语句,PL/SQL 中不允许直接执行 DDL,需通过动态 SQL 实现。


文档说明:本文档适用于 PL/SQL 开发者,重点讲解动态 SQL 的使用场景、语法及实战案例。

你可能感兴趣的:(大数据开发必备技能,大数据,sql,面试,数据库,oracle,mysql)