3

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

我真正想做的是将它全部打包到一个存储过程中,因为我有一个 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;
4

1 回答 1

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

于 2012-10-09T13:48:51.673 回答