当前位置: 首页 > 知识库问答 >
问题:

使用未运行的变量的Oracle SQL

樊琦
2023-03-14

这可能是一个基本问题,但我对Oracle SQL还不熟悉。我正在尝试让下面的SQL在Oracle SQL Developer中执行。错误信息在代码下面。粘贴错误消息后,我修改了代码。第28行是代码中的最后一行,“结束第14行第1列提到“选择”一词。

DECLARE 
    v_StartDate Date := &StartDate;
    v_EndDate Date := &EndDate;

SET v_StartDate := CASE &StartDate
WHEN TO_DATE('01/01/1900','MM/DD/YYYY')
THEN LAST_DAY(ADD_MONTHS(trunc(current_date),-2))
ELSE TO_DATE(&StartDate - 1) END;
SET v_EndDate := CASE &StartDate
WHEN TO_DATE('01/01/1900','MM/DD/YYYY')
THEN LAST_DAY(ADD_MONTHS(&EndDate,-1))
ELSE TO_DATE(&EndDate + 1) END;

BEGIN
Select *
From
Table
Where date_value > v_StartDate
and date_value < v_EndDate
END;

错误报告-ORA-06550:第28行,第24列:PL/SQL:ORA-00933:SQL命令未正确结束ORA-06550:第14行,第1列:PL/SQL:SQL语句忽略ORA-06550:第28行,第27列: PLS-00103:当期望以下之一时遇到符号“文件结束”:

(begin case declare end exception exit for goto if loop mod null pragma raise return select update when with with

共有2个答案

柳仲卿
2023-03-14

很抱歉不得不这么说,但是你的代码“比早期的大都会游戏有更多的错误”。

关键字SET属于UPDATE语句的子句。您必须更新语句。如果您只想设置变量的值,语法简单

v_StartDate := some_value

您已经在声明部分中使用参数设置了v_StartDate的值,那么您现在想用它做什么呢?

关键字WHEN需要比较,但是您的用法

WHEN TO_DATE('01/01/1900','MM/DD/YYYY')
THEN LAST_DAY(ADD_MONTHS(trunc(current_date),-2))

不是将第一个词组(TO_DATE......)与任何东西进行比较。

您正在尝试trunc(current_date),但current_date没有定义--它不是关键字或保留字。也许你指的是sysdate

范嘉
2023-03-14

您的代码有几处错误。我建议您从一小段有效的代码开始,然后逐个添加语句。这将让你看到什么是错误的,并修复它。一旦积累了一组语法错误,就很难进行调试。

代码中有错误的注释:

DECLARE 
  v_StartDate Date := &StartDate;
  v_EndDate Date := &EndDate;
-- issues below:
-- 1. SET is not oracle syntax. To assign a variable, use the := operator 
--    without the SET word. 
-- 2. you cannot assign variables in the declaration section, unless you
--    declare and assign in the same statement. This part should go after
--    the BEGIN keyword 
-- 3. Why would you use the bind variable if you already assigned it  
--    above ??
SET v_StartDate := CASE &StartDate
WHEN TO_DATE('01/01/1900','MM/DD/YYYY')
THEN LAST_DAY(ADD_MONTHS(trunc(current_date),-2))
ELSE TO_DATE(&StartDate - 1) END;
SET v_EndDate := CASE &StartDate
WHEN TO_DATE('01/01/1900','MM/DD/YYYY')
THEN LAST_DAY(ADD_MONTHS(&EndDate,-1))
ELSE TO_DATE(&EndDate + 1) END;

BEGIN
-- issue below
-- you cannot just select in pl/sql, you need to SELECT INTO (if there is
-- a single row) or BULK COLLECT INTO (if you have multiple rows)
Select *
From
Table
Where date_value > v_StartDate
and date_value < v_EndDate
END;
 类似资料:
  • 我的变异查询: 查询变量: GraphQL模式(突变定义): 我尝试同时使用GraphiQL接口和apollo-client来发送带有变量的请求,但出现了相同的错误。有什么想法吗?

  • 如果我有: 很明显,这个表达式后面的应该是零,但我看到的任何地方,他们都说这个代码的行为是未定义的,而不仅仅是的值(直到减法之前)。 很明显,编译器可以简单地在变量中使用它认为“方便”的任何垃圾值,并且它将按照预期工作。这种方法有什么问题?

  •  KAG 中所谓的变量其实就是、 记录某些数据的东西  而已。  但是呢、KAG 因为是基于 TJS2 这一脚本语言的系统、KAG 的变量实际上继承了 TJS2 变量的功能,可以发挥很强大的作用。(译注:口胡,给我一个能保存的数据类再说……)  这个初级教程只讲了些基本的用法、像 KAG 内部的方法、属性之类的操作、使用吉里吉里本体功能之类的没有详细说、完全是一片泥沼的状态、容易掉坑的请注意(笑)

  • 问题内容: 在shell脚本中,我设置了JAVA_OPTS环境变量(以启用远程调试并增加内存),然后按如下所示执行jar文件: 但是似乎JAVA_OPTS env变量没有任何作用,因为我无法连接到远程调试,并且我发现JVM的内存没有变化。 可能是什么问题呢? PS:我无法在命令中使用这些设置,因为我在应用程序中处理命令行参数。 问题答案: 我不知道任何JVM实际检查环境变量。通常,这在启动JVM的

  • 我将环境变量设置为。 在这个目录下,我有一个名为bin的文件夹,它包含一个脚本。如何使用system变量从PowerShell中的任何地方运行此脚本? 我尝试过以下方法,但没有成功:

  • 问题内容: Java中有没有办法反映局部变量的通用类型?我知道您可以通过一个字段来解决这个问题- 获取泛型类型的java.util.List。任何想法如何解决,例如: 或更笼统: 问题答案: 这是一个很好的教程,显示了如何以及何时可以使用反射读取泛型。例如从firs 方法获取String 您可以使用此代码 输出: parameterArgClass =类java.lang.String 可能是因为