【发布时间】:2016-02-11 06:27:38
【问题描述】:
我是 SQL Server 用户,我有一个使用 Oracle 的小项目要做,所以我试图了解 Oracle 的一些特殊性,我认为我需要一些帮助来更好地了解以下情况:
我想在创建临时表之前测试它是否存在,所以我在这里有这段代码:
DECLARE
table_count INTEGER;
var_sql VARCHAR2(1000) := 'create GLOBAL TEMPORARY table TEST (
hello varchar(1000) NOT NULL)';
BEGIN
SELECT COUNT(*) INTO table_count FROM all_tables WHERE table_name = 'TEST';
IF table_count = 0 THEN
EXECUTE IMMEDIATE var_sql;
END IF;
END;
它工作正常,所以在我执行一次之后,我在我的IF上添加了一个else语句:
ELSE
insert into test (hello) values ('hi');
再次执行,我的测试表中添加了一行。
好的,我的代码已经准备好并且可以工作了,所以我删除了临时表并尝试再次运行整个语句,但是当我这样做时,我得到了以下错误:
ORA-06550: line 11, column 19:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 11, column 7:
PL/SQL: SQL Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
然后我将我的 else 语句更改为这个,现在它又可以工作了:
ELSE
EXECUTE IMMEDIATE 'insert into test (hello) values (''hi'')';
我的问题是为什么单独运行我可以简单地使用插入而不是 EXECUTE IMMEDIATE 以及为什么我的 SELECT 语句在 BEGIN 之后仍然有效,而其他所有似乎都需要 EXECUTE IMMEDIATE 才能正常运行?
【问题讨论】:
-
this question 和其他的可能重复;在执行表创建之前,在编译时解析静态 SQL。但是不要在运行中创建 GTT,它应该是一个永久对象......这是一个您不应该直接从 SQL Server 传输到 Oracle 的区域。另请参阅this、this 和 this。
标签: oracle plsql oracle12c execute-immediate