【发布时间】:2015-11-02 01:48:34
【问题描述】:
我是 Oracle PL/SQL 的新手,虽然我对 SQL 有很多经验。 目前我正在尝试将几个 T-SQL 语句转换为 PL/SQL。我正在尝试执行以下代码,但出现了一些错误。
如果表还不存在,则错误为:表或视图不存在。 但是当我在没有第二个 select 语句的情况下运行查询时,它会创建表。现在该表存在,我尝试再次执行它,现在我收到以下错误:
在这个 SELECT 语句中需要一个 INTO 子句。
我正在使用的代码:
DECLARE
cnt NUMBER;
stmt VARCHAR2(1000) := 'CREATE TABLE LAST_LOG_ARCHIVE (LAST_LOG_ARCHIVE TIMESTAMP NULL)';
BEGIN
SELECT COUNT(*) INTO cnt FROM all_tables WHERE table_name = 'LAST_LOG_ARCHIVE';
IF (cnt = 0) THEN
EXECUTE IMMEDIATE stmt;
END IF;
SELECT COALESCE((
SELECT LAST_LOG_ARCHIVE FROM LAST_LOG_ARCHIVE WHERE ROWNUM = 1
), TO_TIMESTAMP('2015-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) AS LAST_LOG_ARCHIVE FROM dual;
END;
我该如何解决这个问题...?
【问题讨论】:
-
嗯,是的,您的第二个选择正在返回一个值,而您没有对它做任何事情。您想对重新调整的 LAST_LOG_ARCHIVE 做什么?只需执行与“select count(*) into”相同的操作,您的代码就可以工作,然后您可以决定如何处理该值。
-
Coalesce 函数首先返回非空值,因此为了在 oracle 中保存该值,我们需要一个变量,如 select coalesce(var1,var2) into var3 from table _name。现在 var3 包含 var1 或 var2。
-
当表不存在时,预编译器会看到您在第二次选择中引用了一个在编译时不存在的对象 (LAST_LOG_ARCHIVE)
-
@Robert:我明白这一点。因此,我尝试检查表是否存在,如果不存在则创建它。
-
@user2782991 如果表不存在,PL/SQL 编译器看不到您将创建该表。在编译时,您引用的表不存在并且总是会返回编译器错误。如果你想这样做,你也必须将选择转换为动态 sql。
标签: sql oracle plsql select-into