静态SQL和动态SQL的概念
静态 SQL
静态 SQL 是我们常用的使用 SQL 语句的方式,即编写 SPL 时, SQL 语句已经编写好了。因为静态 SQL 是在编写程序时就确定了,只能使用 SQL 中的 DML 和事务控制语句,但是 DDL 语句,以及会话控制语句却不能再 SPL 中直接使用,如动态创建表或者某个不确定的操作时,这就需要动态 SQL 来实现。
动态 SQL
动态 SQL 是指在 SPL 编译时SQL语句是不确定的,如根据用户输入的参数的不同来执行不同的操作。编译程序对动态语句部分不进行处理,只是在程序运行时动态创建语句,对语句进行分析,并执行该语句。
动态 SQL 语句语法
动态地执行在程序执行期间构造的单个 SQL 语句。例如,您可从程序输入获取数据库的名称,将 DATABASE 语句构建为程序变量,然后使用 EXECUTE IMMEDIATE 来执行该语句,以打开指定的数据库。
EXECUTE IMMEDIATE 'statement {; statement};' |
statement_var |
char_expr
语句说明:
- 参数 statement :有效 SQL 语句的文本。
- 参数 statement_var :包含 statement 的变量或(在 ESQL/C 中)以分号分隔的语句列表。
- 参数 char_expr :取值为字符数据类型的表达式。
动态 SQL 语句示例
EXECUTE IMMEDIATE 动态执行单条 SQL 语句
DROP PROCEDURE IF EXISTS MYPROC();
CREATE PROCEDURE MYPROC()
DEFINE TOPER VARCHAR(16);
DEFINE TABNAME VARCHAR(16);
DEFINE COLS VARCHAR(30);
LET TOPER = 'CREATE TABLE ';
LET TABNAME = 'DYN_TAB';
LET COLS = '(ID INT, NAME CHAR(20))';
--拼接sql语句CREATE TABLE DYN_TAB (ID INT, NAME CHAR(20))
EXECUTE IMMEDIATE TOPER || TABNAME || COLS;
END PROCEDURE;
EXECUTE IMMEDIATE 动态执行多条 SQL 语句
进行数据准备,标准表 info 数据如下:
id | name | |
---|---|---|
1 | JOM | jom@email.com |
2 | MARY | mary@email.com |
3 | LYNN | lynn@email.com |
DROP PROCEDURE IF EXISTS myproc();
CREATE PROCEDURE myproc()
DEFINE p_id INT;
DEFINE p_email VARCHAR(40);
DEFINE p_sql VARCHAR(100);
FOREACH SELECT id,email INTO p_id,p_email FROM info
LET p_sql = 'INSERT INTO info_email VALUES('||TO_CHAR(p_id)||','''||p_email||''')';
--通过变量p_id、p_email的值,动态变化 INSERT 语句,EXECUTE IMMEDIATE 执行 p_sql的SQL文本
EXECUTE IMMEDIATE p_sql;
END FOREACH;
END PROCEDURE;