在过程中创建表
Posted
技术标签:
【中文标题】在过程中创建表【英文标题】:CREATE TABLE INSIDE PROCEDURE 【发布时间】:2019-08-13 03:09:12 【问题描述】:我似乎无法在此过程中创建表。我在网上读到,对于任何 DDL,我都需要使用 EXECUTE IMMEDIATE 并尝试了以下几个在线示例。但是,即使尝试了几种解决方案,它仍然失败。 '
错误 ""ORA-00904: "End": 标识符无效 ORA-06512: at “EXTRACT_AUTOMATED_CHECKS”,第 89 行“
CREATE OR REPLACE PROCEDURE EXTRACT_AUTOMATED_CHECKS AS
BEGIN
--DROP TABLE
BEGIN
EXECUTE IMMEDIATE ('DROP TABLE extract_checks') ;
EXCEPTION
WHEN OTHERS THEN NULL;
END;
--CREATE TABLE, INDEX
--TABLE
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE extract_checks
(
Card number(19) NOT NULL PRIMARY KEY
,Customer_Id number(19)
)';
COMMIT;
END;
--INDEX
BEGIN
EXECUTE IMMEDIATE('CREATE INDEX IDX_EXT_CHECKS extract_checks(Customer_Id)');
COMMIT;
END;
SOURCE.DBA_SEND_MAIL(
V_FROM=>'Notification@Company.com;',
V_RECIPIENT => 'employee@company.com',
V_SUBJECT => 'Automated Checks Completed',
V_MESSAGE => 'Automated Checks Completed' );
EXCEPTION WHEN OTHERS THEN
SOURCE.DBA_SEND_MAIL(
V_FROM=>'Notification@Company.com;',
V_RECIPIENT => 'employee@company.com',
V_SUBJECT => 'Automated Checks Failed',
V_MESSAGE => 'Automated Checks Failed' );
RAISE;
END EXTRACT_AUTOMATED_CHECKS;
【问题讨论】:
我建议你不要这样做。在Oracle中,我们通常不会动态删除+创建表。创建一次,想用多少次就用多少次。 你的设计看起来很糟糕。我假设您正在寻找一个 GLOBAL TEMPORARY TABLE。创建一次并重复使用它。还有 15 个几乎相同的列看起来很糟糕。创建另一个表“REWARDS”,并引用表 PX_extract_checks 和列 VISIT、TRIGGER、WALLET 并将您的数据放入其中。如果您需要在列而不是行中显示数据,请使用PIVOT
子句。
"End"
用双引号括起来。也许您打算使用两个单引号 (''End''
)?
@WilliamRobertson 嘿,谢谢。现在可以了。我不知道我们不能使用“。非常感谢您的帮助。:)
缩进与编译器完全无关。但是请善待开发人员、您自己或其他人,并制定一致的缩进方案并始终使用它——即使它认为没有必要。此外,您的过程仅包含 DDL,因此不需要提交; Oracle 在执行每个 DDL 之前和之后都会自动提交。但是,您最好听听 Littlefoot 和 Wernfried Domscheit 的 cmets。
【参考方案1】:
CREATE TABLE
没有问题。
您在最后一次通话结束时错过了;
,以便在异常块中发送邮件。
SOURCE.DBA_SEND_MAIL(
V_FROM=>'Notification@Company.com;',
V_RECIPIENT => 'employee@company.com',
V_SUBJECT => 'Automated PX Checks Failed',
V_MESSAGE => 'Automated PX Checks Failed' ); <<-- this ; is missing
干杯!!
【讨论】:
您好,感谢您观看,我很抱歉没有看到它。但在我的实际程序中,我确实有 ; 请编辑问题并粘贴不起作用的实际代码。以上是关于在过程中创建表的主要内容,如果未能解决你的问题,请参考以下文章