SQL-在游标循环中选择一个值

SQL-在游标循环中选择一个值,sql,oracle,loops,Sql,Oracle,Loops,我想在循环结束时选择结果值。我正在简化原始问题的代码。状态可能为1或0。此循环用于检查我的SELECT UNIQUE查询结果中是否存在任何“1”。如果“是”,则函数的结果必须始终为1(或TRUE) DECLARE CURSOR status_cursor is(SELECT UNIQUE status FROM src_table st, bucket_table bt, many_table mt

我想在循环结束时选择结果值。我正在简化原始问题的代码。状态可能为1或0。此循环用于检查我的SELECT UNIQUE查询结果中是否存在任何“1”。如果“是”,则函数的结果必须始终为1(或TRUE)

DECLARE 
    CURSOR status_cursor is(SELECT UNIQUE status
                            FROM    src_table st, bucket_table bt, many_table mt
                            WHERE   st.id = bt.st_id
                            AND    bt.mt_id = mt.id);
    result BOOLEAN := FALSE;
BEGIN
    FOR vals IN status_cursor
    LOOP
        IF vals.status = 1 THEN result := TRUE;
        END IF;
    END LOOP;
    SELECT result FROM DUAL; <-- this line does not work see error msg. 
END;
请看这个

“…无法将布尔值传递给DBMS_OUTPUT.PUT或DBMS_OUTPUT.PUTLINE子程序。若要打印布尔值,请使用IF或CASE语句将其转换为字符值

因为SQL没有与布尔值等效的数据类型,所以不能:

  • 为数据库表列指定布尔值
  • 选择或获取数据库表列的值到布尔变量中
  • 在SQL语句、SQL函数或从SQL语句调用的PL/SQL函数中使用布尔值
……”

我不理解这个过程,但这可能会有用,在这种情况下,您不应该使用光标

SELECT UNIQUE COUNT(status) INTO result
FROM    src_table st, bucket_table bt, many_table mt
WHERE   st.id = bt.st_id AND    bt.mt_id = mt.id
AND status = 1

/*
    IF result > 0 
    THEN 'true'
    ELSE 'false'
*/
您可以使用:

dbms_output.put_line(CASE result WHEN TRUE THEN 'TRUE' WHEN FALSE THEN 'FALSE' END);

您希望最后一个select做什么?结果应该去哪里?这是在一个过程中,一个函数,还是在其他地方?这最终会成为一个函数。但同时,我需要将其作为一个简单的查询(过程)进行测试。我希望最后一次选择是我查询的结果。如果它是一个函数,那么您需要返回的是,而不是一个不会去任何地方的奇怪选择。如果不是,你需要选择一些东西——但是从dual中选择一个你已经知道的值是没有意义的——这只是一个昂贵的禁止操作。太棒了!那么,作为一个程序,我的解决方案是什么?我会努力使它作为一个函数工作。但如果没有函数,是否有可能得到“result”的值?“选择某样东西”,它是如何工作的?你所说的“得到结果”是什么意思?你已经有了。如果要将其返回到某个对象,则需要一个函数。如果您想显示它,可以使用dbms_输出。您可能会丢失UNIQUE并添加一个“and rownum”
dbms_output.put_line(CASE result WHEN TRUE THEN 'TRUE' WHEN FALSE THEN 'FALSE' END);