我必须修改某些 Oracle 包。基本上我将提取功能并将其移动到 C。
他们为我提供了一些“测试”脚本,我应该能够运行这些脚本来测试我的更改不会破坏包的底层逻辑。但他们没有工作。
我还注意到他们在原始脚本中对一些值进行了硬编码,而我正在尝试使用变量。我从未使用过 Oracle,所以我很困惑。
在 Toad 中,我有一个沿着这些方向的脚本:
declare
myTestId VARCHAR(32);
begin
select '23423DSSF34SD234' into myTestId from dual;
--Here my drop for my_test_table1 and my_test_table2
drop table my_test_table1;
drop table my_test_table2;
--Here create table my_test_table1 and my_test_table2
--Here I have a bunch of inserts
--Here are some selects statements
end;
但是,当我运行脚本时,当它到达它不喜欢的“Drop”语句时它会失败。如何在我的脚本中执行 drop 语句?
我一直在阅读,似乎在 Oracle 中创建这样的临时表不是一个好主意吗?最好的方法是什么?
drop
, 以及create
,alter
等truncate
是一个DDL
(数据定义语言)语句。DDL
在 PL/SQL 块中是不允许的。您的脚本是一个 PL/SQL 块(它有begin
和end
,以及变量声明)。解决它的方法是使用
execute immediate
:请注意,
DDL
以这种方式在 PL/SQL 块中执行将隐式执行commit
. 任何错误(例如ORA-00942: table or view does not exist
)也会中止脚本执行,但有一些方法可以解决这个问题。例如,您可以先查询ALL_TABLES
数据字典 few 以检查该表是否存在,然后再尝试删除它。变量的使用是一个庞大的主题......如果你有一个具体的问题,你最好在网站上提出一个新问题。
就创建临时表而言,这与创建真正的临时表不同,后者在 Sybase 和 SQL Server 中经常使用——不用担心,您的方法适用于测试脚本。