Gbase 8s 动态SQL

静态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 

语句说明:

  1. 参数 statement :有效 SQL 语句的文本。
  2. 参数 statement_var :包含 statement 的变量或(在 ESQL/C 中)以分号分隔的语句列表。
  3. 参数 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 数据如下:

idnameemail
1JOMjom@email.com
2MARYmary@email.com
3LYNNlynn@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;
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值