Oracle 布尔值在PL/SQL中的使用

Oracle 布尔值在PL/SQL中的使用,oracle,plsql,Oracle,Plsql,我在PL/SQL中有一个函数,用于检查特定的emp\u id是否存在,即: CREATE OR REPLACE FUNCTION checkEmpNo(eno numeric) RETURN boolean IS emp_number number; BEGIN SELECT emp_id INTO emp_number FROM emp; IF eno=emp_number THEN return true; ELSE

我在PL/SQL中有一个函数,用于检查特定的
emp\u id
是否存在,即:

CREATE OR REPLACE FUNCTION checkEmpNo(eno numeric)
RETURN boolean IS
    emp_number number;
BEGIN
    SELECT emp_id INTO emp_number
    FROM emp;
    IF eno=emp_number
    THEN
        return true;
    ELSE
        return false;
    END IF;
END checkEmpNo;
函数编译成功,但当我尝试以以下方式运行它时:

DECLARE
    exist boolean;
BEGIN
    exist=checkEmpNo(1);
    dbms_output.put_line(exist);
END;
它返回错误:

ORA-06550: line 5, column 1:
PLS-00306: wrong number or types of arguments in call to 'PUT_LINE'
ORA-06550: line 5, column 1:
PL/SQL: Statement ignored

3. BEGIN
4. exist:=checkEmpNo(1);
5. dbms_output.put_line(exist);
6. END;
编辑:

我也试过:

DECLARE
    exist boolean:=true;
BEGIN
    if(exist=checkEmpNo(1))
    then
        dbms_output.put_line('true');
    else
        dbms_output.put_line('false');
    end if;
END;

它返回错误:
ORA-01422:exact-fetch返回的行数大于请求的行数

dbms\u输出。put\u line
不会重载以接受布尔参数。你可以这样做

dbms_output.put_line( case when exist = true 
                           then 'true'
                           else 'false'
                        end );
CREATE OR REPLACE FUNCTION checkEmpNo(p_eno number)
  RETURN boolean 
IS
  l_count number;
BEGIN
  SELECT count(*)
    INTO l_count
    FROM emp
   WHERE emp_id = p_eno;

  IF( l_count = 0 )
  THEN
    RETURN false;
  ELSE
    RETURN true;
  END IF;
END checkEmpNo;
将布尔值转换为字符串,然后将其传递给
dbms\u输出

ORA-01422错误是一个完全独立的问题。函数
checkEmpNo
包括
SELECT-INTO
语句

SELECT emp_id 
  INTO emp_number
  FROM emp;
如果查询返回除1行以外的任何内容,
SELECT INTO
将生成错误。在这种情况下,如果
emp
表中有多行,您将得到一个错误。我的猜测是,您希望函数执行以下操作

dbms_output.put_line( case when exist = true 
                           then 'true'
                           else 'false'
                        end );
CREATE OR REPLACE FUNCTION checkEmpNo(p_eno number)
  RETURN boolean 
IS
  l_count number;
BEGIN
  SELECT count(*)
    INTO l_count
    FROM emp
   WHERE emp_id = p_eno;

  IF( l_count = 0 )
  THEN
    RETURN false;
  ELSE
    RETURN true;
  END IF;
END checkEmpNo;

或者,您可以使用Oracle函数diutil.bool_to_int将布尔值转换为整数:True->1,False->0

dbms_output.put_line(diutil.bool_to_int(p_your_boolean));

在一般的编码说明中,您正在传入一个名为eno的参数,该参数应与emp_id等效。使用emp_id作为参数名,并在SQL语句中使用函数名时将其作为前缀(即emp_id=checkEmpNo.emp_id)'DIUTIL.BOOL_to_INT'在'sys'中声明。