2015-04-19 39 views
0

我试图创建一个块,它接受来自提示的输入并使用该输入来过滤游标的结果集。请记住,我是新手,所以我可能会犯一个常规错误,并感谢您的帮助。我目前的代码如下。试图在游标创建(PL/SQL)中使用where语句

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语句引起我的错误,所以我在想,我可能不得不让光标收集的所有数据并显示,当然后过滤,但我不知道如果我甚至可以这样做。

我一直在线路接收ERROR 9错误: - ORA-06550:第9行,第1列: PLS-00103:出现符号 “WHERE” 在需要下列之一时: 开始功能编译程序亚型键入 当前光标删除 之前存在

回答

0

我不确切地知道Oracle为什么会报告WHERE的错误。有时解析器会因语法错误而感到困惑,并且不会指出真正的问题。在游标定义之前你有几个语法错误。

ACCEPT是一个SQLPlus命令,而不是PL/SQL语句。将您的ACCEPT行移动到DECLARE以上。

此外,您的变量声明和初始化不正确。该任务应该是宣言行的一部分;您需要提供CHAR数据类型的长度;并且替代值应该在引号中被视为字符串。你行的有效版本是:

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

对不起,“接受提示”请输入日期,例如格式 - 01或30“部分代码,放在我的初始代码的声明部分之前。为了让代码运行,我只是搞了一些东西。 我已经尝试了建议的解决方案,但我运行到哪里脚本输入提示的变量(DATEV) 截图之后挂一个问题 - http://i.imgur.com/kFCsV5Z.jpg –

+0

您发布代码在PL/SQL块之后没有斜线,这是实际执行它所需的。所以可能只是SQLPlus正在等待更多的输入。在最后的'END;'后面自行添加'/'。另一种可能性就是查询驱动循环需要很长时间才能执行,但我认为在这种情况下这是值得怀疑的。 –

0

看来,问题是,围绕‘DD’单引号不是单引号。它看起来像代码是在一个编辑器中创建的,它将撇号转变为那些特殊的“看起来像单引号但不是真正的”字符。将原始版本的WHERE子句替换为以下内容:

WHERE TO_CHAR(Arrival_Date, 'DD') = datev; 

我怀疑你会没事的。

并让自己一个很好的代码编辑器。 :-)

分享和享受。

0

我跑了与上面相同的查询,并得到了很好的结果。 你有几个语法以及我在你的查询中纠正的逻辑错误。语法错误是 -

datev char 
datev := &a; 

你不能在PL/SQL中做这样的初始化。你可能要完成它在一个单行像下面 -

datev char := &a; 

逻辑错误(S)是 -

  1. 为什么使用CHAR变量来存储数据,当您知道返回的值是NUMBER。
  2. 你期望1-31的数字;那你为什么选择char的默认大小为1。如果你提供一个2位数的数字,它会失败
  3. 即使你将CHAR的大小增加到CHAR(2),当用户输入一个数字如1或01时,你也不会得到结果,因为为了明智的比较, '1'!='1'(由于char(2),最后标出额外的空格);也'1'!='01'。 上面的唯一解决方案是使用NUMBER数据类型。

现在,我发布与查询类似的查询,并更改列名和表名。请用您的必需名称替换,并尝试使用PL/SQL块 - (注意不要执行ACCEPT ....)。它应该先在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; 
/