DB2——存储过程-prepare

prepare:标识动态sql的

因为1.用变量做表名: 简单的用set或者declare语句定义变量,然后直接作为sql的表名是不行的,mysql会把变量名当作表名。在其他的sql数据库中也是如 此,mssql的解决方法是将整条sql语句作为变量,其中穿插变量作为表名,然后用sp_executesql调用该语句。仅对procedure有 效,function不支持动态查询

 declare v_sql       varchar(4000) default '';--动态sql            可以看到这里是声明了一个变量,字符串,默认值是空字符串

    --程序开始
    
    --表--
    if upper(v_lx) = 'T' then
      if exists(select 1 from sysibm.tables where table_schema = 'PAS' and table_name= ltrim(rtrim(replace(upper(v_ccmc),'PAS.','')))) then
        set v_sql='drop table '||v_ccmc;        
        prepare s1 from v_sql;          而在这里声明了这个变量是一个动态sql,然后就去执行了,不如不声明的话就有可能会出现把变量本身作为参数了
        execute s1;
      end if;
    end if;

PS:说下我个人的大白话理解

动态sql:

假设我们声明两个个变量 declare v_sql varchar(4000) default '';(动态sql语句,默认值为空字符串),declare v_cmcc  varchar(40);(传进来的值为jxdx_ckzh)

,给变量赋值set v_sql='drop table'||v_ccmc

那么我们用execute去执行这条sql  执行的语句就是 drop table jxdx_ckzh

不声明为动态sql的话:

直接用execute去执行v_sql  :excute v_sql

执行的就是 drop table v_cmcc 删除的就是这个表

猜你喜欢

转载自www.cnblogs.com/wy20110919/p/9051244.html