Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 我可以在游标周围使用if语句还是在fetch中使用while循环_Sql_Oracle_Oracle Sqldeveloper - Fatal编程技术网

Sql 我可以在游标周围使用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

我在解决这个问题时遇到了问题

如果n<0,则显示错误消息“无效数字!”

如果n=0,则显示所有行(性别、等级、给定名称和 tbl_baby_name表中的_出现次数)。对输出进行排序 按性别升序,然后排名

如果n>0,则显示所有行(性别、等级、给定名称和 具有等级的次数(出现次数)≤ n在tbl_baby_name表中。 按性别按升序对输出进行排序,然后排名

如何仅显示小于用户输入数量的婴儿排名。我有所有婴儿的输出,但我只想要排名低于用户输入的婴儿

每当我尝试在光标周围放置if语句时,它都会给我一个错误。它也不允许我在fetch语句周围添加while循环

有人能帮忙吗

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语句之外,我在代码中没有看到其他地方提到它。