尝试在游标创建(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正在等待更多输入。在最后一个端点之后单独添加一行/。另一种可能是驱动循环的查询需要很长时间才能执行,但我认为在这种情况下有什么值得怀疑的。