PL/SQL 11g R2 ——动态SQL

来源:互联网 发布:大麦电商传统滋补数据 编辑:程序博客网 时间:2024/04/28 03:41
17-1:处理DDL语句    DECLARE      ddl_string VARCHAR2(100):='CREATE TABLE a1(cola INT)';    BEGIN      EXECUTE IMMEDIATE ddl_string;    END;    /    17-2:处理DCL语句    DECLARE      dcl_string VARCHAR2(100):='GRANT SELECT ON dept TO hr';    BEGIN      EXECUTE IMMEDIATE dcl_string;    END;    /    17-3:处理DML语句    DECLARE      dml_stat VARCHAR2(100):='UPDATE emp SET sal=1800 WHERE empno=7788';    BEGIN      EXECUTE IMMEDIATE dml_stat;    END;    /    17-4:为占位符提供数据    DECLARE      dml_stat VARCHAR2(100):='INSERT INTO emp '||       '(empno,ename,sal) VALUES(:no,:name,:sal)';    BEGIN      EXECUTE IMMEDIATE dml_stat USING &1,'&2',&3;    END;    /    17-5:属入雇员号删除特定雇员,并输出该雇员的姓名    DECLARE      dml_stat VARCHAR2(100):='DELETE emp WHERE '        ||'empno=&eno RETURNING ename INTO :name';      v_name emp.ename%TYPE;    BEGIN      EXECUTE IMMEDIATE dml_stat RETURNING INTO v_name;      dbms_output.put_line(v_name||'被开除');    END;    /    17-6:输入雇员号和工资,并更新和输出雇员工资    DECLARE      dml_stat VARCHAR2(100):='UPDATE emp SET sal=:salary '        ||'WHERE empno=:eno RETURNING sal INTO :new_sal';      v_sal emp.sal%TYPE;    BEGIN      EXECUTE IMMEDIATE dml_stat      USING &sal,&eno RETURNING INTO v_sal;      dbms_output.put_line('新工资:'||v_sal);    END;    /    17-7:处理单行查询,不包含占位符    DECLARE      query_stat VARCHAR2(100):='SELECT * FROM emp'       ||' WHERE LOWER(ename)=LOWER(''&name'')';      emp_record emp%ROWTYPE;    BEGIN      EXECUTE IMMEDIATE query_stat INTO emp_record;      dbms_output.put_line('岗位:'||emp_record.job||       ',工资:'||emp_record.sal);    END;    /    17-8:处理单行查询,包含占位符    DECLARE      query_stat VARCHAR2(100):='SELECT * FROM emp WHERE empno=:eno';      emp_record emp%ROWTYPE;    BEGIN      EXECUTE IMMEDIATE query_stat INTO emp_record USING &eno;      dbms_output.put_line('姓名:'||emp_record.ename||',岗位:'||emp_record.job);    END;    /    17-9:处理多行查询    DECLARE      TYPE empcurtyp IS REF CURSOR;      emp_cv empcurtyp;      emp_record emp%ROWTYPE;      sql_stat VARCHAR2(100);    BEGIN      sql_stat:='SELECT * FROM emp WHERE deptno=:dno';      OPEN emp_cv FOR sql_stat USING &dno;      LOOP        FETCH emp_cv INTO emp_record;        EXIT WHEN emp_cv%NOTFOUND;        dbms_output.put_line('雇员名:'||emp_record.ename         ||',工资:'||emp_record.sal);      END LOOP;      CLOSE emp_cv;    END;    /    17-10:在DML上使用批量绑定    DECLARE      TYPE ename_table_type IS VARRAY(3) OF emp.ename%TYPE;      ename_table ename_table_type       :=ename_table_type('&name1','&name2','&name3');      sql_stat VARCHAR2(100):='UPDATE emp SET sal=sal*1.1 '       ||'WHERE LOWER(ename)=LOWER(:1)';    BEGIN      FORALL i IN 1..ename_table.COUNT        EXECUTE IMMEDIATE sql_stat USING ename_table(i);    END;    /    17-11:在DML返回子句上只用批量绑定    DECLARE      TYPE ename_table_type IS TABLE OF emp.ename%TYPE;      TYPE sal_table_type IS TABLE OF emp.sal%TYPE;      ename_table ename_table_type;      sal_table sal_table_type;      sql_stat VARCHAR2(100):='UPDATE emp SET sal=sal+200 '        ||'WHERE deptno=:dno '        ||'RETURNING ename,sal INTO :1,:2';    BEGIN      EXECUTE IMMEDIATE sql_stat USING &dno        RETURNING BULK COLLECT INTO ename_table,sal_table;      FOR i IN 1..ename_table.COUNT LOOP        dbms_output.put_line('姓名:'||ename_table(i)||',新工资:'||sal_table(i));      END LOOP;    END;    /    17-12:使用批量绑定处理多行查询    DECLARE      TYPE ename_table_type IS VARRAY(100) OF emp.ename%TYPE;      TYPE hiredate_table_type IS VARRAY(100) OF emp.hiredate%TYPE;      ename_table ename_table_type;      hiredate_table hiredate_table_type;      sql_stat VARCHAR2(100):='SELECT ename,hiredate FROM emp '        ||'WHERE deptno=:dno';    BEGIN      EXECUTE IMMEDIATE sql_stat        BULK COLLECT INTO ename_table,hiredate_table USING &dno;      FOR i IN 1..ename_table.COUNT LOOP        dbms_output.put_line('姓名:'||ename_table(i)||          ',工作日期:'||hiredate_table(i));      END LOOP;    END;    /    17-13:在FETCH语句中使用批量提取    DECLARE      TYPE refcur IS REF CURSOR;      emp_cv refcur;      TYPE ename_table_type IS TABLE OF emp.ename%TYPE;      TYPE job_table_type IS TABLE OF emp.job%TYPE;      ename_table ename_table_type;      job_table job_table_type;      sql_stat VARCHAR2(100):='SELECT ename,job FROM emp '        ||'WHERE deptno=:dno';    BEGIN      OPEN emp_cv FOR sql_stat USING &dno;      FETCH emp_cv BULK COLLECT INTO ename_table,job_table;      CLOSE emp_cv;      FOR i IN 1..ename_table.COUNT LOOP        dbms_output.put_line('姓名:'||ename_table(i)||',岗位:'||job_table(i));      END LOOP;    END;    /


原创粉丝点击