2012-10-09 41 views
3

我已经编写了一个脚本,该脚本计划在夜间运行以复制昨天的表,删除昨天的表,创建新表,然后比较更改。作为一个计划任务,这很好,但我真的很努力地找到一种允许用户在运行中执行测试的方法。如何在存储过程中使用DROP TABLE等命令

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

以下是脚本开始的示例。任何人都可以帮助我将它存储到一个存储过程中,因为它显然不会接受像DROP TABLE这样的命令作为标准。

谢谢。

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; 

回答

8
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语句执行动态SQL语句或匿名PL/SQL块,一个PL/SQL块中,或存储过程或包装。如果您需要运行DDL语句(如DROPCREATE TABLE等),则会更具体地使用这些语句。您无法将PL/SQL中的DDL命令作为DML语句执行,因此唯一的方法就是动态SQL。更多信息herehere

+0

非常感谢。我其实早些时候尝试过,并且无法使其工作。然而,随着你的回答再次充满信心,我只是再次尝试,这一次它的工作。不知道埃里尔出了什么问题。由于不知道我在做什么,可能是半心半意。 –

+0

这里没有太多时髦只是一堆动态SQL! :) – Annjawn

相关问题