10

emp_id特定のものが存在するかどうかをチェックするPL/SQLの関数があります。

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 returns more than requested number of rows

4

2 に答える 2

15

dbms_output.put_lineブール引数を受け入れるようにオーバーロードされていません。次のようなことができます

dbms_output.put_line( case when exist = true 
                           then 'true'
                           else 'false'
                        end );

ブール値を に渡すことができる文字列に変換しますdbms_output

ORA-01422 エラーは、まったく別の問題です。関数には次のステートメントcheckEmpNoが含まれますSELECT INTO

SELECT emp_id 
  INTO emp_number
  FROM emp;

SELECT INTOクエリが 1 行以外を返す場合、Aはエラーを生成します。この場合、empテーブルに複数の行があると、エラーが発生します。私の推測では、関数に次のようなことをさせたいと思うでしょう

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;
于 2012-11-26T07:00:23.093 に答える
9

または、Oracle 関数diutil.bool_to_intを使用してブール値を整数に変換することもできます: True -> 1、False -> 0。

dbms_output.put_line(diutil.bool_to_int(p_your_boolean));
于 2012-11-26T07:20:06.047 に答える