在 Oracle PL/SQL 中创建后执行 SELECT

Excute SELECT after CREATE in Oracle PL/SQL

我是 Oracle PL/SQL 的新手,尽管我对 SQL 有很多经验。 目前我正在尝试将几个 T-SQL 语句转换为 PL/SQL。我正在尝试执行以下代码,但出现了一些错误。

如果table还不存在,那么错误是:Table或者视图不存在。 但是当我 运行 没有第二个 select 语句的查询时,它会创建 table。现在 table 存在,我尝试再次执行它,现在我收到以下错误:

An INTO clause is expected in this SELECT statement.

我使用的代码:

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;

我该如何解决这个...?

您的第二个查询需要 INTO 语句

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 
INTO l_someVariable 
FROM dual;

记得在 DECLARE 部分声明 l_someVariable

变化:

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;

收件人:

DECLARE
  V_LAST_LOG_ARCHIVE varchar2(100);
  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')) 
    INTO V_LAST_LOG_ARCHIVE 
    FROM dual;
END;

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;

PL/SQL 不同于 SQL。您必须使用 INTO 子句,因为没有 INTO 子句的 SELECT 语句将在 PL/SQL 中失败。基本上,连续 select 并且什么都不做是没有意义的。

如果您只想执行 select,那么请在 SQL 中执行,而不是在 PL/SQL 中执行。如果要将 select 返回的行中的相应值存储到局部变量中,请使用 INTO 子句。

SELECT col1, col2 INTO var1, var2 FROM table

使用 select 列表中列的相应 数据类型 声明变量 var1var2

从文档中阅读有关 SELECT INTO Statement 的更多信息。

此外,

TO_TIMESTAMP('2015-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'))

您可以简单地使用 TO_DATE 而不是 TO_TIMESTAMP。日期包含日期和时间元素。

TO_DATE('2015-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')