动态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程序员面试笔试宝典》,作者:李华荣。
详细内容可以添加麦老师微信或QQ私聊。
● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用
● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/
● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解
● 版权所有,欢迎分享本文,转载请保留出处
● QQ:646634621 QQ群:618766405
● 提供OCP、OCM和高可用部分最实用的技能培训
● 题目解答若有不当之处,还望各位朋友批评指正,共同进步
长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。
本文分享自微信公众号 - DB宝(lhrdba)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。