题目部分
动态SQL是什么?
答案部分
在PL/SQL开发过程中,使用SQL或PL/SQL可以实现大部分的需求,但是,在某些特殊的情况下,在PL/SQL中使用标准的SQL语句或DML语句不能实现自己的需求,例如需要动态建表或执行某个不确定的操作的时候,就需要动态执行,还有DDL语句及系统控制语句都不能在PL/SQL中直接使用,这就需要使用动态SQL来实现。因此,在Oracle数据库开发PL/SQL块中,可以把SQL分为静态SQL和动态SQL。所谓静态SQL指的是在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作。编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句。动态SQL允许在SQL客户模块或嵌入式宿主程序的执行过程中执行动态生成的SQL语句,动态SQL语句在程序编译时尚未确定。其中,有些部分需要在程序的执行过程中临时生成的SQL语句,SQL标准引入动态SQL的原因是由于静态SQL不能提供足够的编程灵活性。
动态SQL是使用EXECUTE IMMEDIATE语句来实现的。下面给出一个使用动态SQL的例子。
需求:完成一个存储过程,根据用户输入的表名及字段名等参数动态创建表。
SQL> SELECT * FROM LHR_TB_0427; SELECT * FROM LHR_TB_0427 * ERROR at line 1: ORA-00942: table or view does not exist SQL> CREATE OR REPLACE PROCEDURE PROC_TEST(TABLE_NAME IN VARCHAR2, --表名 2 FIELD1 IN VARCHAR2, --字段名 3 DATATYPE1 IN VARCHAR2, --字段类型 4 FIELD2 IN VARCHAR2, --字段名 5 DATATYPE2 IN VARCHAR2 --字段类型 6 ) 7 AUTHID CURRENT_USER AS 8 STR_SQL VARCHAR2(500); 9 BEGIN 10 STR_SQL := 'CREATE TABLE ' || TABLE_NAME || '(' || FIELD1 || ' ' || 11 DATATYPE1 || ',' || FIELD2 || ' ' || DATATYPE2 || ')'; 12 EXECUTE IMMEDIATE STR_SQL; --动态执行DDL语句,注意这里的STR_SQL变量的最后不能有分号 13 END; 14 /
Procedure created.
SQL> EXEC PROC_TEST('LHR_TB_0427','ID','NUMBER(8) NOT NULL','NAME','VARCHAR2(100)');
PL/SQL procedure successfully completed.
SQL> SELECT * FROM LHR_TB_0427;
no rows selected
本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。
About Me:小麦苗
● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用
● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/
● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解
● 版权所有,欢迎分享本文,转载请保留出处
● 题目解答若有不当之处,还望各位朋友批评指正,共同进步