Sql SELECT中某个函数的布尔返回值

Sql SELECT中某个函数的布尔返回值,sql,oracle,plsql,boolean,plsql-package,Sql,Oracle,Plsql,Boolean,Plsql Package,我正在用PL/SQL编写一个包 这是我的规格: TYPE outrec IS RECORD( tw_m_id NUMBER, tw_m_dealer_id NUMBER, tw_number NUMBER, check_uid NUMBER); TYPE outrecset IS TABLE

我正在用PL/SQL编写一个包

这是我的规格:

TYPE outrec IS RECORD(
    tw_m_id                         NUMBER,
    tw_m_dealer_id                  NUMBER,
    tw_number                       NUMBER,
    check_uid                       NUMBER);
  TYPE outrecset IS TABLE OF outrec;

  FUNCTION report
  (
    p_watermark           IN NUMBER,
    p_param               IN NUMBER,
    p_index               IN NUMBER
  ) RETURN outrecset
    PIPELINED;
这是我的身体:

FUNCTION func
  (
    p_watermark           => p_watermark,
    p_param               => p_param,
    p_index               => p_index
  )
  
   RETURN outrecset
    PIPELINED IS
    temp outrec;
  
  BEGIN
    before_report(p_watermark           => p_watermark,
                  p_param               => p_param,
                  p_index               => p_index);
  
    FOR c_rec IN (SELECT tw_m_id,
                         tw_m_dealer_id,
                         tw_number,
                         package_name.somefunction(tw_number) AS check_uid

                    FROM table1
                    JOIN table2 rk ON id1 = rk.id2
                    WHERE 1 = 1
                    AND id1 = rk.id2
                    AND id1 = p_param)
    
    LOOP
      temp.tw_m_tw_rechnungskopf_id       := c_rec.tw_m_tw_rechnungskopf_id;
      temp.tw_m_haendler_id_rechnung      := c_rec.tw_m_haendler_id_rechnung;
      temp.check_uid                      := c_rec.check_uid;
      PIPE ROW(temp);
    END LOOP;
  END;
我正在尝试从包名中获取值。somefunctiontw\u number作为check\u uid。问题是somefunction返回布尔值。 当我将check_uid设置为BOOLEAN时,我得到错误:PLS-00382:表达式的类型错误,因为SQL当然不支持BOOLEAN。我试过:

CASE 
WHEN package_name.somefunction(tw_number) THEN true 
else false
END as check_uid
在SELECT中,我得到错误:PL/SQL:ORA-00920:无效的关系运算符

有人能告诉我如何做到这一点吗?PL/SQL不是我的强项:

编辑:对于示例varchar2,我无法更改somefunction以返回它需要保持原样
通常,您会在包中创建一个重载函数,该函数返回1/0或Y/N。但由于您无权访问该包,因此可以在sql查询中使用内联函数来完成此操作

create or replace function func (parameter_i VARCHAR2) RETURN BOOLEAN
AS
BEGIN
  return true;
END;
/

WITH
  FUNCTION func_yn(parameter_i VARCHAR2)
  RETURN NUMBER
  IS
    l_return_value BOOLEAN;
  BEGIN
    l_return_value :=func(parameter_i => parameter_i);
    RETURN CASE l_return_value WHEN TRUE THEN 1 WHEN FALSE THEN 0 END;
  END func_yn;
SELECT 
  func_yn('test')
FROM dual;

编写一个简单的包装函数,将PL/SQL布尔值转换为在SQL中有效的数字数据类型,该数据类型符合记录类型的要求,并且可以将函数调用移到SQL之外

在布尔返回数中创建函数映射 是 开始 返回案例真实性 如果为真,则为1 如果为FALSE,则为0 否则无效 终止 端点映射; / 因此,您的规格是:

创建包\u名称为 类型outrec是记录 tw_m_id号, tw_m_经销商识别号, tw_编号, 检查uid号码 ; 类型outrecset是outrec的表格; -注意:这可能在另一个包装中,但在这里是为了方便。 数字返回布尔值中的函数somefunctionvalue; 功能报告 p_水印的数字, p_参数的数量, p_指数 回流出口管道化; 终止 / 相应的机构将是:

创建包体包_名称为 数字返回布尔值中的函数somefunctionvalue 是 开始 返回TRUE; 终止 报告前的程序 p_水印的数字, p_参数的数量, p_指数 是 开始 无效的 终止 功能报告 p_水印的数字, p_参数的数量, p_指数 返回输出流水线 是 温度输出; 开始 报告前 p_水印=>p_水印, p_参数=>p_参数, p_指数=>p_指数 ; 对于c_rec IN 选择tw_m_id, tw_m_经销商id, tw_编号 来自表1 在id1上连接表2 rk=rk.id2 其中id1=p_参数 环 temp.tw_m_id:=c_rec.tw_m_id; temp.tw_m_dealer_id:=c_rec.tw_m_dealer_id; temp.check\u uid:=映射布尔值 软件包\u NAME.SOMEFUNCTION c\u rec.tw\u编号 ; 管道温度; 端环; 终止 终止 / 注意:您还需要更新游标循环,因为您选择的值与记录的字段不匹配


DBFIDLE

非常感谢这解决了我的问题:D