如何在存储过程中使用 DROP TABLE 等命令 [英] How to use commands like DROP TABLE etc. within a stored procedure

查看:147
本文介绍了如何在存储过程中使用 DROP TABLE 等命令的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我编写了一个脚本,计划在夜间运行以复制昨天的表、删除昨天的表、创建新表,然后比较更改.这作为计划任务运行良好,但我真的很难找到一种方法,允许用户出于测试目的即时执行它.

I have written a script which is intended to be scheduled to run overnight to copy yesterday's tables, drop yesterday's tables, create new tables, then compare changes. This is working fine as a scheduled task, but I am really struggling to find a way of allowing the users to execute it on the fly for testing purposes.

我真正想做的是将它全部打包到一个存储过程中,因为我有一个 eForm 工具,它可以轻松地让用户(非常非技术性的)能够通过单击来执行该过程.

What I really want to do is to pack it all into a stored procedure, as I have an eForm tool which will easily allow the user (very non-technical) to be able to execute the procedure with a click.

这是脚本开始的示例.谁能帮我把它硬塞到一个存储过程中,因为它显然不会接受像 DROP TABLE 这样的命令作为标准.

Here is an example of the start of the script. Can anyone help me shoehorn this into a stored procedure as it clearly won't accept commands like DROP TABLE as standard.

谢谢.

DROP TABLE SQL2005TEST.ABSENCEFULLDATADIFF_YESTERDAY;
DROP TABLE SQL2005TEST.ABSENCELATESTSTART_YESTERDAY;
DROP TABLE SQL2005TEST.ABSENCELATESTEND_YESTERDAY;

CREATE TABLE SQL2005TEST.ABSENCEFULLDATADIFF_YESTERDAY
 AS SELECT * FROM SQL2005TEST.ABSENCEFULLDATADIFF;

CREATE TABLE SQL2005TEST.ABSENCELATESTSTART_YESTERDAY
 AS SELECT * FROM SQL2005TEST.ABSENCELATESTSTART;

CREATE TABLE SQL2005TEST.ABSENCELATESTEND_YESTERDAY
 AS SELECT * FROM SQL2005TEST.ABSENCELATESTEND;

推荐答案

CREATE OR REPLACE PROCEDURE proc_name AS
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE SQL2005TEST.ABSENCEFULLDATADIFF_YESTERDAY';
.....
EXECUTE IMMEDIATE 'CREATE TABLE SQL2005TEST.ABSENCELATESTEND_YESTERDAY
                       AS SELECT * FROM SQL2005TEST.ABSENCELATESTEND';
....
....
EXCEPTION
  ....
  ....
END;

EXECUTE IMMEDIATE 语句在 PL/SQL 块、存储过程或包中执行动态 SQL 语句或匿名 PL/SQL 块.如果您需要运行 DROPCREATE TABLE 等 DDL 语句,则更具体地使用它.您不能将 PL/SQL 中的 DDL 命令作为 DML 语句执行,因此唯一的方法是动态 SQL.更多信息这里这里.

The EXECUTE IMMEDIATE statement executes a dynamic SQL statement or anonymous PL/SQL block, within a PL/SQL block, or Stored Procedure, or Package. This is more specifically used if you need to run DDL statements like DROP, CREATE TABLE etc. You cannot execute DDL commands from PL/SQL as DML statements, so the only way is dynamic SQL. More info here and here.

这篇关于如何在存储过程中使用 DROP TABLE 等命令的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆