sql - SQL命令意外结束错误,请提出建议?

标签 sql plsql compiler-errors

在下面的代码中,“t”后的最后一行出现“SQL命令意外结束”错误,请帮助我解决问题。

(SELECT NVL(TO_CHAR(j,'DD-Mon-YYYY'),'NIL')
 FROM
   (SELECT *
    FROM abc A
    WHERE A.j =
        (SELECT MAX(VALUE_DATE)
         FROM abc
         WHERE k = A.k
           AND j <=
             (SELECT TODAY
              FROM DATES
              WHERE B ='S'))
      AND k IN (:t))
WHERE k =A.l)EFF_DATE

最佳答案

好吧,您发布的查询似乎不完整。那个领先的开放式支架在做什么?
使用CTE(以使查询运行),看起来不错:

SQL> var t number
SQL> exec :t := 1;

PL/SQL procedure successfully completed.

SQL> WITH abc
  2       AS (SELECT SYSDATE j,
  3                  SYSDATE value_date,
  4                  1 k,
  5                  SYSDATE today,
  6                  'S' b
  7             FROM DUAL),
  8       dates AS (SELECT SYSDATE today, 'S' b FROM DUAL)
  9  SELECT NVL (TO_CHAR (j, 'DD-Mon-YYYY'), 'NIL')
 10    FROM (SELECT *
 11            FROM abc a
 12           WHERE     a.j = (SELECT MAX (value_date)
 13                              FROM abc
 14                             WHERE     k = a.k
 15                                   AND j <= (SELECT today
 16                                               FROM dates
 17                                              WHERE b = 'S'))
 18                 AND k IN ( :t));

NVL(TO_CHAR
-----------
19-Aug-2020

SQL>
如果您发布这样的内容将很有帮助-复制/粘贴SQL * Plus session ,这样我们就可以看到您所做的到底是什么,以及Oracle为何会这样做。

添加其他条件后,看来您发布的整个查询实际上是EFF_DATE列的源。如果是这样的话(再一次:您发布了不完整的代码;很难猜测您在做什么),那么您就不能那样使用它,因为A表在该位置超出范围:
SQL> WITH abc
  2       AS (SELECT SYSDATE j,
  3                  SYSDATE value_date,
  4                  1 k,
  5                  SYSDATE today,
  6                  'S' b,
  7                  1 l
  8             FROM DUAL),
  9       dates AS (SELECT SYSDATE today, 'S' b FROM DUAL)
 10  SELECT (SELECT NVL (TO_CHAR (j, 'DD-Mon-YYYY'), 'NIL')
 11            FROM (SELECT *
 12                    FROM abc A
 13                   WHERE     A.j = (SELECT MAX (VALUE_DATE)
 14                                      FROM abc
 15                                     WHERE     k = A.k
 16                                           AND j <= (SELECT TODAY
 17                                                       FROM DATES
 18                                                      WHERE B = 'S'))
 19                         AND k IN ( :t))
 20           WHERE k = A.l)
 21            EFF_DATE
 22    FROM DUAL;
         WHERE k = A.l)
                   *
ERROR at line 20:
ORA-00904: "A"."L": invalid identifier


SQL>
但是,如果重写为
 <snip>
 10  SELECT (SELECT NVL (TO_CHAR (j, 'DD-Mon-YYYY'), 'NIL')
 11            FROM (SELECT *
 12                    FROM abc A
 13                   WHERE     A.j = (SELECT MAX (VALUE_DATE)
 14                                      FROM abc
 15                                     WHERE     k = A.k
 16                                           AND j <= (SELECT TODAY
 17                                                       FROM DATES
 18                                                      WHERE B = 'S'))
 19                         AND k IN ( :t)
 20                         AND k = A.l))        --> this
 21            EFF_DATE
 22    FROM DUAL;

EFF_DATE
-----------
19-Aug-2020

SQL>
看看是否有帮助。如果不是,请发布适当的测试用例(CREATE TABLE和INSERT INTO示例数据),以及所需的输出和从输入到输出的规则。

关于sql - SQL命令意外结束错误,请提出建议?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63481900/

相关文章:

c++ - 为什么这个程序不起作用?

debugging - 调试curses.h应用程序? (AppCode)

sql - 如何测试SQL语句并保证其质量?

MySQL - 如何根据单列查找重复行?

sql - ORA-00917 在 sql 查询中转义撇号

oracle - 如何捕获 PL/SQL 代码中第一次提交在 Oracle 中发生的事件?

oracle - PL/SQL 和日期间隔

excel - 为什么 Excel 有时会产生 'incorrect' 错误消息?

mysql - 如果特定列存在字段,如何更新

sql - 如何使用嵌套关联查询 STI 驱动的模型?