PL/SQL动态SQL

目录

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 删除数据

DECLARE
  V_STR   VARCHAR2(1000);
  V_JOB VARCHAR2(20);
BEGIN
  V_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;
BEGIN
 V_EMPNO:=&员工工号;
 V_DEPTNO:=&部门号;

V_SQL :='
 SELECT
 E.ENAME,
 E.SAL
 FROM 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;
BEGIN
 V_EMPNO:=&请输入员工工号;

V_SQL :='
 SELECT
 E.ENAME,
 E.SAL
 FROM EMP E
WHERE E.EMPNO=' || chr(39) || V_EMPNO || chr(39);            --1
 
EXECUTE IMMEDIATE V_SQL                                      --2
INTO V_ENAME,V_SAL ;-- 动态sql查出来的数据给到变量           --3

DBMS_OUTPUT.put_line(V_ENAME || ' ' || V_SAL );
END;

你可能感兴趣的:(PL/SQL,sql,数据库)