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 删除的就是这个表