尝试在游标创建(PL/SQL)中使用where语句

尝试在游标创建(PL/SQL)中使用where语句,sql,oracle,plsql,oracle11g,Sql,Oracle,Plsql,Oracle11g,我试图创建一个块,该块接受来自提示符的输入,并使用该输入过滤光标的结果集。请记住,我是这里的新手,所以我可能会犯一个非常常见的错误,谢谢你的帮助。我现在的代码如下 Set serveroutput on DECLARE ACCEPT a PROMPT “Please Enter a Date, eg. Format - 01 or 30" datev char datev := &a; CURSOR cur_day_cursor IS SELECT A

我试图创建一个块,该块接受来自提示符的输入,并使用该输入过滤光标的结果集。请记住,我是这里的新手,所以我可能会犯一个非常常见的错误,谢谢你的帮助。我现在的代码如下

Set serveroutput on

DECLARE
  ACCEPT a PROMPT  “Please Enter a Date,  eg. Format -  01 or 30"

  datev char
  datev := &a;

  CURSOR cur_day_cursor IS
    SELECT Arrival_Date Adate
      FROM FLIGHT
      WHERE TO_CHAR(Arrival_Date, ‘DD’) = datev;

  cur_day_cursor_var cur_day_cursor%ROWTYPE;
BEGIN
  OPEN Cur_day_cursor;

  LOOP
    Fetch Cur_day_cursor
      INTO cur_day_cursor_var;
    EXIT WHEN cur_day_cursor%NOTFOUND;

    DBMS_OUTPUT.PUT_LINE (cur_day_cursor_var.Adate);
  END LOOP;

  IF cur_day_cursor%ISOPEN THEN
    CLOSE cur_day_cursor;
  END IF;
END;
where语句导致了我的错误,所以我想我可能必须让光标收集所有数据,然后在显示时对其进行过滤,但我不确定我是否能够做到这一点

错误我一直在第9行收到错误:- ORA-06550:第9行第1列: PLS-00103:在预期以下情况时遇到符号: begin函数pragma过程子类型类型 当前光标删除
我不知道Oracle在何处报告错误的确切原因。有时解析器会被糟糕的语法弄糊涂,并没有指出真正的问题所在。在游标定义之前,您有几个语法错误

ACCEPT是一个SQLPlus命令,而不是PL/SQL语句。将接受行移到声明上方

此外,变量声明和初始化也不正确。任务应该是声明行的一部分;您需要提供CHAR数据类型的长度;替换值应该在引号中,以作为字符串处理。您的行的有效版本为:

datev  char(2) := '&a';

问题似乎在于'DD'周围的单引号不是单引号。看起来代码是在一个编辑器中创建的,该编辑器将撇号更改为特殊的单引号,但实际上不是字符。将WHERE子句的原始版本替换为以下内容:

WHERE TO_CHAR(Arrival_Date, 'DD') = datev;
我想你会没事的


给自己找一个好的代码编辑器:-

我运行了与上面相同的查询,结果非常好。 您几乎没有语法和逻辑错误,我在您的查询中更正了这些错误。语法错误为-

datev char
datev := &a;
在PL/SQL中不能进行这样的初始化。您可能需要在下面这样的一行中完成它-

datev char := &a;
逻辑错误是——

当您知道返回的值是NUMBER时,为什么要使用CHAR变量来存储数据。 你期望数字在1-31之间;那么为什么选择默认的字符大小为1呢。如果您提供一个两位数的数字,它将失败 即使将CHAR的大小增加到CHAR2,当用户输入像1或01这样的数字时,也不会得到结果,因为对于字符比较,“1”!=“1”1'由于字符2,在末尾标记额外的空间;还有“1”!='01'. 上面提到的唯一解决方案是使用数字数据类型。 现在我在这里发布我的查询,它与您的查询类似,更改了列名和表名。请替换为您所需的名称,然后重试- 注意不要执行ACCEPT。。。。使用PL/SQL块。它应该首先在SQL提示符中完成,然后运行另一个DECLARE部分

--ACCEPT a NUMBER PROMPT  'Please Enter a Date,  eg. Format -  01 or 30 :'
--Run the above line first in SQL Prompt and then execute the rest as whole
DECLARE
  datev NUMBER(2) := &a;
  CURSOR cur_day_cursor IS
    SELECT Ename, HireDate Adate
      FROM Emp
      WHERE TO_CHAR(HireDate, 'D') = datev;
  cur_day_cursor_var cur_day_cursor%ROWTYPE;
BEGIN
  OPEN Cur_day_cursor;
  LOOP
    Fetch Cur_day_cursor
      INTO cur_day_cursor_var;
    EXIT WHEN cur_day_cursor%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE (cur_day_cursor_var.Adate);
  END LOOP;
  IF cur_day_cursor%ISOPEN THEN
    CLOSE cur_day_cursor;
  END IF;
END;
/

对不起,我们接受提示“请输入日期,例如,在我的初始代码中,代码的Format-01或30部分放在Declare部分之前。我只是在尝试运行代码时弄乱了某些事情。我尝试了建议的解决方案,但遇到了一个问题,即在输入提示变量datev Scre后脚本立即挂起enshot-您发布的代码在PL/SQL块之后没有斜杠,而实际执行它需要斜杠。因此,可能是SQLPlus正在等待更多输入。在最后一个端点之后单独添加一行/。另一种可能是驱动循环的查询需要很长时间才能执行,但我认为在这种情况下有什么值得怀疑的。