对plsql存过中EXECUTE IMMEDIATE的疑问
时间:2011-09-19
来源:互联网
PROCEDURE Etl_ADDR IS
V_CNT_AG NUMBER(10);
BEGIN
INSERT INTO 日志表1;
COMMIT;
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM 地址表1 WHERE ROWNUM<10' INTO V_CNT_AG;
IF V_CNT_AG>0 THEN
--备份
EXECUTE IMMEDIATE 'TRUNCATE TABLE 地址备份表1';
INSERT INTO 地址备份表1 SELECT * FROM 地址表1;
COMMIT;
--导入
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE 地址表1 DROP CONSTRAINT 主键1';
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
EXECUTE IMMEDIATE 'ALTER TABLE 地址表1 TRUNCATE 分区.. ';
BEGIN
EXECUTE IMMEDIATE '
INSERT INTO 地址表1(ID, NAME, GRADE, PARENTID, ADDR)
SELECT AG.ID, AG.NAME, NVL(AG.GRADE,-1), AG.PARENTID, AG.ADDR
FROM 源地址表';
COMMIT;
DBMS_STATS.gather_table_stats(……);
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE 地址表1 ADD CONSTRAINT 主键1
USING INDEX TABLESPACE "INDEX" NOLOGGING';
DBMS_STATS.gather_index_stats(……);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
EXCEPTION
WHEN OTHERS THEN
--恢复
V_ERROR_MESSAGE := 'OTHER ERROR: '||substr(sqlerrm(SQLCODE),1,255);
INSERT INTO 日志表1;
EXECUTE IMMEDIATE 'TRUNCATE TABLE 地址表1';
INSERT INTO 地址表1 SELECT * FROM 地址备份表1;
COMMIT;
DBMS_STATS.gather_table_stats(……);
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE 地址表1 ADD CONSTRAINT 主键1
USING INDEX TABLESPACE "INDEX" NOLOGGING';
DBMS_STATS.gather_index_stats(……);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
END;
END IF;
INSERT INTO 日志表1;
COMMIT;
Exception WHEN OTHERS THEN
V_ERROR_MESSAGE := 'OTHER ERROR: '||substr(sqlerrm(SQLCODE),1,255);
INSERT INTO 日志表1;
COMMIT;
END Etl_ADDR;
------------------------------------
提问:execute immediate 不是用来执行动态sql语句的吗,但是上面那个例子怎么用它来执行查询(select)、删除表的内容(truncate)、增加主键(alter)和插入数据(insert)
而同样的,存过里不也有单独的insert into语句(没有放在execute immediate里)吗,那针对上面标示为橙色的四个execute immediate的意义大家能解释一下吗?实在搞糊涂了
V_CNT_AG NUMBER(10);
BEGIN
INSERT INTO 日志表1;
COMMIT;
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM 地址表1 WHERE ROWNUM<10' INTO V_CNT_AG;
IF V_CNT_AG>0 THEN
--备份
EXECUTE IMMEDIATE 'TRUNCATE TABLE 地址备份表1';
INSERT INTO 地址备份表1 SELECT * FROM 地址表1;
COMMIT;
--导入
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE 地址表1 DROP CONSTRAINT 主键1';
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
EXECUTE IMMEDIATE 'ALTER TABLE 地址表1 TRUNCATE 分区.. ';
BEGIN
EXECUTE IMMEDIATE '
INSERT INTO 地址表1(ID, NAME, GRADE, PARENTID, ADDR)
SELECT AG.ID, AG.NAME, NVL(AG.GRADE,-1), AG.PARENTID, AG.ADDR
FROM 源地址表';
COMMIT;
DBMS_STATS.gather_table_stats(……);
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE 地址表1 ADD CONSTRAINT 主键1
USING INDEX TABLESPACE "INDEX" NOLOGGING';
DBMS_STATS.gather_index_stats(……);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
EXCEPTION
WHEN OTHERS THEN
--恢复
V_ERROR_MESSAGE := 'OTHER ERROR: '||substr(sqlerrm(SQLCODE),1,255);
INSERT INTO 日志表1;
EXECUTE IMMEDIATE 'TRUNCATE TABLE 地址表1';
INSERT INTO 地址表1 SELECT * FROM 地址备份表1;
COMMIT;
DBMS_STATS.gather_table_stats(……);
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE 地址表1 ADD CONSTRAINT 主键1
USING INDEX TABLESPACE "INDEX" NOLOGGING';
DBMS_STATS.gather_index_stats(……);
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
END;
END IF;
INSERT INTO 日志表1;
COMMIT;
Exception WHEN OTHERS THEN
V_ERROR_MESSAGE := 'OTHER ERROR: '||substr(sqlerrm(SQLCODE),1,255);
INSERT INTO 日志表1;
COMMIT;
END Etl_ADDR;
------------------------------------
提问:execute immediate 不是用来执行动态sql语句的吗,但是上面那个例子怎么用它来执行查询(select)、删除表的内容(truncate)、增加主键(alter)和插入数据(insert)
而同样的,存过里不也有单独的insert into语句(没有放在execute immediate里)吗,那针对上面标示为橙色的四个execute immediate的意义大家能解释一下吗?实在搞糊涂了
作者: heqiyu34 发布时间: 2011-09-19
SQL code
----execute immediate 不是用来执行动态sql语句的吗,但是上面那个例子怎么用它来执行查询(select)、删除表的内容(truncate)、增加主键(alter)和插入数据(insert) 而同样的,存过里不也有单独的insert into语句(没有放在execute immediate里)吗,那针对上面标示为橙色的四个execute immediate的意义大家能解释一下吗?实在搞糊涂了 这就是execute immediate动态的执行 select 、truncate、alter、insert 语句而已。
作者: lzd_83 发布时间: 2011-09-19
1. EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM 地址表1 WHERE ROWNUM<10' INTO V_CNT_AG;
4. EXECUTE IMMEDIATE '
INSERT INTO 地址表1(ID, NAME, GRADE, PARENTID, ADDR)
SELECT AG.ID, AG.NAME, NVL(AG.GRADE,-1), AG.PARENTID, AG.ADDR
FROM 源地址表';
这两个没有必要使用的,这完全是作者不好的编码习惯
2. EXECUTE IMMEDIATE 'TRUNCATE TABLE 地址备份表1'
3. EXECUTE IMMEDIATE 'ALTER TABLE 地址表1 DROP CONSTRAINT 主键1';
存储过程里不能直接执行 truncate, alter 语句,所以只能使用动态语句来实现
4. EXECUTE IMMEDIATE '
INSERT INTO 地址表1(ID, NAME, GRADE, PARENTID, ADDR)
SELECT AG.ID, AG.NAME, NVL(AG.GRADE,-1), AG.PARENTID, AG.ADDR
FROM 源地址表';
这两个没有必要使用的,这完全是作者不好的编码习惯
2. EXECUTE IMMEDIATE 'TRUNCATE TABLE 地址备份表1'
3. EXECUTE IMMEDIATE 'ALTER TABLE 地址表1 DROP CONSTRAINT 主键1';
存储过程里不能直接执行 truncate, alter 语句,所以只能使用动态语句来实现
作者: opps_zhou 发布时间: 2011-09-19
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28