3

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

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

4

3 回答 3

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_someVariableDECLARE节中声明

于 2015-08-10T08:14:36.137 回答
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;
于 2015-08-10T08:17:50.367 回答
0

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')) 作为 LAST_LOG_ARCHIVE FROM dual;

PL/SQL与SQL不同。您必须使用INTO子句,因为没有 INTO 子句的 SELECT 语句在 PL/SQL 中会失败。基本上,选择一行而不做任何事情是没有意义的。

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

SELECT col1, col2 INTO var1, var2 FROM table

声明变量var1和选择列表中列的var2相应数据类型。

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

还,

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

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

TO_DATE('2015-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
于 2015-08-10T08:19:00.347 回答