Sql 我可以在游标周围使用if语句还是在fetch中使用while循环
我在解决这个问题时遇到了问题 如果n<0,则显示错误消息“无效数字!” 如果n=0,则显示所有行(性别、等级、给定名称和 tbl_baby_name表中的_出现次数)。对输出进行排序 按性别升序,然后排名 如果n>0,则显示所有行(性别、等级、给定名称和 具有等级的次数(出现次数)≤ n在tbl_baby_name表中。 按性别按升序对输出进行排序,然后排名 如何仅显示小于用户输入数量的婴儿排名。我有所有婴儿的输出,但我只想要排名低于用户输入的婴儿 每当我尝试在光标周围放置if语句时,它都会给我一个错误。它也不允许我在fetch语句周围添加while循环 有人能帮忙吗Sql 我可以在游标周围使用if语句还是在fetch中使用while循环,sql,oracle,oracle-sqldeveloper,Sql,Oracle,Oracle Sqldeveloper,我在解决这个问题时遇到了问题 如果n0,则显示所有行(性别、等级、给定名称和 具有等级的次数(出现次数)≤ n在tbl_baby_name表中。 按性别按升序对输出进行排序,然后排名 如何仅显示小于用户输入数量的婴儿排名。我有所有婴儿的输出,但我只想要排名低于用户输入的婴儿 每当我尝试在光标周围放置if语句时,它都会给我一个错误。它也不允许我在fetch语句周围添加while循环 有人能帮忙吗 ACCEPT p_1 PROMPT 'Enter a number :' DECLARE
ACCEPT p_1 PROMPT 'Enter a number :'
DECLARE
v_n NUMBER := &p_1;
v_baby_rank TBL_BABY_NAME.RANK%TYPE;
v_baby_sex VARCHAR(80);
v_baby_name TBL_BABY_NAME.GIVEN_NAME%TYPE;
v_baby_numoc TBL_BABY_NAME.NUMBER_OF_OCCURRENCES%TYPE;
CURSOR c_baby IS
SELECT rank, CASE sex WHEN 'M' THEN 'Male' ELSE 'Female' END, GIVEN_NAME, NUMBER_OF_OCCURRENCES
FROM TBL_BABY_NAME
ORDER BY sex,rank;
BEGIN
if v_n < 0 Then
DBMS_OUTPUT.PUT_LINE('Invalid Number');
Else
OPEN c_baby;
FETCH c_baby
INTO v_baby_rank, v_baby_sex, v_baby_name, v_baby_numoc;
DBMS_OUTPUT.PUT_LINE( RPAD('Sex',10) || RPAD('Rank',10) || RPAD('Given Name',15) || ('Number of Occurrences') );
DBMS_OUTPUT.PUT_LINE('===========================================================');
while c_baby%FOUND loop
DBMS_OUTPUT.PUT_LINE(RPAD(v_baby_sex, 10) || RPAD(v_baby_rank,10) || RPAD(v_baby_name,30) || v_baby_numoc);
FETCH c_baby
INTO v_baby_rank, v_baby_sex, v_baby_name, v_baby_numoc;
END LOOP;
CLOSE c_baby;
END IF;
END;
接受p_1提示“输入一个数字:”
声明
v_n编号:=&p_1;
v_baby_排名TBL_baby_姓名。排名%TYPE;
v_baby_sex VARCHAR(80);
v_baby_name TBL_baby_name.给定的_name%类型;
v_baby_numoc TBL_baby_名称。出现次数%类型;
光标c_婴儿是
选择等级,大小写性别,当“M”时,然后选择“男性”,否则选择“女性”,给出名称,出现次数
来自TBL_BABY_NAME
按性别、等级排序;
开始
如果v_n<0,则
DBMS_OUTPUT.PUT_行('无效数字');
其他的
打开c_宝贝;
去拿c_宝贝
分为v_baby_排名、v_baby_性别、v_baby_姓名、v_baby_numoc;
DBMS|u OUTPUT.PUT|u LINE(RPAD('Sex',10)| | | RPAD('Rank',10)| | | RPAD('Given Name',15)| |('Number of execents');
DBMS\u输出.输出线('=========================================================================================================================');
而c_baby%找到了循环
DBMS|u OUTPUT.PUT|u LINE(RPAD(v_baby_sex,10)| RPAD(v_baby_rank,10)| RPAD(v_baby_name,30)| v_baby_numoc);
去拿c_宝贝
分为v_baby_排名、v_baby_性别、v_baby_姓名、v_baby_numoc;
端环;
关闭c_婴儿;
如果结束;
结束;
“它只是不允许我在光标周围放置if语句。不会执行” 满足要求的最简单方法是:
while c_baby%FOUND loop
if v_n = 0
or c_baby.rank < v_n
then
DBMS_OUTPUT.PUT_LINE(RPAD(v_baby_sex, 10) || RPAD(v_baby_rank,10) || RPAD(v_baby_name,30) || v_baby_numoc);
end if;
FETCH c_baby
当c_baby%找到循环时
如果v_n=0
或c_baby.rank
它选择所有记录,但只显示与输入条件匹配的记录
如果性能是一个问题-不是你的家庭作业,而是现实生活中的问题-那么你可能希望选择一个过滤的结果集,而不是选择所有内容并丢弃不需要的行。在这种情况下,您将使用游标变量:
.....
c_baby sys_refcursor;
BEGIN
if v_n < 0 Then
DBMS_OUTPUT.PUT_LINE('Invalid Number');
Elsif v_n > 0 Then
OPEN c_baby for
SELECT rank, CASE sex WHEN 'M' THEN 'Male' ELSE 'Female' END, GIVEN_NAME, NUMBER_OF_OCCURRENCES
FROM TBL_BABY_NAME
where rank < v_n
ORDER BY sex,rank;
Else
OPEN c_baby for
SELECT rank, CASE sex WHEN 'M' THEN 'Male' ELSE 'Female' END, GIVEN_NAME, NUMBER_OF_OCCURRENCES
FROM TBL_BABY_NAME
ORDER BY sex,rank;
end if;
FETCH c_baby
INTO .... -- the rest of your posted code
。。。。。
c_婴儿系统参考光标;
开始
如果v_n<0,则
DBMS_OUTPUT.PUT_行('无效数字');
如果v_n>0,则
打开c_宝贝
选择等级,大小写性别,当“M”时,然后选择“男性”,否则选择“女性”,给出名称,出现次数
来自TBL_BABY_NAME
其中秩
使用游标变量允许我们将不同的结果集注入标准的处理集。使用动态SQL可以避免SELECT中重复的代码,但这可能超出了简要说明 用于哪个数据库服务器。这里列出了三个,它们都使用不同的语法。我的错。“它给了我一个错误”-这是什么?它只是不允许我在光标周围放置if语句。不执行几个问题:为什么有两个FETCH语句?他们似乎做了同样的事情。可以考虑使用一些方法来批量加载记录吗?输入参数的用途是什么?除了第一条IF语句之外,我在代码中没有看到其他地方提到它。