在Oracle PL / SQL中的CREATE之后执行SELECT

时间:2015-08-10 08:10:11

标签: sql oracle plsql select-into

我是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;

我该如何解决这个问题??

3 个答案:

答案 0 :(得分:0)

您的第二个查询需要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;

请记得在l_someVariable部分

中声明DECLARE

答案 1 :(得分:0)

变化:

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;

答案 2 :(得分:0)

  

SELECT COALESCE((         SELECT LAST_LOG_ARCHIVE来自LAST_LOG_ARCHIVE WHERE ROWNUM = 1         ),TO_TIMESTAMP(' 2015-01-01 00:00:00',' YYYY-MM-DD HH24:MI:SS'))AS LAST_LOG_ARCHIVE来自dual;

PL / SQL SQL 不同。您必须使用 INTO 子句,因为没有INTO子句的SELECT语句在PL / SQL中会失败。基本上,选择一行并对其不采取任何行动是没有意义的。

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

SELECT col1, col2 INTO var1, var2 FROM table

使用选择列表中列的相应数据类型声明变量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')