sql - 在 PL\SQL block 中使用 EXECUTE IMMEDIATE

标签 sql oracle plsql ddl dml

在 PL\SQL block 中使用 EXECUTE IMMEDIATE 使整个 block 立即提交。

begin 

INSERT INTO Customer ( GUID, STATUS, NAME) VALUES (1,1,'xx');

EXECUTE IMMEDIATE 'CREATE TABLE Shop
(
  GUID         NUMBER(16),
  STATUS       NUMBER(1),
  NAME         VARCHAR2(50 BYTE),
)
LOGGING 
NOCOMPRESS 
NOCACHE
NOPARALLEL
MONITORING';

DBMS_OUTPUT.PUT_LINE('DONE:'); 

EXCEPTION  -- exception handlers begin 
  WHEN OTHERS THEN  -- handles all other errors 
  DBMS_OUTPUT.PUT_LINE('Error occured, rollback...'); 

 ROLLBACK;
end; 

如您所知,我什至不使用 COMMIT。关于上面的代码,

“插入到”语句有效,但“创建表”语句抛出异常,因为数据库中已经存在同名表。

当我查看数据库时,我没有任何提交语句和代码块发生异常并回滚,我看到插入已经工作并且有一个新行。预计它不应该在那里,因为没有提交并且回滚也有效..

异常发生时如何回滚

最佳答案

您可以键入此 PL/SQL 代码:

begin 

EXECUTE IMMEDIATE 'CREATE TABLE Shop
(
     GUID         NUMBER(16),
     STATUS       NUMBER(1),
     NAME         VARCHAR2(50 BYTE),
)
LOGGING 
NOCOMPRESS 
NOCACHE
NOPARALLEL
MONITORING';
DBMS_OUTPUT.PUT_LINE('DONE:'); 

INSERT INTO Customer ( GUID, STATUS, NAME) VALUES (1,1,'xx');

EXCEPTION  -- exception handlers begin 
    WHEN OTHERS THEN  -- handles all other errors 
    DBMS_OUTPUT.PUT_LINE('Error occured, rollback...'); 

ROLLBACK;
end; 

所以首先它会创建表,如果发生异常它会回滚事务并且插入语句将不起作用。希望这对你有用..

关于sql - 在 PL\SQL block 中使用 EXECUTE IMMEDIATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23803601/

相关文章:

sql在使用order by时分配一个类别id

每种记录类型的 SQL Server 示例

sql - 使用查询插入,并添加默认值

oracle - 即使 PL/SQL 过程引发错误,仍可以写入 OUT 参数值吗?

Oracle:消除表和模式名称之间的歧义

sql - EF 5 + Azure + MigrationFirst 覆盖数据库名称。为什么?

c# - 您将如何在下拉列表中将特定国家/地区置于首位?

java - 如何将oracle数据库中的值汇总到java中?

sql - Oracle显示所有工资高于部门平均水平的员工

sql - 我们如何从 sql 脚本调用 c 函数