目录
1. 动态 sql
2. 带参数的动态 sql
-- 不使用 USING 传参
1. 动态 sql
-- 在 PL/SQL 程序开发中,可以使用 DML 语句,但是很多语句(如 DDL),不能直接在 PL/SQL中执行,这些语句可以使用动态 sql 来实现.
语法格式:
EXECUTE IMMEDIATE --动态语句的字符串
[into 变量类型] --动态sql查出来的数据给到变量
[using 参数类型] --USING 为动态sql语句中的参数传值
BEGIN-- CREATE TABLE EMP_555 AS SELECT * FROM EMP; 不允许EXECUTE IMMEDIATE 'CREATE TABLE EMP_555 AS SELECT * FROM EMP';
END;
-- 案例:根据 JOB 删除数据
DECLAREV_STR VARCHAR2(1000);V_JOB VARCHAR2(20);
BEGINV_JOB := '&请输入要删除的职业';V_STR := 'DELETE FROM EMP_555 WHERE JOB=' || CHR(39)|| V_JOB || CHR(39);EXECUTE IMMEDIATE V_STR ; --将变量拼起来DBMS_OUTPUT.PUT_LINE(V_STR);
END;
单引号
SELECT
CHR(39), --单引号
'''' -- 单引号
FROM DUAL;
2. 带参数的动态 sql
-- 如果动态语句是 SELECT 语句,可以把查询的语句保存到 INTO 后面的变量中
如果 动态语句中存在参数, USING 为语句中的参数传值
--案例:根据员工工号和部门号查询员工的名字和工资
DECLARE
V_SQL VARCHAR2(4000);
V_ENAME VARCHAR2(20);
V_SAL NUMBER;
V_EMPNO NUMBER;
V_DEPTNO NUMBER;
BEGINV_EMPNO:=&员工工号;V_DEPTNO:=&部门号;V_SQL :='SELECTE.ENAME,E.SALFROM EMP E
WHERE E.EMPNO=:P_EMPNO
AND E.DEPTNO=:P_DEPTNO' ;-- 用: 参数名称EXECUTE IMMEDIATE V_SQL --2
INTO V_ENAME,V_SAL -- 动态sql查出来的数据给到变量 --3
USING V_EMPNO,V_DEPTNO ;
--参数 ,顺序要注意,参数名称可以随意写,将 V_DEPTNO 传递给 动态SQL参数 P_DEPTNO -- 1 DBMS_OUTPUT.put_line(V_ENAME || ' ' || V_SAL );
END;
-- 不使用 USING 传参
--案例:根据员工工号查询员工的名字和工资
DECLARE
V_SQL VARCHAR2(4000);
V_ENAME VARCHAR2(20);
V_SAL NUMBER;
V_EMPNO NUMBER;
BEGINV_EMPNO:=&请输入员工工号;V_SQL :='SELECTE.ENAME,E.SALFROM EMP E
WHERE E.EMPNO=' || chr(39) || V_EMPNO || chr(39); --1EXECUTE IMMEDIATE V_SQL --2
INTO V_ENAME,V_SAL ;-- 动态sql查出来的数据给到变量 --3DBMS_OUTPUT.put_line(V_ENAME || ' ' || V_SAL );
END;